Pertanyaan sederhana, dari sudut pandang keterbacaan, nama metode mana yang Anda sukai untuk metode boolean:
public boolean isUserExist(...)
atau:
public boolean doesUserExist(...)
atau:
public boolean userExists(...)
api
naming-conventions
readability
Yuval Adam
sumber
sumber
isBabbyFormed
getUserExistence
,userIsNotExtinct
,userHasExistentialState
Dll ...Jawaban:
Akan menjadi pilihan saya. Karena itu membuat pemeriksaan bersyarat Anda jauh lebih seperti bahasa Inggris alami:
Tapi saya kira tidak ada aturan yang tegas dan tegas - tetaplah konsisten
sumber
if
? Jika mereka memiliki efek samping yang lebih berbau.if IsUserExisting()
danif DoesUserExist()
terlihat menghebohkan dan harus dihindari.userExists
, nama variabel apa yang akan Anda deklarasikan?userExists
baik untuk variabel, bukan metode. Seperti yang ditulis @Oskar - kedengarannya seperti pernyataan, bukan pertanyaan.Saya akan mengatakan
userExists
, karena 90% dari waktu kode panggilan saya akan terlihat seperti ini:dan terbaca sangat harfiah dalam bahasa Inggris.
if isUserExist
danif doesUserExist
tampak berlebihan.sumber
Waspadai mengorbankan kejelasan sambil mengejar keterbacaan .
Meskipun
if (user.ExistsInDatabase(db))
terbaca lebih bagus dariif (user.CheckExistsInDatabase(db))
, pertimbangkan kasus kelas dengan pola pembangun, (atau kelas apa pun yang dapat Anda setel statusnya):user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();
Tidak jelas apakah
ExistsInDatabase
memeriksa apakah itu ada, atau mengatur fakta bahwa itu memang ada. Anda tidak akan menulisif (user.Age())
atauif (user.Name())
tanpa nilai perbandingan, jadi mengapaif (user.Exists())
ide bagus murni karena properti / fungsi itu adalah tipe boolean dan Anda dapat mengganti nama fungsi / properti untuk membaca lebih seperti bahasa Inggris alami? Apakah sangat buruk untuk mengikuti pola yang sama yang kita gunakan untuk tipe lain selain boolean?Dengan tipe lain, sebuah
if
pernyataan membandingkan nilai kembalian suatu fungsi dengan nilai dalam kode, sehingga kodenya terlihat seperti:Yang berbunyi sebagai "jika titik pengguna mendapatkan usia lebih besar dari atau sama dengan 18 ..." benar - ini bukan "bahasa Inggris alami", tetapi saya berpendapat bahwa
object.verb
tidak pernah menyerupai bahasa Inggris alami dan ini hanyalah aspek dasar dari pemrograman modern (untuk banyak bahasa utama). Pemrogram umumnya tidak memiliki masalah dalam memahami pernyataan di atas, jadi apakah hal berikut ini lebih buruk?Yang biasanya disingkat menjadi
Diikuti dengan langkah fatal
Meskipun telah dikatakan bahwa "kode dibaca 10x lebih sering daripada yang ditulis", bug juga sangat penting agar mudah dikenali. Misalkan Anda memiliki fungsi bernama Exists () yang menyebabkan objek ada, dan mengembalikan benar / salah berdasarkan keberhasilan. Anda dapat dengan mudah melihat kode
if (user.Exists())
dan tidak menemukan bug - bug tersebut akan jauh lebih jelas jika kode dibacaif (user.SetExists())
misalnya.Selain itu, user.Exists () dapat dengan mudah berisi kode yang kompleks atau tidak efisien, pergi bolak-balik ke database untuk memeriksa sesuatu. user.CheckExists () memperjelas bahwa fungsi tersebut melakukan sesuatu.
Lihat juga semua tanggapan di sini: Penamaan Konvensi: Apa nama metode yang mengembalikan boolean?
Sebagai catatan terakhir - setelah "Tell Don't Ask", banyak fungsi yang mengembalikan true / false menghilang, dan alih-alih meminta status objek, Anda menyuruhnya melakukan sesuatu, yang dapat dilakukan di tempat lain. cara berdasarkan negaranya.
sumber
Suppose you had a function called Exists() which causes the object to exist
Itu sudah menjadi masalah. Metode seperti itu harus berupa kata kerja, sepertiCreate
. Setidaknya itu akan terjadiExist
, tetapi "ada" sebagai kata kerja jarang digunakan.It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.
Sangat jelas. Saya akan menegaskan bahwa sebagian besar pengembang akan terkejut jika itu melakukan sesuatu selain hanya mengembalikan boolean.Most developers
adalah kunci kalimat Anda di sana. Saya akan mengatakanall developers
akan terkejut jikaCheckExists()
melakukan apa pun selain memeriksa sesuatu ada. Ini bukan berarti bahwaExists()
adalah nama yang mengerikan, hanya sajaCheckExists()
adalah lebih baik nama, dan pertanyaan ini meminta, sebagai prinsip umum, whats pola penamaan yang terbaik? Jawabannya adalah memperlakukannya seperti fungsi lainnya, memulai nama dengan kata kerja, dan jangan menggunakan pola yang berbeda hanya karena mengembalikan boolean.Tujuan keterbacaan harus selalu menulis kode yang paling mendekati bahasa alami. Jadi dalam hal ini,
userExists
sepertinya pilihan terbaik. Menggunakan awalan "adalah" mungkin tetap benar dalam situasi lain, misalnyaisProcessingComplete
.sumber
ProcessingIsComplete
lebih dekat dengan bahasa alami? Misalnya: if (ProcessingIsComplete ())Saya akan menggunakan userExists () karena 1) masuk akal dalam bahasa alami, dan 2) mengikuti konvensi API yang telah saya lihat.
Untuk melihat apakah itu masuk akal dalam bahasa alami, bacalah dengan lantang. "Jika pengguna ada" terdengar lebih seperti frasa bahasa Inggris yang valid daripada "jika pengguna ada" atau "jika pengguna ada". "Jika pengguna ada" akan lebih baik, tetapi "the" mungkin berlebihan dalam nama metode.
Untuk melihat apakah sebuah file ada di Java SE 6, Anda akan menggunakan File.exists () . Sepertinya ini akan sama di versi 7 . C # menggunakan konvensi yang sama , seperti halnya Python dan Ruby . Mudah-mudahan, ini adalah koleksi yang cukup beragam untuk menyebutnya sebagai jawaban tanpa bahasa. Secara umum, saya akan berpihak pada metode penamaan sesuai dengan API bahasa Anda.
sumber
Ada hal-hal yang perlu dipertimbangkan yang menurut saya terlewatkan oleh beberapa jawaban lain di sini
Itu tergantung apakah ini adalah metode kelas C ++ atau fungsi C. Jika ini adalah metode maka kemungkinan akan dipanggil
if (user.exists()) { ... }
atauif (user.isExisting()) { ... }
tidak
if (user_exists(&user))
. Inilah alasan di balik standar pengkodean bahwa metode bool negara harus dimulai dengan kata kerja karena metode tersebut akan terbaca seperti kalimat ketika objek berada di depannya.Sayangnya banyak fungsi C lama mengembalikan 0 untuk sukses dan bukan nol untuk kegagalan sehingga bisa sulit untuk menentukan gaya yang digunakan kecuali Anda mengikuti semua fungsi bool dimulai dengan kata kerja atau selalu bandingkan dengan true seperti itu
if (true == user_exists(&user))
sumber
Aturan sederhana saya untuk pertanyaan ini adalah:
Jika metode boolean sudah MEMILIKI kata kerja, jangan tambahkan. Jika tidak, pertimbangkan itu. Beberapa contoh:
sumber
Benar-benar subjektif.
Saya lebih suka
userExists(...)
karena pernyataan seperti ini lebih baik dibaca:atau
sumber
Dalam kasus khusus ini, contoh pertama adalah bahasa Inggris yang sangat buruk sehingga membuat saya meringis.
Saya mungkin memilih nomor tiga karena bunyinya ketika membacanya dalam pernyataan if. "Jika pengguna ada" terdengar lebih baik daripada "Jika pengguna ada".
Ini mengasumsikan itu akan digunakan jika tes pernyataan tentu saja ...
sumber
Saya suka yang ini:
sumber
Nama metode berfungsi untuk keterbacaan, hanya yang cocok dengan seluruh kode Anda akan menjadi yang terbaik yang sebagian besar kasus itu dimulai dengan kondisi sehingga subjectPredicate mengikuti struktur kalimat alami.
sumber
Mengapa tidak mengganti nama properti itu?
sumber