[Penafian: pertanyaan ini subjektif, tapi saya lebih suka mendapatkan jawaban yang didukung oleh fakta dan / atau refleksi]
Saya pikir semua orang tahu tentang Prinsip Robustness , biasanya disimpulkan oleh Hukum Postel:
Bersikaplah konservatif dalam apa yang Anda kirim; menjadi liberal dalam apa yang Anda terima.
Saya setuju bahwa untuk desain protokol komunikasi yang luas ini mungkin masuk akal (dengan tujuan memungkinkan ekstensi mudah), namun saya selalu berpikir bahwa penerapannya pada HTML / CSS adalah kegagalan total, setiap browser menerapkan tweak diam sendiri deteksi / perilaku, membuatnya hampir tidak mungkin untuk mendapatkan rendering yang konsisten di beberapa browser.
Saya perhatikan bahwa ada RFC protokol TCP yang dianggap "Kegagalan Diam" dapat diterima kecuali ditentukan lain ... yang merupakan perilaku yang menarik, untuk sedikitnya.
Ada contoh lain dari penerapan prinsip ini di seluruh perdagangan perangkat lunak yang secara teratur muncul karena mereka telah menggigit pengembang, dari atas kepala saya:
- Penyisipan semi-kolon Javascript
- C (diam) konversi bawaan (yang tidak akan terlalu buruk jika tidak terpotong ...)
dan ada alat untuk membantu menerapkan perilaku "pintar":
- algoritma pencocokan nama fonetik ( Metafon Ganda )
- algoritma jarak string ( Levenshtein distance )
Namun saya menemukan bahwa pendekatan ini, walaupun mungkin bermanfaat ketika berhadapan dengan pengguna non-teknis atau untuk membantu pengguna dalam proses pemulihan kesalahan, memiliki beberapa kelemahan ketika diterapkan pada desain antarmuka perpustakaan / kelas:
- agak subyektif apakah algoritme menebak "benar", dan karena itu mungkin bertentangan dengan Prinsip Ketertinggalan Terkecil
- itu membuat implementasi lebih sulit, sehingga lebih banyak peluang untuk memperkenalkan bug (pelanggaran YAGNI ?)
- itu membuat perilaku lebih rentan terhadap perubahan, karena setiap modifikasi dari rutinitas "tebak" dapat merusak program lama, hampir tidak termasuk kemungkinan refactoring ... sejak awal!
Dan inilah yang membawa saya ke pertanyaan berikut:
Saat mendesain antarmuka (perpustakaan, kelas, pesan), apakah Anda condong ke arah prinsip kekokohan atau tidak?
Saya sendiri cenderung cukup ketat, menggunakan validasi input yang luas pada antarmuka saya, dan saya bertanya-tanya apakah saya mungkin terlalu ketat.
Jawaban:
Saya akan mengatakan ketahanan ketika itu tidak menimbulkan ambiguitas .
Misalnya: Saat menguraikan daftar yang dipisahkan koma, ada atau tidaknya spasi sebelum / sesudah koma tidak mengubah makna semantik.
Saat mem-parsing string guide, ia harus menerima sejumlah format umum (dengan atau tanpa tanda hubung, dengan atau tanpa kurung kurawal di sekitarnya).
Sebagian besar bahasa pemrograman kuat dengan penggunaan ruang putih. Khususnya di mana saja yang tidak memengaruhi arti kode. Bahkan di Python di mana spasi putih relevan, itu masih fleksibel ketika Anda berada di dalam daftar atau deklarasi kamus.
Saya benar-benar setuju bahwa jika sesuatu dapat diartikan dengan berbagai cara atau jika tidak 100% jelas apa yang dimaksud maka terlalu banyak ketahanan dapat berakhir menjadi rasa sakit, tetapi ada banyak ruang untuk ketahanan tanpa menjadi ambigu.
sumber
{"key": "value",}
valid, IE tidak. Saya sering menemukan masalah khusus ini sampai saya meningkatkan proses pembangunan saya dengan JSlint.Tentu saja tidak. Teknik seperti pemrograman defensif mengaburkan bug, membuat penampilan mereka lebih kecil kemungkinannya dan lebih acak yang membuat deteksi mereka lebih sulit yang membuat mengisolasi mereka lebih sulit.
Writing Solid Code yang jauh di bawah rata-rata luar biasa dalam berulang kali menekankan perlunya, dan teknik, membuat bug sebagai sulit untuk diperkenalkan atau disembunyikan. Melalui penerapan prinsip-prinsipnya seperti, "Menghilangkan perilaku acak. Memaksa serangga untuk direproduksi." dan, "Selalu mencari, dan menghilangkan, cacat pada antarmuka Anda." pengembang akan sangat meningkatkan kualitas perangkat lunak mereka dengan menghilangkan ambiguitas dan efek samping yang tidak terkendali yang bertanggung jawab atas sejumlah besar bug.
sumber
Penerapan Robustness yang berlebihan menyebabkan Anda menebak apa yang diinginkan pengguna, yang baik-baik saja sampai Anda salah. Ini juga membutuhkan keyakinan yang sepenuhnya salah arah bahwa pelanggan Anda tidak akan menyalahgunakan kepercayaan Anda dan menciptakan omong kosong acak yang kebetulan bekerja, tetapi Anda tidak akan dapat mendukung dalam versi 2.
Penerapan Berlebihan yang berlebihan menyebabkan Anda menyangkal pelanggan Anda memiliki hak untuk membuat kesalahan kecil, yang baik-baik saja sampai mereka mengeluh bahwa barang-barang mereka berfungsi dengan baik pada produk pesaing Anda, dan memberi tahu Anda apa yang dapat Anda lakukan dengan standar 5.000 halaman Anda yang memiliki kata. "DRAFT" masih tertulis di sampul dalam krayon, dan setidaknya 3 ahli mengklaim secara mendasar cacat, dan 200 ahli yang lebih jujur mengatakan mereka tidak sepenuhnya mengerti.
Solusi pribadi saya selalu usang. Anda mendukung mereka, tetapi memberi tahu mereka bahwa mereka melakukan kesalahan, dan (jika mungkin) jalan termudah menuju kebenaran. Dengan begitu, ketika Anda mematikan fitur bug 10 tahun ke depan, Anda setidaknya memiliki jejak kertas untuk menyatakan bahwa "kami memperingatkan Anda bahwa ini mungkin terjadi."
sumber
Sayangnya apa yang disebut "prinsip ketahanan" tidak mengarah pada ketahanan. Ambil HTML sebagai contoh. Banyak masalah, air mata, buang-buang waktu dan energi bisa dihindari jika browser telah benar-benar mem-parsing HTML dari awal alih-alih mencoba menebak arti konten yang cacat.
Browser seharusnya hanya menampilkan pesan kesalahan daripada mencoba memperbaikinya di bawah selimut. Itu akan memaksa semua bunglers untuk memperbaiki kekacauan mereka.
sumber
Saya membagi antarmuka menjadi beberapa grup (tambahkan lebih banyak jika Anda suka):
Keluaran harus selalu ketat.
sumber
Saya pikir HTML dan World Wide Web telah memberikan uji skala dunia nyata dari Prinsip Robustness dan menunjukkannya sebagai kegagalan besar. Ini secara langsung bertanggung jawab atas kekacauan membingungkan dari hampir-standar HTML bersaing yang membuat hidup sengsara bagi pengembang Web (dan pengguna mereka) dan menjadi lebih buruk dengan setiap rilis Internet Explorer baru.
Kami sudah tahu sejak 1950-an cara memvalidasi kode dengan benar. Jalankan melalui parser ketat dan jika ada sesuatu yang tidak benar secara sintaksis, lemparkan kesalahan dan batalkan. Jangan lulus pergi, jangan mengumpulkan $ 200, dan untuk cinta semua yang biner jangan biarkan beberapa program komputer mencoba membaca pikiran pembuat kode jika ia membuat kesalahan!
HTML dan JavaScript telah menunjukkan kepada kita apa yang terjadi ketika prinsip-prinsip itu diabaikan. Tindakan terbaik adalah belajar dari kesalahan mereka dan tidak mengulanginya.
sumber
Sebagai tandingan dengan contoh Mason, pengalaman saya dengan Protokol Inisiasi Sesi adalah bahwa sementara tumpukan yang berbeda akan menafsirkan RFC yang relevan secara berbeda (dan saya menduga ini terjadi dengan setiap standar yang pernah ditulis), menjadi (cukup) liberal dalam apa yang Anda terima berarti Anda sebenarnya dapat membuat panggilan antara dua perangkat. Karena perangkat ini adalah hal-hal fisik biasa yang bertentangan dengan perangkat lunak pada desktop, Anda hanya harus liberal dalam apa yang Anda terima, atau ponsel Anda tidak dapat memanggil telepon lain dari merek tertentu. Itu tidak membuat ponsel Anda terlihat bagus!
Tetapi jika Anda menulis perpustakaan, Anda mungkin tidak memiliki masalah banyak pihak yang menafsirkan standar umum dengan cara yang tidak kompatibel satu sama lain. Dalam hal ini, saya akan mengatakan tegas dalam apa yang Anda terima, karena menghilangkan ambiguitas.
File Jargon juga memiliki cerita horor tentang "menebak" maksud pengguna.
sumber
Anda benar, aturan berlaku untuk protokol, dan bukan pemrograman. Jika Anda membuat kesalahan ketik saat pemrograman, Anda akan mendapatkan kesalahan segera setelah dikompilasi (atau dijalankan, jika Anda salah satu dari tipe dinamis itu). Tidak ada yang bisa diperoleh dengan membiarkan komputer menebak untuk Anda. Berbeda dengan rakyat biasa, kami adalah insinyur dan mampu mengatakan dengan tepat apa yang saya maksud. ;)
Jadi, ketika merancang API, saya akan mengatakan jangan ikuti Prinsip Robustness. Jika pengembang membuat kesalahan, mereka harus segera mengetahuinya. Tentu saja, jika API Anda menggunakan data dari sumber luar, seperti file, Anda harus bersikap lunak. Pengguna perpustakaan Anda harus mencari tahu tentang kesalahannya sendiri, tetapi bukan kesalahan orang lain.
Sebagai tambahan, saya akan menebak bahwa "kegagalan diam" diperbolehkan dalam protokol TCP karena jika tidak, jika orang melempar paket yang salah kepada Anda, Anda akan dibombardir dengan pesan kesalahan. Itu perlindungan DoS sederhana di sana.
sumber
IMO, ketahanan adalah satu sisi trade-off desain bukan prinsip "prefer". Seperti yang telah ditunjukkan banyak orang, tidak ada yang berbau seperti meniup empat jam mencoba mencari tahu di mana JS Anda salah hanya untuk menemukan masalah sebenarnya adalah hanya satu browser melakukan hal yang benar dengan XHTML Strict. Itu membiarkan halaman berkeping-keping ketika sebagian dari HTML yang disajikan adalah bencana total.
Di sisi lain, siapa yang ingin mencari dokumentasi untuk metode yang membutuhkan 20 argumen dan bersikeras mereka berada dalam urutan yang sama persis dengan tempat kosong atau nol nilai tempat yang ingin Anda lewati? Cara kuat yang sama buruknya untuk menangani metode itu adalah dengan memeriksa setiap arg dan mencoba menebak mana yang berdasarkan posisi dan tipe relatif dan kemudian gagal diam-diam atau mencoba "melakukan" dengan arg yang tidak bermakna.
Atau Anda dapat memanggang fleksibilitas ke dalam proses dengan melewati daftar pasangan objek literal / kamus / nilai kunci dan menangani keberadaan setiap arg saat Anda mendapatkannya. Untuk tradeoff perf sangat kecil, itu kue dan memakannya juga skenario.
Membebani argumen dengan cara yang cerdas dan konsisten antarmuka adalah cara cerdas untuk menjadi tangguh dalam hal-hal. Begitu pula memanggang redundansi ke dalam sistem di mana diasumsikan pengiriman paket akan secara rutin gagal dikirim dalam jaringan yang sangat besar yang dimiliki dan dijalankan oleh semua orang di bidang teknologi yang sedang berkembang dengan berbagai macam sarana potensial untuk transmisi.
Namun, toleransi kegagalan hina, terutama dalam sistem yang Anda kontrol, tidak pernah merupakan pertukaran yang baik. Sebagai contoh, saya harus mengambil nafas untuk menghindari melemparkan desisan dalam pertanyaan lain tentang menempatkan JS di bagian atas atau bawah halaman. Beberapa orang bersikeras bahwa lebih baik untuk menempatkan JS di atas karena jika halaman gagal memuat sepenuhnya, Anda masih berpotensi memiliki beberapa fungsi. Halaman setengah bekerja lebih buruk daripada payudara lengkap. Paling-paling, mereka menghasilkan lebih banyak pengunjung ke situs Anda dengan benar dengan asumsi Anda tidak kompeten sebelum Anda mengetahuinya daripada jika halaman rusak hanya terpental ke halaman kesalahan setelah gagal itu sendiri validasi cek diikuti oleh email otomatis untuk seseorang yang bisa melakukan sesuatu.
Mencoba untuk memberikan fungsionalitas 2010 pada browser 1999 ketika Anda bisa memberikan halaman teknologi yang lebih rendah adalah contoh lain dari tradeoff desain yang bodoh. Peluang meledak dan uang yang saya lihat terbuang pada waktu yang dihabiskan pengembang untuk mengatasi bug hanya untuk mendapatkan sudut bulat pada elemen melayang di atas latar belakang gradien! @ # $ Ing misalnya, telah benar-benar mengejutkan saya. Dan untuk apa? Untuk memberikan halaman teknologi lebih tinggi yang berkinerja buruk ke technophobes yang terbukti sambil membatasi pilihan Anda pada browser yang lebih tinggi.
Agar itu menjadi pilihan yang tepat, pilihan untuk menangani input dengan cara yang kuat harus selalu membuat hidup lebih mudah di kedua sisi masalah, dalam jangka pendek dan jangka panjang IMO.
sumber
Jangan pernah gagal diam-diam . Selain itu, mencoba menebak apa yang diinginkan pengguna API / perpustakaan, tidak terdengar seperti ide yang buruk. Saya tidak akan mengikutinya; memiliki persyaratan yang ketat, dapat mengekspos bug dalam kode panggilan dan / atau salah tafsir tentang API / perpustakaan Anda.
Lebih jauh, seperti yang telah ditunjukkan, itu tergantung pada seberapa sulit untuk benar-benar menebak apa yang diharapkan pengguna. Jika sangat mudah, maka Anda memiliki dua kasus:
Dalam hal apapun itu tidak 100% jelas dan deterministik, bahwa satu input harus dikonversi ke yang lain, Anda tidak boleh melakukan konversi, karena sejumlah alasan yang telah disebutkan (melanggar kompatibilitas pada refactoring, paling mengejutkan pengguna).
Ketika berhadapan dengan pengguna akhir, mencoba memperbaiki input / tebakan mereka sangat disambut baik. Dia diharapkan memasukkan informasi yang tidak valid; kasus ini sama sekali tidak eksklusif. Pengembang lain, bukan pengguna non teknis yang sederhana. Dia memiliki keahlian untuk memahami kesalahan, dan kesalahan itu dapat memiliki arti / bermanfaat baginya. Jadi, saya setuju dengan Anda untuk merancang API yang ketat, sementara -tentu saja- ketegasan disertai dengan kejelasan dan kesederhanaan.
Saya akan merekomendasikan agar Anda membaca pertanyaan saya ini , dari kasus serupa.
sumber