Dari beberapa proyek open source, saya mengumpulkan gaya pengkodean berikut
void someFunction(bool forget);
void ourFunction() {
someFunction(false /* forget */);
}
Saya selalu ragu tentang apa false
artinya di sini. Apakah ini berarti "lupa", atau "lupa" merujuk pada parameter yang sesuai (seperti dalam kasus di atas), dan "salah" dimaksudkan untuk meniadakannya?
Gaya apa yang paling sering digunakan dan apa cara terbaik (atau beberapa cara yang lebih baik) untuk menghindari ambiguitas?
coding-style
comments
boolean
Johannes Schaub - litb
sumber
sumber
someFunction(forget: true);
true
menjadifalse
dan tidak memperbarui komentar. Jika Anda tidak dapat mengubah API, maka cara terbaik untuk berkomentar adalahsomeFunction( false /* true=forget, false=remember */)
sortAscending
dansortDescending
, atau serupa). Sekarang, di dalam , keduanya dapat memanggil metode pribadi yang sama, yang mungkin memiliki parameter semacam ini. Sebenarnya, jika bahasa itu mendukungnya, mungkin yang akan saya sampaikan adalah fungsi lambda yang berisi arah penyortiran ...Jawaban:
Dalam kode sampel yang Anda poskan, sepertinya
forget
argumen flag. (Saya tidak bisa memastikan karena fungsinya murni hipotetis.)Argumen bendera adalah bau kode. Mereka menunjukkan bahwa suatu fungsi melakukan lebih dari satu hal, dan fungsi yang baik seharusnya hanya melakukan satu hal.
Untuk menghindari argumen flag, pisahkan fungsi menjadi dua fungsi yang menjelaskan perbedaan dalam nama fungsi.
Bendera argumen
Tidak ada argumen bendera
sunting: Idealnya, Anda tidak perlu tetap menggunakan fungsi dengan parameter flag sama sekali. Ada kasus-kasus di sepanjang garis dari apa yang Fowler sebut implementasi kusut di mana sepenuhnya memisahkan fungsi-fungsi menciptakan kode duplikat. Namun, semakin tinggi kompleksitas siklomatik dari fungsi parameter, semakin kuat argumen untuk menghilangkannya.
Ini hanya firasat, tetapi parameter bernama
forget
terdengar seperti iri fitur. Mengapa penelepon memberi tahu objek lain untuk melupakan sesuatu? Mungkin ada masalah desain yang lebih besar.sumber
serveTraditionalIceCream
danserveLowFatIceCream
? Saya memiliki enum dengan 14 jenis es krim.Dalam kata-kata awam:
false
adalah literal.false
someFunction
untuk tidak melupakansomeFunction
bahwa parameter lupa adalahfalse
someFunction
untuk mengingatMenurut pendapat saya akan lebih baik jika fungsinya seperti ini:
Anda bisa menyebutnya
atau simpan nama lama tetapi ubah fungsi wrapper Anda menjadi
EDIT:
Seperti yang dikatakan @Vorac, selalu berusaha untuk menggunakan kata-kata positif. Negasi ganda membingungkan.
sumber
remember
, kecuali nama fungsi membuat arti yangremember
sangat jelas.rememberToCleanUp* or *persist
atau sesuatu.Parameter mungkin bernama baik; sulit untuk mengatakannya tanpa mengetahui nama fungsinya. Saya berasumsi bahwa komentar itu ditulis oleh penulis asli dari fungsi, dan itu adalah pengingat dari apa yang lewat
false
ke dalamsomeFunction
berarti, tetapi bagi siapa saja yang datang bersama sesudahnya, itu sedikit tidak jelas pada pandangan pertama.Menggunakan nama variabel positif (disarankan dalam Kode Selesai ) mungkin merupakan perubahan paling sederhana yang akan membuat potongan ini lebih mudah dibaca, misalnya
kemudian
ourFunction
menjadi:Namun, menggunakan enum membuat pemanggilan fungsi lebih mudah dimengerti, dengan mengorbankan beberapa kode pendukung:
Jika Anda tidak dapat mengubah tanda tangan
someFunction
untuk alasan apa pun, menggunakan variabel sementara membuat kode lebih mudah dibaca juga, semacam menyederhanakan persyaratan dengan memperkenalkan variabel tanpa alasan lain selain membuat kode lebih mudah diurai oleh manusia. .sumber
remember
ke true berarti melupakan (dalam contoh AndasomeFunction(true /* forget */);
)?enum
adalah jauh solusi terbaik. Hanya karena suatu tipe dapat direpresentasikan sebagaibool
—yaitu, mereka isomorfis — itu tidak berarti bahwa itu harus direpresentasikan seperti itu. Argumen yang sama berlaku untukstring
dan bahkanint
.Ubah nama variabel sehingga nilai bool masuk akal.
Ini sejuta kali lebih baik daripada menambahkan komentar untuk menjelaskan argumen ke suatu fungsi karena namanya ambigu.
sumber
Buat boolean lokal dengan nama yang lebih deskriptif, dan berikan nilainya. Dengan begitu maknanya akan lebih jelas.
Jika Anda tidak dapat mengubah nama variabel, maka komentar harus sedikit lebih ekspresif:
sumber
/* forget */
komentar ada untuk mengatasi, yaitu bahwa tanpa deklarasi fungsi tepat di depan Anda, mungkin sulit untuk mengingat apa yang sedang diaturfalse
. (Itulah sebabnya saya pikir saran @ Esailija untuk menambahkan enum lebih baik, dan mengapa saya menyukai bahasa yang memungkinkan parameter bernama.)Ada artikel bagus yang menyebutkan situasi yang tepat ini karena merujuk ke Qt-Style APIs. Di sana, ini disebut The Boolean Parameter Trap dan layak dibaca.
Intinya adalah:
sumber
Ini komentar yang aneh.
Dari perspektif kompiler,
someFunction(false /* forget */);
sebenarnyasomeFunction(false);
(komentar dilucuti). Jadi, semua yang dilakukan adalah panggilansomeFunction
dengan argumen pertama (dan satu-satunya) diatur kefalse
./* forget */
hanya nama parameternya. Ini mungkin tidak lebih dari pengingat cepat (dan kotor), yang tidak benar-benar perlu ada di sana. Cukup gunakan nama parameter yang kurang ambigu, dan Anda tidak akan memerlukan komentar sama sekali.sumber
Salah satu saran dari kode Bersih adalah untuk meminimalkan jumlah komentar yang tidak perlu 1 (karena mereka cenderung membusuk), dan untuk menyebutkan fungsi dan metode dengan benar.
Setelah itu, saya hanya akan menghapus komentar. Setelah semua, IDE modern (seperti gerhana) muncul kotak dengan kode ketika Anda meletakkan mouse di atas fungsi. Melihat kode harus menghapus ambiguitas.
1 Mengomentari beberapa kode kompleks tidak masalah.
sumber
Untuk mengelabui yang jelas, komentar bisa berbohong. Jadi selalu lebih baik untuk membuat kode mendokumentasikan diri Anda tanpa menggunakan komentar untuk menjelaskan, karena beberapa orang (mungkin Anda) akan berubah
true
kefalse
dan tidak memperbarui komentar.Jika Anda tidak dapat mengubah API, maka saya menggunakan 2 opsi
sumber
Saya suka jawaban tentang membuat komentar selalu benar , tetapi sementara bagus saya pikir itu merindukan masalah mendasar dengan kode ini - itu disebut dengan literal.
Anda harus menghindari penggunaan literal saat memanggil metode. Variabel lokal, parameter opsional, parameter bernama, enum - cara terbaik Anda menghindarinya akan tergantung pada bahasa dan apa yang tersedia, tetapi cobalah untuk menghindarinya. Literal memiliki nilai, tetapi mereka tidak memiliki makna.
sumber
Di C #, saya menggunakan parameter bernama untuk membuat ini lebih jelas
Atau
enum
:Atau kelebihan:
Atau polimorfisme`:
sumber
Penamaan harus selalu menyelesaikan ambiguitas untuk boolean. Saya selalu memberi nama boolean sesuatu seperti 'isThis' atau 'shouldDoThat', misalnya:
dan seterusnya. Tetapi ketika Anda mereferensikan kode orang lain, yang terbaik adalah meninggalkan komentar ketika memberikan nilai.
sumber