Keterbacaan penamaan metode Boolean

120

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(...)
Yuval Adam
sumber
21
yang pertama terdengar sepertiisBabbyFormed
Tergantung pada bahasanya. Bahasa yang berbeda memiliki konvensi yang berbeda; Java dan Objective C muncul di benak Anda. Juga batas subjektif.
Jed Smith
Subyektif - cukup adil
Yuval Adam
2
Benar-benar subjektif. getUserExistence, userIsNotExtinct, userHasExistentialStateDll ...
dreamlax
Sartre akan bangga
Cornel Masson

Jawaban:

112
public boolean userExists(...)

Akan menjadi pilihan saya. Karena itu membuat pemeriksaan bersyarat Anda jauh lebih seperti bahasa Inggris alami:

if userExists ...

Tapi saya kira tidak ada aturan yang tegas dan tegas - tetaplah konsisten

Martin
sumber
3
"membuat {method call} Anda jauh lebih seperti bahasa Inggris alami" terdengar seperti ujian yang bagus untuk penamaan rasional secara keseluruhan. mengklarifikasi pemikiran saya tentang masalah ini - terima kasih!
cori
16
Di sisi lain, dalam isolasi atau saat tidak segera mengikuti "jika", maka "userExists ()" terdengar seperti pernyataan fakta, bukan pertanyaan yang dimaksudkan. Tidak seperti "IsUserExisting ()" atau "DoesUserExist ()", yang mengikuti aturan urutan kata alami bahasa Inggris untuk pertanyaan langsung.
Oskar Berggren
4
..tapi mengapa metode yang mengembalikan bool digunakan di luar if? Jika mereka memiliki efek samping yang lebih berbau. if IsUserExisting()dan if DoesUserExist()terlihat menghebohkan dan harus dihindari.
RJFalconer
@RJFalconer terkadang Anda mungkin perlu menggunakan hasil dari metode itu di beberapa tempat, jadi Anda akan menugaskannya ke variabel. Karena metode dipanggil userExists, nama variabel apa yang akan Anda deklarasikan? userExistsbaik untuk variabel, bukan metode. Seperti yang ditulis @Oskar - kedengarannya seperti pernyataan, bukan pertanyaan.
Jarosław Wlazło
Untuk situasi di mana harus ada subjek, predikat, dan objek, misalnya, UserSessionIsComplete atau IsUserSessionComplete, mana yang Anda pilih?
Yang
40

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

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

dan terbaca sangat harfiah dalam bahasa Inggris.

if isUserExistdan if doesUserExisttampak berlebihan.

Kai
sumber
18

Waspadai mengorbankan kejelasan sambil mengejar keterbacaan .

Meskipun if (user.ExistsInDatabase(db))terbaca lebih bagus dari if (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 ExistsInDatabasememeriksa apakah itu ada, atau mengatur 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 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 ifpernyataan membandingkan nilai kembalian suatu fungsi dengan nilai dalam kode, sehingga kodenya terlihat seperti:

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

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.verbtidak 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?

if (user.CheckExists() == true)

Yang biasanya disingkat menjadi

if (user.CheckExists())

Diikuti dengan langkah fatal

if (user.Exists())

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 dibaca if (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.

Michael Parker
sumber
2
> Suppose you had a function called Exists() which causes the object to existItu sudah menjadi masalah. Metode seperti itu harus berupa kata kerja, seperti Create. Setidaknya itu akan terjadi Exist, 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.
RJFalconer
@RJFalconer Most developersadalah kunci kalimat Anda di sana. Saya akan mengatakan all developersakan terkejut jika CheckExists()melakukan apa pun selain memeriksa sesuatu ada. Ini bukan berarti bahwa Exists()adalah nama yang mengerikan, hanya saja CheckExists()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.
Michael Parker
Ya, pertanyaannya adalah tentang pola penamaan terbaik TETAPI untuk metode boolean. Metode Bool unik dan memiliki nama umum - predikat. Anda tidak harus memperlakukannya seperti fungsi lainnya. Menempatkan kata kerja di samping pertanyaan dalam nama metode boolean adalah hal yang berlebihan. Dan itu berdampak negatif pada keterbacaan kode. Penamaan metode boolean dalam bentuk pertanyaan, tanpa kata kerja, diterima sebagai praktik terbaik di industri. Contoh: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir
@Almir File.Exists adalah panggilan yang sangat lama (setidaknya dot net 1.1) dan bukan contoh yang baik dari standar keterbacaan modern. Lihatlah API inti dot net modern untuk contoh yang lebih modern tentang bagaimana Microsoft setuju: github.com/dotnet/sdk , beberapa contoh tautan tautan tautan
Michael Parker
15

Tujuan keterbacaan harus selalu menulis kode yang paling mendekati bahasa alami. Jadi dalam hal ini, userExistssepertinya pilihan terbaik. Menggunakan awalan "adalah" mungkin tetap benar dalam situasi lain, misalnya isProcessingComplete.

Konamiman
sumber
1
Untuk contoh kedua Anda, apakah ProcessingIsCompletelebih dekat dengan bahasa alami? Misalnya: if (ProcessingIsComplete ())
Yang
9

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.

David
sumber
5

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

  1. Itu tergantung apakah 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)). 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.

  2. 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))

Lee Ballard
sumber
5

Aturan sederhana saya untuk pertanyaan ini adalah:

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

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

Benar-benar subjektif.

Saya lebih suka userExists(...)karena pernyataan seperti ini lebih baik dibaca:

if ( userExists( ... ) )

atau

while ( userExists( ... ) )
zumalifeguard
sumber
1

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 ...

Dana
sumber
1

Saya suka yang ini:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
John Kugelman
sumber
0

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.

Yuan
sumber
0

Mengapa tidak mengganti nama properti itu?

if (user.isPresent()) {
Artem Lukanin
sumber