Saya baru-baru ini menemukan Desain oleh Kontrak (DbC) dan saya menemukan cara yang sangat menarik untuk menulis kode. Di antara hal-hal lain, tampaknya akan menawarkan:
- Dokumentasi yang lebih baik. Karena kontrak adalah dokumentasi, tidak mungkin bagi seseorang untuk ketinggalan zaman. Selain itu, karena kontrak menentukan dengan tepat apa yang dilakukan rutin, itu membantu untuk mendukung penggunaan kembali.
- Debugging sederhana. Karena eksekusi program berhenti ketika kontrak gagal, kesalahan tidak dapat menyebar, dan pernyataan spesifik yang dilanggar mungkin akan disorot. Ini menawarkan dukungan selama pengembangan dan selama pemeliharaan.
- Analisis statis yang lebih baik. DbC pada dasarnya hanyalah implementasi dari logika Hoare, dan prinsip yang sama harus diterapkan.
Biaya, dalam perbandingan tampaknya agak kecil:
- Mengetik jari ekstra. Karena kontrak harus dijabarkan.
- Mengambil sejumlah pelatihan untuk merasa nyaman dengan kontrak penulisan.
Sekarang, karena terbiasa dengan Python terutama, saya menyadari bahwa sebenarnya mungkin untuk menulis prakondisi (hanya melemparkan pengecualian untuk input yang tidak pantas) dan bahkan mungkin untuk menggunakan pernyataan untuk menguji lagi postconditions tertentu. Tetapi tidak mungkin untuk mensimulasikan fitur tertentu seperti 'lama' atau 'hasil' tanpa sihir tambahan yang pada akhirnya akan dianggap tidak Pythonic. (Selain itu, ada beberapa perpustakaan yang menawarkan dukungan, tetapi pada akhirnya saya mendapatkan getaran itu akan salah untuk menggunakannya, karena kebanyakan pengembang tidak.) Saya berasumsi bahwa itu adalah masalah yang sama untuk semua bahasa lain (kecuali tentu saja , Eiffel).
Intuisi saya memberi tahu saya bahwa kurangnya dukungan harus merupakan hasil dari semacam penolakan terhadap praktik tersebut, tetapi pencarian online belum membuahkan hasil. Saya ingin tahu apakah seseorang dapat menjelaskan mengapa sebagian besar bahasa modern tampaknya menawarkan sedikit dukungan? Apakah DbC cacat atau terlalu mahal? Atau apakah itu hanya usang karena Pemrograman Ekstrim dan metodologi lainnya?
sumber
Jawaban:
Bisa dibilang mereka didukung di hampir setiap bahasa pemrograman.
Yang Anda butuhkan adalah "pernyataan".
Ini mudah dikodekan sebagai pernyataan "jika":
Dengan ini, Anda dapat menulis kontrak dengan menempatkan pernyataan seperti itu di bagian atas kode Anda untuk kendala input; yang ada di titik balik adalah kendala keluaran. Anda bahkan dapat menambahkan invarian di seluruh kode Anda (walaupun sebenarnya bukan bagian dari "desain berdasarkan kontrak").
Jadi saya berpendapat mereka tidak tersebar luas karena programmer terlalu malas untuk membuat kode, bukan karena Anda tidak bisa melakukannya.
Anda dapat menjadikan ini sedikit lebih efisien di sebagian besar bahasa dengan mendefinisikan konstanta boolean "memeriksa" waktu kompilasi dan sedikit merevisi pernyataan:
Jika Anda tidak menyukai sintaksis, Anda dapat menggunakan berbagai teknik abstraksi bahasa seperti makro.
Beberapa bahasa modern memberi Anda sintaks yang bagus untuk ini, dan itulah yang saya pikir Anda maksud dengan "dukungan bahasa modern". Itu dukungan, tetapi sangat tipis.
Apa yang sebagian besar dari bahkan bahasa modern tidak memberi Anda adalah pernyataan "temporal" (lebih dari keadaan sewenang-wenang sebelumnya atau berikut [operator temporal "akhirnya"], yang Anda butuhkan jika Anda ingin menulis kontrak yang sangat menarik. JIKA pernyataan tidak akan membantu kamu disini.
sumber
super
metode dan mungkin membuang hasilnya jika Anda hanya ingin kontrak diperiksa tanpa duplikasi. Ini sangat membantu menerapkan kode yang sesuai LSP bersih.Seperti yang Anda katakan, Desain oleh Kontrak adalah fitur di Eiffel, yang telah lama menjadi salah satu bahasa pemrograman yang dihormati di masyarakat tetapi tidak pernah populer.
DbC tidak dalam bahasa yang paling populer karena itu relatif baru-baru ini bahwa komunitas pemrograman arus utama telah menerima bahwa menambahkan kendala / harapan pada kode mereka adalah hal yang "masuk akal" untuk diharapkan oleh para programmer. Sudah umum bagi para programmer untuk memahami betapa berharganya unit-testing, dan itu meresap hingga programmer lebih menerima memasukkan kode untuk memvalidasi argumen mereka dan melihat manfaatnya. Tetapi satu dekade yang lalu, mungkin sebagian besar programmer akan mengatakan "itu hanya pekerjaan ekstra untuk hal-hal yang Anda tahu akan selalu baik-baik saja."
Saya pikir jika Anda pergi ke pengembang rata-rata hari ini dan berbicara tentang kondisi setelahnya, mereka akan mengangguk dengan antusias dan berkata, "Oke, itu seperti pengujian unit." Dan jika Anda berbicara tentang pra-kondisi, mereka akan berkata "OK, itu seperti validasi parameter, yang tidak selalu kita lakukan, tetapi, Anda tahu, saya kira tidak apa-apa ..." Dan kemudian jika Anda berbicara tentang invarian , mereka akan mulai berkata, "Wah, berapa biaya overhead ini? Berapa banyak lagi bug yang akan kita tangkap?" dll.
Jadi saya pikir masih ada jalan panjang sebelum DbC diadopsi secara luas.
sumber
Salah.
Ini adalah praktik desain . Ini dapat diwujudkan secara eksplisit dalam kode (gaya Eiffel) atau secara implisit dalam kode (sebagian besar bahasa) atau dalam unit test. Praktik desain ada dan bekerja dengan baik. Dukungan bahasa ada di seluruh peta. Namun demikian, hadir dalam banyak bahasa dalam kerangka uji unit.
Itu mahal. Dan. Lebih penting lagi, ada beberapa hal yang tidak dapat dibuktikan dalam bahasa yang diberikan. Pengakhiran loop, misalnya, tidak dapat dibuktikan dalam bahasa pemrograman, itu membutuhkan kemampuan bukti "tingkat tinggi". Jadi beberapa jenis kontrak secara teknis tidak bisa diungkapkan.
Tidak.
Kami kebanyakan menggunakan unit test untuk menunjukkan bahwa DbC terpenuhi.
Untuk Python, seperti yang Anda perhatikan, DbC berjalan di beberapa tempat.
Docstring dan hasil tes docstring.
Pernyataan untuk memvalidasi input dan output.
Tes unit.
Lebih lanjut.
Anda dapat mengadopsi alat gaya pemrograman terpelajar sehingga Anda menulis dokumen yang menyertakan informasi DbC Anda dan yang menghasilkan skrip pengujian unit Python plus unit. Pendekatan pemrograman melek memungkinkan Anda untuk menulis literatur yang bagus yang mencakup kontrak dan sumber lengkap.
sumber
there are some things which cannot be proven
. Verifikasi formal mungkin bagus, tetapi tidak semuanya dapat diverifikasi! Sehingga fitur itu sebenarnya membatasi apa yang sebenarnya bisa dilakukan oleh bahasa pemrograman!Hanya menebak. Mungkin bagian dari alasan yang tidak begitu populer adalah karena "Desain oleh Kontrak" adalah merek dagang oleh Eiffel.
sumber
Satu hipotesis adalah bahwa untuk program kompleks yang cukup besar, terutama yang dengan target bergerak, massa kontrak itu sendiri bisa menjadi buggy dan sulit untuk di-debug, atau lebih-lebih, daripada kode program saja. Seperti halnya pola apa pun, mungkin ada penggunaan masa lalu yang semakin berkurang, serta keuntungan yang jelas saat digunakan dengan cara yang lebih bertarget.
Kesimpulan lain yang mungkin adalah bahwa popularitas "bahasa yang dikelola" adalah bukti terkini dari dukungan desain-kontrak untuk fitur-fitur terkelola yang dipilih (susunan batas berdasarkan kontrak, dll.)
sumber
Alasan bahwa sebagian besar bahasa utama tidak memiliki fitur DbC dalam bahasa adalah rasio biaya-manfaat dari penerapannya adalah tinggi untuk pelaksana bahasa.
satu sisi dari ini telah dilihat pada jawaban lain, unit test dan mekanisme runtime lainnya (atau bahkan beberapa mekanisme waktu kompilasi dengan pemrograman meta templat) dapat memberi Anda banyak kebaikan DbC. Oleh karena itu, walaupun ada manfaatnya hal itu tampaknya dipandang cukup sederhana.
Sisi lain adalah biaya, pas retro DbC ke bahasa yang ada kemungkinan terlalu besar perubahan melanggar dan sangat kompleks untuk di-boot. Memperkenalkan sintaks baru dalam bahasa tanpa merusak kode lama itu sulit. Memperbarui perpustakaan standar yang ada untuk menggunakan perubahan yang jauh jangkauannya akan mahal. Oleh karena itu kita dapat menyimpulkan bahwa menerapkan fitur DbC dalam bahasa yang ada memiliki biaya tinggi.
Saya juga mencatat bahwa konsep yang cukup banyak kontrak untuk template, dan karena itu agak terkait dengan DbC, dikeluarkan dari standar C ++ terbaru bahkan setelah bertahun-tahun mengerjakannya, diperkirakan mereka masih membutuhkan tahun kerja. Perubahan besar, luas, dan luas ke bahasa-bahasa ini terlalu sulit untuk diimplementasikan.
sumber
DbC akan digunakan lebih luas jika kontrak dapat diperiksa pada waktu kompilasi sehingga tidak mungkin untuk menjalankan program yang melanggar kontrak apa pun.
Tanpa dukungan kompiler, "DbC" hanyalah nama anter untuk "periksa invarian / asumsi dan berikan pengecualian jika dilanggar".
sumber
Saya punya penjelasan sederhana, kebanyakan orang (termasuk programmer) tidak ingin bekerja ekstra kecuali mereka melihatnya perlu. Pemrograman Avionik di mana keselamatan dianggap sangat penting. Saya belum pernah melihat sebagian besar proyek tanpanya.
Tetapi jika Anda mempertimbangkan pemrograman situs web, desktop, atau seluler - crash dan perilaku tak terduga kadang-kadang tidak dianggap buruk dan programmer hanya akan menghindari pekerjaan ekstra ketika melaporkan bug dan kemudian memperbaikinya dianggap cukup memadai.
Ini mungkin alasan saya pikir Ada tidak pernah mengambil di luar industri pemrograman penerbangan karena dibutuhkan lebih banyak pekerjaan pengkodean meskipun Ada adalah bahasa yang luar biasa dan jika Anda ingin membangun sistem yang andal, itu adalah bahasa terbaik untuk pekerjaan itu (tidak termasuk SPARK yang merupakan hak milik) bahasa berdasarkan Ada).
Desain oleh perpustakaan kontrak untuk C # adalah percobaan oleh Microsoft, dan mereka sangat berguna untuk membangun perangkat lunak yang andal, tetapi mereka tidak pernah mengambil momentum di pasar jika tidak Anda akan melihatnya sekarang sebagai bagian dari bahasa inti C #.
Pernyataan tidak sama dengan dukungan berfungsi penuh untuk kondisi pra / pasca dan invarian. Meskipun dapat mencoba untuk meniru mereka tetapi bahasa / kompiler dengan dukungan yang tepat melakukan analisis 'pohon sintaksis abstrak' dan memeriksa kesalahan logika yang hanya pernyataan tidak bisa.
Sunting: Saya melakukan pencarian dan berikut ini adalah diskusi terkait yang mungkin bisa membantu: https://stackoverflow.com/questions/4065001/are-there-any-provable-real-world-languages-scala
sumber
Sebagian besar alasannya adalah sebagai berikut:
sumber