Merupakan prinsip gaya pengkodean - mis. Prinsip keluar tunggal
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?):
- benar-benar hal yang baik?
Iya nih. Sebagian besar waktu untuk kasus umum, dengan peringatan khusus untuk kasus tepi dan konstruksi pemrograman khusus bahasa.
Selalu, atau kadang-kadang saja?
Sebagian besar waktu.
Seberapa besar bedanya?
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):
function foo() : someType
begin
if( test1 == true )
then
return x;
end
doSomethignElseThatShouldnHappenIfTest1IsTrue();
return somethingElse();
end;
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):
switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
doSomething(); // no return statement yet
}
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.