Boole döndüren Java yöntemleri için adlandırma kuralları


98

Diğer dillerde yöntem / işlev adlarının sonunda soru işareti kullanmayı seviyorum. Java bunu yapmama izin vermiyor. Geçici bir çözüm olarak, Java'da boole döndürme yöntemlerini başka nasıl adlandırabilirim? Bir kullanarak is, has, should, canbazı durumlar için tamam bir yöntem sesin önünde. Bu tür yöntemleri adlandırmanın daha iyi bir yolu var mı?

Örneğin createFreshSnapshot?


3
?Bir yöntem adında a'ya hangi dil izin verir ?
SLaks

11
@SLaks, Scheme, Ruby ...
Skilldrick

şemada, her zaman pyöntem adının sonuna bir koyarız
Erick Robertson

@Erick: Her zaman değil, ancak "p", tahminleri belirlemenin standart bir yoludur
Jason S

biz = lisans program dersim her zaman yaptı. Java'da asla bu kuralı kullanmam.
Erick Robertson

Yanıtlar:


127

Sözleşme isimde bir soru sormaktır.

JDK'da bulunabilecek birkaç örnek:

isEmpty()

hasChildren()

Bu şekilde isimler, sonunda soru işareti olacakmış gibi okunur.

Koleksiyon boş mu?
Bu Düğümün çocukları var mı?

Ve o zaman trueevet falsedemek ve hayır demek.

Veya bunu bir iddia gibi okuyabilirsiniz:

Koleksiyon boş.
Düğümün çocukları var

Not:
Bazen bir yöntemi şöyle adlandırmak isteyebilirsiniz createFreshSnapshot?. Soru işareti olmadan ad, yöntemin gerekli olup olmadığını kontrol etmek yerine bir anlık görüntü oluşturması gerektiğini ifade eder.

Bu durumda aslında ne sorduğunuzu yeniden düşünmelisiniz. Gibi isSnapshotExpiredbir şey çok daha iyi bir isimdir ve çağrıldığında yöntemin size ne söyleyeceğini aktarır. Bunun gibi bir model izlemek, işlevlerinizin çoğunu saf ve yan etkisiz tutmanıza da yardımcı olabilir.

Bir yaparsanız Google Araması için isEmpty()Java API, çok sayıda sonuç almak.


createFreshSnapshot ne olacak?
letronje

4
@letr, peki, muhtemelen yanıyor isSnapshotExpiredveya buna benzer bir şey olarak yeniden adlandırırdım . (kriterlerinize göre)
jjnguy

8
'Should' sözcüğünü kullanarak 'createFrshSnapshot' sorununu çözüyorum - yani, "shouldCreateFreshSnapshot ()" (bu durumda isSnapshotExpired () daha iyidir)
DJClayworth

1
Kalp atışı mesajlarının bir shouldHeartbeat()yöntemle gönderilip gönderilmeyeceğini kontrol ediyorum .
Erick Robertson

Neden olduğunu düşünüyorum isEmpty()ve hasChildren()olan sorular değil iddialarda ? Bu isimleri iddia veya yüklemler olarak düşünürseniz, aslında İngilizcede biraz daha iyi okur.
rick

29

Yansımayı kullanan araçların (örneğin JavaBuilders , JGoodies Binding ) boole alıcılarını tanıyabilmesi için sınıfınızın Java Beans belirtimiyle uyumlu olmasını istiyorsanız , ya kullanın ya da bir yöntem adı olarak. Java Beans spesifikasyonundan:getXXXX()isXXXX()

8.3.2 Boole özellikleri

Ek olarak, boole özellikleri için, bir alıcı yönteminin modelle eşleşmesine izin veririz:

public boolean is< ÖzellikAdı > ();

Bu “<olduğunu PropertyName yöntem yerine” get <ait sağlanabilir> “ PropertyName >” yöntemiyle ya da bir “almak <ilaveten sağlanabilir PropertyName >” yöntemiyle. Her iki durumda da, bir boole özelliği için "is < PropertyName >" yöntemi mevcutsa , özellik değerini okumak için "is < PropertyName >" yöntemini kullanacağız. Örnek bir boole özelliği şöyle olabilir:

public boolean isMarsupial();
public void setMarsupial(boolean m);

public boolean is<PropertyName>(); Jenerik gibi göründüğünü söylediğinizde kafa karıştırıcı .
Erick Robertson

Hey, sadece şartnameden alıntı yapıyorum. Spesifikasyona göre italik yazacağım.
Jason S

5
Java fasulye uyumluluğunu umursamıyorum, sadece yöntem isimlerimin doğru
görünmesini

4
Javabeans uyumluluğunu önemsemeseniz bile, adlandırma kuralı izlemeye değer, çünkü IDE'lerde yapılandırılan "fasulye" orijinal kapsamının çok ötesine geçti. Örneğin, yöntem adı olarak isEmpty kullanırsanız, bu yöntemi JSP'den object.empty kullanarak çağırabilirsiniz, ancak diğer öneklerle yöntemleri çağıramazsınız, bu nedenle object.hasChildren () öğesini çağırmak için object.children'ı kullanamazsınız. Böylece JSP ve EL (İfade Dili), Javabeans Özelliklerine erişmenizi sağlar. Bana sorarsan büyük bir kazanç.
Stijn de Witt

JavaBeans çok özel, hatırlattığın için teşekkürler. Sık sık merak ediyorum ve 'olur' önekine takılıp kaldığımı düşünme eğilimindeyim, ama aslında değil.
Snicolas

26

Bu yanıtı kontrol eden ve daha fazla java tarzı kural arayan kişiler için daha fazla yardımcı olabileceği için bu bağlantıyı göndermek istiyorum.

Java Programlama Stili Yönergeleri

"2.13 , boole değişkenleri ve yöntemleri için önek kullanılmalıdır." özellikle ilgilidir ve is önekini önerir .

Stil rehberi şunları önermeye devam ediyor:

Bazı durumlarda daha iyi uyan is önekine birkaç alternatif vardır . Bunlar has , can ve should prefixes:

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

Yönergeleri izlerseniz, uygun yöntemin adlandırılacağına inanıyorum:

shouldCreateFreshSnapshot()

2
Bilginize, orada kılavuzlar telif hakkı Geoteknik Yazılım Hizmetleri vardır. Bununla birlikte, yasal olduklarını öne sürmek için alttaki kaynağa başvurdular.
Donal Lafferty

11

Başarısız olabilecek yöntemler için, yani dönüş türü olarak boole belirtirseniz, öneki kullanırım try:

if (tryCreateFreshSnapshot())
{
  // ...
}

Diğer tüm durumlar için is.. has.. was.. can.. allows.... gibi önekler kullanın .


15
Ancak try, bunun bir soru olduğu anlamına gelmez (bir dönüş değeri vardır).
Steve Kuo

Bir yöntemin başarısız olup olmadığını belirtmek için asla bir boole döndürmeyin. Yöntem başarısız olursa, bir istisna atın. Yöntemin başarısız olduğunu ve bir yanlış aldığınızı hayal edin, tam olarak neyin yanlış gittiğini nasıl belirlersiniz?
Wouter van Koppen

5

Standart kullanım isveya hasönek olarak kullanılır. Örneğin isValid, hasChildren.


2

isdiğerlerinden daha çok karşılaştığım şey. Mevcut durumda mantıklı olan şey, yine de en iyi seçenektir.


0

Bu genel adlandırma kuralı hakkında farklı bir bakış açısına işaret etmek istiyorum , örneğin:

bkz. java.util.Set :boolean add​(E e)

mantık nerede:

Bazı sonra işleme yapmak raporu başarılı olup olmadığını .

İken returngerçekten de bir booleanyöntemin adı işaret etmelidir tamamlamak için işleme yerine sonuç türü (bu örnek için boole).

Örneğiniz createFreshSnapshotbenim için bu bakış açısıyla daha ilgili görünüyor çünkü şu anlama geliyor: yeni bir anlık görüntü oluşturun ve ardından yaratma işleminin başarılı olup olmadığını bildirin. Bu mantığı göz önünde bulundurursak, isim createFreshSnapshotdurumunuz için en iyisi gibi görünüyor.


1
Neden reddedildiğinden emin değilim, katılıyorum. Kullanmaktan kaçınmama rağmen, anlamsal olmadığı için pek çok dahili java API'si tarafından kullanılan bir kuraldır.
Kamil Bęben

1
Sanırım başlangıçta sadece "Set: boolean add (E e)" yazdığım için insanlar bunun iyi bilinen java.util.Set ile ilgili olduğunu fark etmedi; ya da belki İngilizcem çok kötü olduğu için: D. Olumlu oy için teşekkürler :)
adrhc
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.