Boole yöntemi adlandırma okunabilirliği


120

Okunabilirlik açısından basit bir soru, bir boole yöntemi için hangi yöntem adını tercih edersiniz:

public boolean isUserExist(...)

veya:

public boolean doesUserExist(...)

veya:

public boolean userExists(...)

21
ilki gibi geliyorisBabbyFormed

Dile bağlıdır. Farklı dillerin farklı kuralları vardır; Java ve Objective C akla geliyor. Ayrıca subjektif sınırda.
Jed Smith

Öznel - yeterince adil
Yuval Adam

2
Tamamen öznel. getUserExistence, userIsNotExtinct, userHasExistentialStateVb ...
dreamlax

Sartre gurur duyardı
Cornel Masson

Yanıtlar:


112
public boolean userExists(...)

Benim tercihim olur. Koşullu kontrollerinizi daha çok doğal İngilizce gibi yaptığından:

if userExists ...

Ama sanırım zor ve hızlı bir kural yok - sadece tutarlı olun


3
"{yöntem çağrınızı} çok daha doğal İngilizce gibi yapar", kulağa tümüyle mantıklı adlandırma için harika bir test gibi geliyor. bu konudaki düşüncemi netleştirdi - teşekkürler!
cori

16
Öte yandan, tek başına veya "eğer" hemen ardından gelmediğinde, "userExists ()", amaçlandığı sorudan ziyade bir gerçek ifadesi gibi görünür. Basit sorular için İngilizce doğal dil kelime sırası kurallarını izleyen "IsUserExisting ()" veya "DoesUserExist ()" in aksine.
Oskar Berggren

4
.. ama neden bool döndüren yöntemler an dışında kullanılsın if? Yan etkileri varsa, bu daha da büyük bir koku. if IsUserExisting()ve if DoesUserExist()korkunç görünüyor ve bundan kaçınılmalıdır.
RJFalconer

@RJFalconer bazen bu yöntemin sonucunu birkaç yerde kullanmanız gerekebilir, bu nedenle onu değişkene atarsınız. Method çağrıldığından beri userExistshangi değişkenin adını bildireceksiniz? userExistsdeğişkenler için iyidir, yöntemler için değil. @Oskar'ın yazdığı gibi - bir soru değil, ifade gibi geliyor.
Jarosław Wlazło

Örneğin, UserSessionIsComplete veya IsUserSessionComplete gibi bir konu, tahmin ve bir nesne olması gereken durumlarda hangisini tercih edersiniz?
Yang

40

Söyleyeceğim userExists, çünkü arama kodumun% 90'ı şöyle görünecek:

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

ve kelimenin tam anlamıyla İngilizce okur.

if isUserExistve if doesUserExistgereksiz görünüyor.


18

Okunabilirlik peşinde koşarken netlikten ödün vermekten kaçının .

Bundan if (user.ExistsInDatabase(db))daha güzel okunmasına rağmen if (user.CheckExistsInDatabase(db)), inşaatçı desenine sahip bir sınıfın durumunu (veya durumu ayarlayabileceğiniz herhangi bir sınıf) düşünün:

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

Var ExistsInDatabaseolup olmadığını kontrol edip etmediği veya var olduğu gerçeğini belirleyip belirlemediği açık değil. Herhangi bir karşılaştırma değeri yazmazsınız if (user.Age())ya da if (user.Name())yazmazsınız, öyleyse neden if (user.Exists())sadece iyi bir fikirdir çünkü bu özellik / işlev boole tipindedir ve işlevi / özelliği daha doğal İngilizce gibi okumak için yeniden adlandırabilirsiniz? Boolean dışındaki diğer türler için kullandığımız aynı kalıbı takip etmek çok mu kötü?

Diğer türlerle, bir ififade, bir işlevin dönüş değerini koddaki bir değerle karşılaştırır, böylece kod şuna benzer:

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

"Kullanıcı nokta yaşı 18'den büyükse veya 18'e eşitse ..." şeklinde okunan doğru - bu "doğal ingilizce" değil, ancak object.verbdoğal ingilizceye asla benzemediğini ve bunun modern programlamanın basit bir yönü olduğunu iddia ediyorum ( birçok yaygın dil). Programcılar genellikle yukarıdaki ifadeyi anlamakta sorun yaşamazlar, bu nedenle aşağıdakiler daha mı kötü?

if (user.CheckExists() == true)

Normalde kısaltılır

if (user.CheckExists())

Ölümcül adımın ardından

if (user.Exists())

"Kodun yazılandan 10 kat daha sık okunduğu" söylenirken, hataların kolayca tespit edilebilmesi de çok önemlidir. Nesnenin var olmasına neden olan ve başarıya bağlı olarak doğru / yanlış döndüren Exists () adında bir işleviniz olduğunu varsayalım. Kodu kolayca görebilir if (user.Exists())ve hatayı tespit edemezsiniz - if (user.SetExists())örneğin kod okunduğunda hata çok daha açık olacaktır .

Ek olarak, user.Exists (), bir şeyi kontrol etmek için bir veritabanına gidip gelen karmaşık veya verimsiz kodu kolayca içerebilir. user.CheckExists (), işlevin bir şeyler yaptığını açıkça belirtir.

Ayrıca buradaki tüm yanıtlara bakın: Adlandırma Kuralları: Boolean döndüren bir yönteme ne ad verilir?

Son bir not olarak - "Sorma Sorma" nın ardından, doğru / yanlış döndüren birçok işlev yine de kaybolur ve bir nesnenin durumunu sormak yerine, ona farklı bir şekilde yapabileceği bir şey yapmasını söylersiniz. durumuna göre yollar.


2
> Suppose you had a function called Exists() which causes the object to existBu zaten bir problem. Böyle bir yöntem, gibi bir fiil olmalıdır Create. En azından öyle olurdu Existama fiil olarak "var olmak" nadiren kullanılır. It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.Çok açık. Çoğu geliştiricinin, yalnızca bir boole döndürmekten başka bir şey yaparsa şaşıracağını iddia ediyorum.
RJFalconer

@RJFalconer oradaki cümlenizin Most developersanahtarıdır. Bir şeyin var olup olmadığını kontrol etmekten başka bir şey yaparsa all developersşaşıracağını söyleyebilirim CheckExists(). Ondan değil Exists()sadece, korkunç bir isimdir CheckExists()bir olduğunu daha iyi isim ve bu soru bir genel prensip, en iyi olanı adlandırma deseni olarak, soruyor? Cevap, ona başka bir işlev gibi davranmak, isme bir fiil ile başlamak ve bir boole döndürdüğü için farklı bir kalıp kullanmamaktır.
Michael Parker

Evet, soru boole yöntemleri için AMA en iyi adlandırma modeli ile ilgili. Bool yöntemleri benzersizdir ve kendi ortak isimleri vardır - yüklem. Onlara diğer işlevler gibi davranmamalısınız. Boole yöntemi adında sorunun yanına bir fiil koymak gereksizdir. Ve kod okunabilirliği üzerinde olumsuz bir etkisi vardır. Boole yöntemlerini hiçbir fiil olmadan sorular şeklinde adlandırmak, sektördeki en iyi uygulama olarak kabul edilmektedir. Örnekler: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir

@Almir File.Exists son derece eski bir çağrıdır (en azından dot net 1.1) ve modern okunabilirlik standartlarına iyi bir örnek değildir. Microsoft'un nasıl kabul ettiğine dair daha modern örnekler için modern nokta net çekirdek API'sine bakın: github.com/dotnet/sdk , bazı rastgele örnekler bağlantı bağlantı bağlantısı
Michael Parker

15

Okunabilirliğin amacı her zaman doğal dile mümkün olan en yakın kod yazmak olmalıdır. Yani bu durumda userExistsen iyi seçenek gibi görünüyor. Yine de başka durumlarda "eşittir" önekini kullanmak doğru olabilir, örneğin isProcessingComplete.


1
İkinci örneğiniz için, ProcessingIsCompletedoğal dillere daha yakın mı? Örneğin: if (ProcessingIsComplete ())
Yang

9

UserExists () ile giderdim çünkü 1) doğal dilde mantıklı ve 2) gördüğüm API'lerin kurallarını takip ediyor.

Doğal dilde mantıklı olup olmadığını görmek için yüksek sesle okuyun. "Kullanıcı varsa", "kullanıcı varsa" veya "kullanıcı varsa" yerine daha çok geçerli bir İngilizce kelime öbeğine benzer. "Kullanıcı varsa" daha iyi olur, ancak "the" muhtemelen bir yöntem adında gereksizdir.

Java SE 6'da bir dosyanın bulunup bulunmadığını görmek için File.exists () kullanırsınız . Bu , sürüm 7'de de aynı olacak gibi görünüyor . C #, Python ve Ruby gibi aynı kuralı kullanır . Umarım bu, bunu dilden bağımsız bir cevap olarak adlandıracak kadar çeşitli bir derlemedir. Genel olarak, adlandırma yöntemlerini dilinizin API'sine uygun olarak kullanırdım.


5

Dikkate alınması gereken şeyler var ki burada birkaç başka cevap tarafından gözden kaçırıldı

  1. Bunun bir C ++ sınıfı yöntemi mi yoksa bir C işlevi mi olduğuna bağlıdır. Bu bir yöntem ise, muhtemelen adı verilecek if (user.exists()) { ... }veya if (user.isExisting()) { ... }
    değil if (user_exists(&user)). Bool yöntemlerinin, nesne önündeyken bir cümle gibi okuyacaklarından, bir fiille başlaması gerektiğini ifade eden kodlama standartlarının arkasındaki neden budur.

  2. Maalesef, birçok eski C işlevi başarı için 0 ve başarısızlık için sıfırdan farklı bir değer döndürür, bu nedenle tüm bool işlevlerini fiillerle başlatmadıkça veya her zaman doğru ile karşılaştırmadıkça kullanılan stili belirlemek zor olabilir. if (true == user_exists(&user))


5

Bu soru için basit kuralım şudur:

Boole yönteminde zaten bir fiil varsa, bir tane eklemeyin. Aksi takdirde, düşünün. Bazı örnekler:

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

2

Tamamen öznel.

Tercih ederim userExists(...)çünkü böyle ifadeler daha iyi okunur:

if ( userExists( ... ) )

veya

while ( userExists( ... ) )

1

Bu özel durumda, ilk örnek o kadar korkunç bir İngilizcedir ki beni ürkütür.

İf ifadelerini okurken kulağa nasıl geldiğinden dolayı muhtemelen üç numaraya giderdim. "Kullanıcı varsa", "Kullanıcı varsa" seçeneğinden daha iyidir.

Bu, elbette ifade testlerinde kullanılacağını varsayıyor ...


1

Bunlardan herhangi birini beğendim:

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

0

Yöntem adları okunabilirlik için hizmet eder, yalnızca kodunuzun tamamına uyanlar en iyisidir, çoğu durumda koşullarla başlar, bu nedenle subjectPredicate doğal cümle yapısını takip eder.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.