Apakah itu "melakukan satu hal pada satu waktu"?
Komentar ini terdengar seperti pertanyaan tentang prinsip desain umum. Seringkali, pertanyaan tentang ini sangat subyektif, dan kami tidak dapat menulis jawaban yang tepat. Berhati-hatilah karena kami dapat menutup pertanyaan dalam kasus ini.
Terkadang kami memiliki penjelasan untuk pilihan desain asli, karena pengembang telah menulis tentangnya. Tapi saya tidak punya jawaban yang bagus untuk pertanyaan ini.
Kenapa cp
didesain seperti ini?
Masalahnya adalah Unix berusia lebih dari 40 tahun.
Jika Anda membuat sistem baru sekarang, Anda mungkin membuat pilihan desain yang berbeda. Tetapi mengubah Unix akan merusak skrip yang ada, seperti yang disebutkan dalam jawaban lain.
Mengapa itu cp
dirancang untuk file diam-diam menimpa yang ada?
Jawaban singkatnya adalah "Saya tidak tahu" :-).
Pahami itu cp
hanya satu masalah. Saya pikir tidak ada program komando asli yang dilindungi dari menimpa atau menghapus file. Shell memiliki masalah serupa saat mengarahkan output:
$ cat first.html > second.html
Perintah ini juga secara diam-diam menimpa second.html
.
Saya tertarik untuk memikirkan bagaimana semua program ini dapat dirancang ulang. Mungkin membutuhkan beberapa kompleksitas tambahan.
Saya pikir ini adalah bagian dari penjelasan: Unix awal menekankan implementasi sederhana . Untuk penjelasan lebih rinci tentang ini, lihat "lebih buruk lebih baik", terkait di akhir jawaban ini.
Anda bisa mengubahnya > second.html
sehingga berhenti dengan kesalahan, jika second.html
sudah ada. Namun seperti yang kami sebutkan, terkadang pengguna memang ingin mengganti file yang ada. Misalnya, dia mungkin membangun perintah yang rumit, mencoba beberapa kali hingga melakukan apa yang diinginkannya.
Pengguna bisa berjalan rm second.html
dulu jika perlu. Ini mungkin kompromi yang bagus! Ini memiliki beberapa kemungkinan kelemahannya sendiri.
- Pengguna harus mengetikkan nama file dua kali.
- Orang-orang juga mengalami banyak kesulitan dalam menggunakan
rm
. Jadi saya ingin membuat rm
lebih aman juga. Tapi bagaimana caranya? Jika kita rm
menunjukkan setiap nama file dan meminta pengguna untuk mengonfirmasi, dia sekarang harus menulis tiga baris perintah, bukan satu. Juga, jika dia harus melakukan ini terlalu sering, dia akan terbiasa dan mengetik "y" untuk mengonfirmasi tanpa berpikir. Jadi itu bisa sangat menjengkelkan, dan itu masih bisa berbahaya.
Pada sistem modern, saya sarankan untuk menginstal trash
perintah , dan menggunakannya bukan rm
jika memungkinkan. Pengenalan penyimpanan Sampah adalah ide bagus misalnya untuk PC grafis pengguna tunggal .
Saya pikir juga penting untuk memahami keterbatasan perangkat keras Unix yang asli - RAM terbatas dan ruang disk, output yang ditampilkan pada printer lambat serta sistem dan perangkat lunak pengembangan.
Perhatikan bahwa Unix asli tidak memiliki penyelesaian tab , untuk dengan cepat mengisi nama file untuk suatu rm
perintah. (Juga, shell Bourne asli tidak memiliki riwayat perintah, misalnya seperti ketika Anda menggunakan tombol panah Atas bash
).
Dengan output printer, Anda akan menggunakan editor berbasis baris ed
,. Ini lebih sulit dipelajari daripada editor teks visual. Anda harus mencetak beberapa baris saat ini, memutuskan bagaimana Anda ingin mengubahnya, dan mengetik perintah edit.
Menggunakannya > second.html
sedikit seperti menggunakan perintah dalam editor baris. Efeknya tergantung pada kondisi saat ini. (Jika second.html
sudah ada, isinya akan dibuang). Jika pengguna tidak yakin tentang keadaan saat ini, ia diharapkan untuk menjalankan ls
atau yang ls second.html
pertama.
"Implementasi sederhana" sebagai prinsip desain
Ada interpretasi populer dari desain Unix, yang dimulai:
Desainnya harus sederhana, baik dalam implementasi dan antarmuka. Lebih penting agar implementasinya lebih sederhana daripada antarmuka. Kesederhanaan adalah pertimbangan terpenting dalam suatu desain.
...
Gabriel berpendapat bahwa "Lebih buruk lebih baik" menghasilkan perangkat lunak yang lebih sukses daripada pendekatan MIT: Selama program awal pada dasarnya baik, akan membutuhkan waktu dan upaya yang lebih sedikit untuk diterapkan pada awalnya dan akan lebih mudah untuk beradaptasi dengan situasi baru. Porting perangkat lunak ke mesin baru, misalnya, menjadi jauh lebih mudah dengan cara ini. Dengan demikian penggunaannya akan menyebar dengan cepat, jauh sebelum program [yang lebih baik] memiliki kesempatan untuk dikembangkan dan digunakan (keuntungan penggerak pertama).
https://en.wikipedia.org/wiki/Worse_is_better