Apakah prinsip gaya pengkodean - misalnya, prinsip keluar tunggal - benar-benar hal yang baik? Selalu, atau kadang-kadang saja? Seberapa besar bedanya?
Apa pun pendapat Anda, ini jelas pertanyaan subyektif. Atau apakah mereka?
Adakah yang mencoba melakukan penelitian yang obyektif dan ilmiah tentang prinsip-prinsip gaya pengkodean?
Saya tidak bisa membayangkan bagaimana orang akan melakukan studi double-blind tentang keterbacaan, tetapi mungkin double-ignorant mungkin dilakukan - gunakan siswa yang tidak tahu tentang prinsip yang dipelajari sebagai subjek, dan non-programmer untuk mengelola penelitian.
coding-style
Steve314
sumber
sumber
single-exit principle
tidak benar-benar berlaku untuk C ++ karena RAIIbreak
,goto
ataureturn
melakukan. TKI satu pintu keluar tidak mutlak dalam C ++, tapi itu cukup banyak pandangan saya tentang itu dalam C dan sebagian besar bahasa lainnya. Tapi itu masih relevan dalam arti tidak ketat.Jawaban:
Saya menggemakan komentar deadalnix: baca Kode Lengkap 2 . Penulis (Steve McConnell) membahas gaya pengkodean secara mendalam dan seringkali referensi makalah dan data.
sumber
Saya sangat meragukan kemungkinan studi tentang subjek yang menghasilkan hasil yang objektif dan saya akan tetap skeptis sampai saya ditunjukkan beberapa penelitian yang meyakinkan.
Programmer yang telah menghabiskan waktu bertahun-tahun membaca dan menulis kode yang mengikuti gaya pengkodean tertentu jelas akan merasa lebih mudah dibaca daripada gaya pengkodean sempurna yang akan mereka lihat untuk pertama kali dalam hidup mereka.
Ini persis sama dengan tata letak pengetikan QWERTY yang paling umum - mudah untuk membuktikan bahwa itu cukup suboptimal dalam hal ergonomi (apakah Anda berpikir bahwa semua karakter kata TYPEWRITER diletakkan di baris paling atas dengan mempertimbangkan kenyamanan harian kita?) .
Tetapi alternatif yang lebih baik seperti Dvorak atau Colemak tidak pernah populer dan tidak mungkin. Dan karena itu orang tidak lebih produktif dengan mereka - fakta. Bahkan jika mereka unggul dalam beberapa pengertian abstrak.
Juga, akan sulit untuk menemukan subjek tanpa paparan sebelumnya untuk pemrograman (karena ini akan mencemari hasil penelitian kami), TAPI bakat untuk pemrograman, DAN keinginan untuk berpartisipasi dalam studi untuk jangka waktu yang cukup lama untuk menunjukkan keduanya singkat Manfaat waktu dan manfaat jangka panjang sehingga mereka dapat dibandingkan satu sama lain ... (Saya tidak tahu apakah mereka saling eksklusif, tetapi para peneliti tidak bisa hanya berasumsi bahwa mereka tidak pernah sama sekali).
sumber
Jawabannya adalah TIDAK! Apakah `break` dan` continue` praktik pemrograman yang buruk? adalah bagian dari pertanyaan ini, jadi saya akan mulai dengan jawaban yang hampir tidak dimodifikasi untuk itu ...
Anda dapat [kembali] menulis program tanpa pernyataan break (atau kembali dari tengah loop, yang melakukan hal yang sama). Tetapi dengan melakukan itu Anda mungkin harus memperkenalkan variabel tambahan dan / atau duplikasi kode yang keduanya membuat program lebih sulit untuk dipahami. Pascal (bahasa pemrograman akhir 1960-an) sangat buruk terutama untuk programmer pemula karena alasan itu.
Ada hasil ilmu komputer yang disebut hirarki struktur kontrol Kosaraju, yang dimulai pada tahun 1973 dan yang disebutkan dalam makalah Knuth (lebih) pemrograman terstruktur terkenal dengan pernyataan dari 1974. Apa yang dibuktikan oleh S. Rao Kosaraju pada tahun 1973 adalah bahwa itu tidak mungkin untuk menulis ulang semua program yang memiliki multi level level kedalaman n ke dalam program-program dengan kedalaman break kurang dari n tanpa memperkenalkan variabel tambahan. Tetapi katakanlah itu hanya hasil teoretis semata. (Cukup tambahkan beberapa variabel tambahan ?! Tentunya Anda dapat melakukan itu untuk merasa bergabung dengan pengguna 3K + di stackexchange ...)
Apa yang jauh lebih penting dari perspektif rekayasa perangkat lunak adalah makalah yang lebih baru, tahun 1995 oleh Eric S. Roberts berjudul Loop Exits and Structured Programming: Membuka Kembali Debat (doi: 10.1145 / 199688.199815). Roberts merangkum beberapa studi empiris yang dilakukan oleh orang lain sebelum dia. Sebagai contoh, ketika sekelompok siswa tipe CS101 diminta untuk menulis kode untuk fungsi yang mengimplementasikan pencarian sekuensial dalam array, penulis penelitian mengatakan hal berikut tentang siswa yang menggunakan istirahat / kembali untuk keluar dari dari sekuensial lingkaran pencarian tepat ketika elemen ditemukan:
Roberts juga mengatakan bahwa:
Ya, Anda mungkin lebih berpengalaman daripada siswa CS101, tetapi tanpa menggunakan pernyataan break (atau ekuivalen kembali / kebohongan dari tengah-tengah loop), pada akhirnya Anda akan menulis kode bahwa sementara yang terstruktur dengan baik cukup berbulu dalam hal logika tambahan variabel dan duplikasi kode yang seseorang, mungkin diri Anda sendiri, akan memasukkan bug logika di dalamnya ketika mencoba mengikuti beberapa ide passe dari gaya pengkodean "yang benar".
Dan ada satu masalah yang lebih besar di sini selain pernyataan return / break-type, jadi pertanyaan ini sedikit lebih luas daripada yang tentang istirahat. Beberapa mekanisme penanganan pengecualian juga melanggar paradigma titik keluar tunggal
Jadi pada dasarnya siapa pun yang berpendapat di atas bahwa prinsip sing-out masih berguna hari ini juga berdebat dengan paradigma penanganan pengecualian, kecuali digunakan dengan cara yang sangat konstruktif yang dijelaskan dalam tautan terakhir; pedoman tersebut pada dasarnya membatasi semua pengecualian dari fungsi melempar (), yaitu tidak ada propagasi pengecualian antar fungsi yang diizinkan sama sekali. Nikmati Pascal baru Anda dengan sintaksis seperti C ++.
Saya melihat dari mana gagasan "satu kembali saja" berasal?bahwa pendapat umum di situs ini adalah kebalikan dari apa yang saya posting di sini, jadi saya sepenuhnya mengerti mengapa saya telah memilih turun, meskipun saya jawaban pertama di sini untuk benar-benar memberikan sesuatu yang ditanyakan oleh pertanyaan: beberapa info tentang tes kegunaan aktual yang difokuskan pada masalah keluar tunggal. Saya kira saya tidak seharusnya membiarkan pengetahuan menghalangi prekonsepsi, terutama di situs gamification. Saya akan tetap mengedit Wikipedia mulai sekarang. Setidaknya ada info dari sumber yang baik dihargai dan klaim yang tidak jelas atau salah berpura-pura didukung oleh sumber akhirnya mendapatkan larangan. Di situs ini, yang terjadi justru sebaliknya: pendapat yang tidak berdasar oleh fakta mendominasi. Saya sepenuhnya berharap mod untuk menghapus bagian terakhir ini, tapi setidaknya cowok itu akan tahu mengapa Anda kehilangan saya selamanya sebagai kontributor di sini.
sumber
http://dl.acm.org/citation.cfm?id=1241526
http://www.springerlink.com/content/n82qpt83n8735l7t/
http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=661092
[Pertanyaan Anda sepertinya dijawab dengan satu kata, "ya". Namun, saya telah diberi tahu bahwa memberikan jawaban singkat adalah "meremehkan" pertanyaan itu. Jika Anda merasa saya menolak, beri tanda pada jawaban agar moderator dapat menghapusnya.]
sumber
Is a coding style principle - e.g. the single-exit principle - really a good thing?
- yang memberikan konteks pada pertanyaan yang diajukannya, tentang gaya pengkodean. Selain itu, gaya pengkodean tidak sama dengan metodologi pemrograman, khususnya metode desain tingkat tinggi yang menjadi fokus artikel IEEE (dinyatakan dengan jelas oleh penulis.) Itulah mengapa saya mengatakan "tidak" - cakupannya sangat berbeda.Orang-orang yang masih ingin keluar atau keluar ganda masih terjebak di akhir 1960-an. Saat itu, diskusi seperti itu penting karena kami masih dalam masa bayi programmer terstruktur, dan ada cukup banyak kubu yang menyatakan bahwa temuan di balik Teorema Program Terstruktur Bohm-Jacopini tidak berlaku secara universal untuk semua konstruksi pemrograman.
Itu adalah sesuatu yang harus diselesaikan sejak lama. Yah, itu telah diselesaikan (hampir 4 dekade tepatnya, baik di bidang akademik maupun industri), tetapi orang-orang (mereka yang benar-benar pro atau menentang) belum memperhatikan.
Adapun sisa jawaban saya, semuanya relatif (apa yang tidak ada dalam perangkat lunak?):
Iya nih. Sebagian besar waktu untuk kasus umum, dengan peringatan khusus untuk kasus tepi dan konstruksi pemrograman khusus bahasa.
Sebagian besar waktu.
Tergantung.
Kode yang dapat dibaca vs kode yang tidak dapat dibaca. Meningkatnya kompleksitas (yang seharusnya kita ketahui sekarang meningkatkan kemungkinan memperkenalkan kesalahan) vs kompleksitas yang lebih sederhana (dan ergo, probabilitas kesalahan yang lebih kecil.) Bahasa yang kompilernya tidak menambahkan pengembalian implisit (katakanlah, Pascal, Java atau C #) dan yang default ke int (C dan C ++).
Pada akhirnya, itu adalah keterampilan mengasah dengan pria / jam di belakang keyboard. Terkadang, boleh saja memiliki beberapa pernyataan pengembalian, seperti di sini (dalam beberapa kodesemu Pascal'esque):
Maksudnya jelas, dan algoritme cukup kecil dan cukup rumit sehingga tidak menjamin pembuatan variabel 'bendera' yang memegang nilai pengembalian akhirnya yang digunakan dalam satu titik pengembalian tunggal. Algoritme mungkin salah, tetapi strukturnya cukup sederhana sehingga upaya dalam mendeteksi kesalahan (kemungkinan besar) dapat diabaikan.
Terkadang tidak (di sini menggunakan pseudocode mirip-C):
Di sini, algoritme tidak memiliki struktur sederhana, dan pernyataan sakelar (gaya C) memungkinkan langkah-langkah yang mungkin atau mungkin tidak dilakukan secara sengaja sebagai bagian dari algoritme.
Mungkin algoritme itu benar, tetapi ditulis dengan buruk.
Atau mungkin, oleh kekuatan eksternal di luar kemampuan programmer, ini adalah representasi aktual (dan benar) dari algoritma yang dibutuhkan secara sah.
Mungkin itu salah.
Untuk mengungkap kebenaran semua ini membutuhkan jauh lebih banyak upaya daripada dalam contoh sebelumnya. Dan di sinilah letak sesuatu yang sangat saya percayai (ingatlah bahwa saya tidak memiliki studi formal untuk mendukung hal ini):
Mengasumsikan cuplikan kode yang dianggap benar:
Pernyataan pengembalian berganda meningkatkan keterbacaan dan kesederhanaan cuplikan kode seperti itu, jika cuplikan tersebut mewakili algoritme sederhana dengan struktur aliran yang pada dasarnya sederhana. Secara sederhana, maksud saya tidak kecil, tetapi maksud saya secara inheren dapat dipahami atau bukti diri , yang tidak memerlukan upaya membaca yang tidak proporsional (atau mendorong orang untuk muntah, mengutuk ibu seseorang, atau menelan peluru ketika mereka harus membacanya. )
Pernyataan pengembalian tunggal meningkatkan keterbacaan dan kesederhanaan potongan kode tersebut jika nilai kembali dihitung sepanjang eksekusi algoritma atau jika langkah-langkah dalam algoritma yang bertanggung jawab untuk menghitungnya dapat dikelompokkan bersama dalam satu lokasi dalam struktur algoritma .
Pernyataan pengembalian tunggal mengurangi keterbacaan dan kesederhanaan sepotong kode jika memerlukan penugasan ke satu atau lebih variabel bendera, dengan lokasi penugasan tersebut tidak secara seragam terletak di seluruh algoritma.
Pernyataan pengembalian berganda mengurangi keterbacaan dan kesederhanaan sepotong kode jika pernyataan pengembalian tidak terdistribusi secara merata di seluruh algoritma, dan jika mereka membatasi satu sama lain blok kode yang tidak seragam dalam ukuran atau struktur di antara mereka sendiri.
Ini terkait erat dengan kompleksitas cuplikan kode yang dimaksud. Dan ini pada gilirannya terkait dengan langkah-langkah kompleksitas siklomatik dan halstead. Dari ini, seseorang dapat mengamati hal berikut:
Semakin besar ukuran subrutin atau fungsi, semakin besar dan kompleks struktur aliran kontrol internalnya, dan semakin besar probabilitas Anda akan menghadapi pertanyaan apakah akan menggunakan pernyataan pengembalian berganda atau tunggal.
Kesimpulannya adalah: jaga agar fungsi Anda tetap kecil dalam melakukan satu hal dan hanya satu hal (dan melakukannya dengan baik). Jika mereka menunjukkan metrik kompleksitas cyclomatic dan halstead nominal kecil, tidak hanya mereka pasti paling benar dan menjadi implementasi tugas yang dapat dipahami, struktur batin mereka juga akan relatif jelas.
Kemudian, dan hanya dengan begitu Anda dapat dengan mudah dan tanpa kehilangan banyak tidur, Anda dapat memutuskan apakah akan menggunakan pengembalian tunggal dan berulang tanpa menjalankan banyak risiko memperkenalkan kesalahan dengan salah satu pilihan.
Orang juga dapat melihat semua ini dan menyarankan bahwa ketika orang bergumul dengan masalah pengembalian tunggal atau pengembalian ganda, itu karena - baik karena kurangnya pengalaman, kebodohan atau kurangnya etika kerja - mereka tidak menulis kode bersih dan cenderung menulis fungsi mengerikan dengan sepenuhnya mengabaikan langkah-langkah siklomatik dan halstead.
sumber