Soru Boole yöntemi ad okunabilirliği


Bir 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(...)

76
2017-10-14 14:42


Menşei


ilk bir ses gibi isBabbyFormed - Will
Dile bağlı. Farklı dillerin farklı kuralları var; Java ve Objective C akla geliyor. Ayrıca borderline öznel. - Jed Smith
Öznel - yeterince adil - Yuval Adam
Tamamen öznel. getUserExistence, userIsNotExtinct, userHasExistentialState vb... - dreamlax


Cevaplar:


public boolean userExists(...)

Benim tercihim olur. Şartlı çeklerinizin doğal ingilizce gibi daha fazla olmasını sağlar:

if userExists ...

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


69
2017-10-14 14:45



"sizin yönteminizi çağırır" doğal ingilizce gibi çok daha fazla "tahta boyunca mantıksal adlandırma için büyük bir test gibi geliyor. Konuyla ilgili düşüncemi açıklığa kavuşturdu - teşekkürler! - cori
Diğer taraftan, tecritte veya "if" i hemen takip etmediğinde, o zaman "userExists ()", amaçlandığı gibi değil, bir gerçek ifadesi gibi görünür. Düzgün sorular için İngilizce doğal dil sözcük sırası kurallarını izleyen "IsUserExisting ()" veya "DoesUserExist ()" inden farklı olarak. - Oskar Berggren
.. ama neden bir bool döndüren yöntemler bir if? Yan etkileri varsa, daha çok bir koku. if IsUserExisting() ve if DoesUserExist() korkunç görünüyor ve kaçınılmalıdır. - RJFalconer


şöyle söylerdim userExistsÇünkü zamanın% 90'ı çağrı kodum şöyle görünecek:

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

İngilizcede tam anlamıyla okur.

if isUserExist ve if doesUserExist gereksiz görünüyor.


31
2017-10-14 14:46



Okunabilirlik için +1 - Abram Simon


Okunabilirlik hedefi, her zaman doğal dile mümkün olan en yakın kod yazmak olmalıdır. Yani bu durumda, userExists en iyi seçim gibi görünüyor. Yine de, “öneki” kullanmak başka durumlarda doğru olabilir. isProcessingComplete.


14
2017-10-14 14:53





Fedakârlıktan sakının berraklık takip ederken okunabilirliği.

olmasına rağmen if (user.ExistsInDatabase(db)) daha güzel okur if (user.CheckExistsInDatabase(db))Oluşturucu modeli olan bir sınıfın durumunu (veya durumu belirleyebileceğiniz herhangi bir sınıfı) göz önünde bulundurun:

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

Belli değil ExistsInDatabase Var mı, yoksa var olup olmadığını kontrol ediyor. Yazmazsın if (user.Age()) veya if (user.Name()) herhangi bir karşılaştırma değeri olmadan, neden if (user.Exists()) Tamamen iyi bir fikir çünkü bu özellik / işlev boole türündedir ve daha fazla doğal ingilizce gibi okumak için işlev / özellik olarak yeniden adlandırabilirsiniz? Booleanlar dışındaki diğer türler için kullandığımız aynı deseni takip etmek çok mu kötü?

Diğer türleri ile, bir if deyimi, bir işlevin dönüş değerini koddaki bir değere göre karşılaştırır, bu nedenle kod, aşağıdaki gibi görünür:

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

Hangi "kullanıcı nokta olsun yaş 18 yaşından büyük veya eşitse" olarak okur "doğru - bu" doğal ingilizce "değil, ama ben iddia ediyorum object.verb asla doğal ingilizceye benzememiş ve bu, modern programlamanın (birçok ana dil için) temel bir yüzüdür. Programcılar genellikle yukarıdaki ifadeyi anlamakta sorun yaşamazlar, yani aşağıdakilerden hangisi daha kötü?

if (user.CheckExists() == true)

Hangi normalde kısaltılır

if (user.CheckExists())

Ölümcül adım tarafından takip

if (user.Exists())

"Kod, yazılandan 10 kat daha sık okunur" denildiğinde, hataların kolayca tespit edilmesi de çok önemlidir. Var olan nesnenin varlığına neden olan Varlık () adlı bir işleve sahip olduğunuzu ve başarıya dayalı olarak doğru / yanlış döndürdüğünüzü varsayalım. Kodu kolayca görebilirsiniz if (user.Exists()) ve hatayı tespit etmeyin - eğer kod okunduğunda hata çok daha belirgin olur if (user.SetExists()) Örneğin.

Ayrıca, user.Exists (), bir şeyi kontrol etmek için bir veritabanına yuvarlak bir adım atmak suretiyle karmaşık veya verimsiz bir kod içerebilir. user.CheckExists () işlevi bir şey yaptığını açıkça belirtir.

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

Son bir not olarak - "Tell Don't Ask" ("Söylemem)" den sonra, doğru / yanlış geri dönen işlevlerin çoğu zaten ortadan kaybolur ve devlet için bir nesneyi sormak yerine, farklı bir şekilde yapabileceği bir şey yapmasını söylersiniz. devlete dayanan yollar.


11
2017-09-09 15:59



> Suppose you had a function called Exists() which causes the object to exist Bu zaten bir sorun. Böyle bir yöntem gibi bir fiil olmalı Create. En azından öyle olurdu Existama bir fiil olarak "varolma" nadiren kullanılır. It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist. Bu çok açık. Çoğu geliştiricinin, sadece bir boole döndürmekten başka bir şey yapması durumunda şaşırtacağını iddia ediyorum. - RJFalconer
@RJFalconer Most developers oradaki cümlenizin anahtarıdır. şöyle söylerdim all developers eğer şaşırırsam CheckExists()Bir şey var kontrol etmek dışında bir şey var. Öyle değil Exists() korkunç bir isim, sadece CheckExists() bir daha iyi isim, ve bu soru, genel bir ilke olarak, en iyi adlandırma desenini soruyor? Cevap, başka bir işlev gibi davranmak, adı bir fiille başlatmak ve yalnızca bir boole döndürdüğü için farklı bir desen kullanmamaktır. - Michael Parker


Ben userExists () ile giderdim çünkü 1) doğal dilde anlam ifade eder ve 2) gördüğüm API'lerin konvansiyonlarını izler.

Doğal dilde anlamlı olup olmadığını anlamak için, yüksek sesle okuyun. "Kullanıcı varsa", "kullanıcı varsa" veya "kullanıcı var" ifadesinden daha geçerli bir İngilizce ifade gibi daha fazla ses çıkarır. "Kullanıyorsa" daha iyi olurdu, ancak "bir" yöntem adına muhtemelen gereksizdir.

Java SE 6'da bir dosyanın bulunup bulunmadığını görmek için File.exists () kullan. Bu aynı olacak gibi görünüyor 7 sürümünde. C # kullanır aynı sözleşme, olduğu gibi piton ve yakut. İnşallah bu, bu dile-agnostik bir cevap olarak adlandırmak için yeterince farklı bir koleksiyon. Genel olarak, dilinizin API'sine uygun olarak adlandırma yöntemleri ile taraftar olurdum.


8
2018-01-15 03:19





Burada başka cevapların kaçırıldığını düşündüğüm şeyler var.

  1. Bunun bir C ++ sınıf yöntemi mi yoksa bir C işlevi mi olduğuna bağlı. Bu bir yöntemse, muhtemelen çağrılacak if (user.exists()) { ... } veya if (user.isExisting()) { ... }
    değil if (user_exists(&user)) . Nesnenin önündeyken bir cümle gibi okunacaklarından bool yöntemlerinin bir fiil ile başlaması gereken kodlama standartlarının ardındaki neden budur.

  2. Ne yazık ki, eski C fonksiyonlarının birçoğu, başarı için 0 ve başarısızlık için sıfırdan farklıdır, bu nedenle, tüm bool fonksiyonlarını fiillerle başlamamanız veya her zamanki gibi gerçekle kıyaslanıncaya kadar kullanılan stili belirlemek zor olabilir. if (true == user_exists(&user))


5
2017-09-22 04:56





Bu soruya verdiğim basit kural şudur:

Boole yöntemi zaten bir fiile sahipse, bir tane eklemeyin. Aksi halde düşünün. Bazı örnekler:

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

2
2017-07-07 19:56





Bunlardan herhangi birini seviyorum:

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

1
2017-10-14 14:48





Tamamen öznel.

tercih ederim userExists(...) çünkü bunun gibi ifadeler daha iyi okundu çünkü:

if ( userExists( ... ) )

veya

while ( userExists( ... ) )

1
2017-10-14 14:47