Pertanyaan Boolean metode penamaan keterbacaan


Pertanyaan sederhana, dari sudut pandang keterbacaan, yang nama metode yang Anda sukai untuk metode boolean:

public boolean isUserExist(...)

atau:

public boolean doesUserExist(...)

atau:

public boolean userExists(...)

75
2017-10-14 14:42


asal


Jawaban:


public boolean userExists(...)

Akan lebih saya sukai. Karena ini membuat cek kondisional Anda jauh lebih seperti bahasa Inggris alam:

if userExists ...

Tapi saya kira tidak ada aturan yang keras dan cepat - hanya konsisten


69
2017-10-14 14:45



saya akan mengatakan userExists, karena 90% waktu kode panggilan saya akan terlihat seperti ini:

if userExists(...) {
  ...
}

dan itu dibaca secara harfiah dalam bahasa Inggris.

if isUserExist dan if doesUserExist tampak berlebihan.


31
2017-10-14 14:46



Tujuannya agar mudah dibaca harus selalu menulis kode sedekat mungkin dengan bahasa alami. Jadi dalam hal ini, userExists sepertinya pilihan terbaik. Namun, menggunakan awalan "adalah" mungkin benar dalam situasi lain, misalnya isProcessingComplete.


14
2017-10-14 14:53



Waspadalah terhadap pengorbanan kejelasan sambil mengejar keterbacaan.

Meskipun if (user.ExistsInDatabase(db)) dibaca lebih bagus daripada if (user.CheckExistsInDatabase(db)), pertimbangkan kasus kelas dengan pola builder, (atau kelas apa pun yang dapat Anda atur statusnya):

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

Tidak jelas apakah itu ExistsInDatabase sedang memeriksa apakah itu memang ada, atau menetapkan fakta bahwa itu memang ada. Anda tidak akan menulis if (user.Age()) atau if (user.Name()) tanpa nilai perbandingan, jadi mengapa if (user.Exists()) ide bagus semata-mata karena properti / fungsi tersebut adalah tipe boolean dan Anda dapat mengganti nama fungsi / properti untuk membaca lebih seperti bahasa Inggris alam? Apakah sangat buruk untuk mengikuti pola yang sama yang kita gunakan untuk jenis lain selain boolean?

Dengan tipe lain, sebuah if pernyataan membandingkan nilai kembalian dari suatu fungsi ke nilai dalam kode, sehingga kode tersebut terlihat seperti:

if (user.GetAge() >= 18) ...

Yang berbunyi "jika pengguna dot mendapatkan usia lebih besar dari atau sama dengan 18 ..." benar - itu 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). Programmer umumnya tidak memiliki masalah memahami pernyataan di atas, jadi apakah berikut ini lebih buruk?

if (user.CheckExists() == true)

Yang biasanya disingkat menjadi

if (user.CheckExists())

Diikuti oleh langkah fatal

if (user.Exists())

Sementara itu telah dikatakan bahwa "kode dibaca 10x lebih sering daripada ditulis", itu juga sangat penting bahwa bug mudah dikenali. Misalkan Anda memiliki fungsi yang disebut Exists () yang menyebabkan objek ada, dan mengembalikan true / false berdasarkan kesuksesan. Anda dapat dengan mudah melihat kode if (user.Exists()) dan tidak melihat bug - bug akan jauh lebih jelas jika kode dibaca if (user.SetExists()) sebagai contoh.

Selain itu, user.Exists () dapat dengan mudah berisi kode yang kompleks atau tidak efisien, berputar ke database untuk memeriksa sesuatu. user.CheckExists () menjelaskan bahwa fungsi melakukan sesuatu.

Lihat juga semua tanggapan di sini: Konvensi Penamaan: Apa nama metode yang mengembalikan boolean?

Sebagai catatan akhir - dengan mengikuti "Katakan Tidak Minta", banyak fungsi yang mengembalikan benar / salah menghilang, dan alih-alih meminta objek untuk keadaannya, Anda mengatakannya untuk melakukan sesuatu, yang dapat dilakukan di berbagai cara berdasarkan negaranya.


11
2017-09-09 15:59



Saya akan pergi dengan userExists () karena 1) masuk akal dalam bahasa alami, dan 2) mengikuti konvensi API yang pernah saya lihat.

Untuk melihat apakah itu masuk akal dalam bahasa alami, bacalah dengan keras. "Jika ada pengguna" terdengar lebih seperti frasa bahasa Inggris yang valid daripada "jika ada pengguna" atau "jika ada pengguna". "Jika pengguna ada" akan lebih baik, tetapi "itu" mungkin berlebihan dalam nama metode.

Untuk melihat apakah file ada di Java SE 6, Anda akan melakukannya gunakan File.exists (). Sepertinya ini akan sama di versi 7. C # menggunakan konvensi yang sama, seperti yang dilakukan Python dan Rubi. Mudah-mudahan, ini adalah koleksi yang cukup beragam untuk menyebutnya sebagai jawaban bahasa-agnostik. Secara umum, saya akan memihak metode penamaan sesuai dengan API bahasa Anda.


8
2018-01-15 03:19



Ada hal yang perlu dipertimbangkan yang menurut saya terlewatkan oleh beberapa jawaban lain di sini

  1. Itu tergantung jika ini adalah metode kelas C ++ atau fungsi C. Jika ini adalah metode maka kemungkinan akan dipanggil if (user.exists()) { ... } atau if (user.isExisting()) { ... }
    tidak if (user_exists(&user)) . Ini adalah alasan di balik standar pengkodean yang menyatakan metode bool harus dimulai dengan kata kerja karena mereka akan membaca seperti kalimat ketika objek ada di depan mereka.

  2. Sayangnya banyak fungsi C lama mengembalikan 0 untuk sukses dan bukan nol untuk kegagalan sehingga dapat sulit untuk menentukan gaya yang digunakan kecuali Anda mengikuti semua fungsi bool dimulai dengan kata kerja atau selalu dibandingkan dengan benar seperti begitu if (true == user_exists(&user))


5
2017-09-22 04:56



Aturan sederhana saya untuk pertanyaan ini adalah ini:

Jika metode boolean sudah MEMILIKI kata kerja, jangan menambahkannya. Jika tidak, pertimbangkan. Beberapa contoh:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2
2017-07-07 19:56



Saya suka ini:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null

1
2017-10-14 14:48



Murni subjektif.

aku lebih memilih userExists(...) karena kemudian pernyataan seperti ini dibaca lebih baik:

if ( userExists( ... ) )

atau

while ( userExists( ... ) )

1
2017-10-14 14:47