Simple Getter / Setter yorumları


125

Alıcıları ve ayarlayıcıları yorumlamak için hangi kuralı kullanıyorsunuz? Bu, bir süredir merak ettiğim bir şey, örneğin:

/**
 * (1a) what do you put here?
 * @param salary (1b) what do you put here?
 */
public void setSalary(float salary);

/*
 * (2a) what do you put here?
 * @return (2b)
 */
public float getSalary();

Her zaman 1a / b ve 2a / b için hemen hemen aynı şeyi yazdığımı görüyorum, 1a) Çalışanın maaşını, 1b) çalışanın maaşını belirler. Çok gereksiz görünüyor. Şimdi daha karmaşık bir şey görebiliyordum, bağlam sağlamak için (a) bölümlerine daha fazla yazabilirsiniz, ancak oradaki alıcıların / ayarlayıcıların çoğunluğu için ifade neredeyse tamamen aynıdır.

Merak ediyorum, basit alıcılar / ayarlayıcılar için sadece (a) bölümünü VEYA (b) bölümünü doldurmanın uygun olup olmadığını merak ediyorum.

Ne düşünüyorsun?


54
Bir kenara, lütfen parasal herhangi bir şey için (buradaki maaş gibi) float kullanmayın. Örneğin stackoverflow.com/questions/965831/…
Jonik

3
Bunun yerine BigDecimal kullanın.
Josep

Yanıtlar:


84

Genellikle ayarlayıcılar için param kısmını ve alıcılar için @return kısmını doldururum:

/**
 * 
 * @param salary salary to set (in cents)
 */
public void setSalary(float salary);

/**
 * @return current salary (in cents, may be imaginary for weird employees)
 */
public float getSalary();

Bu şekilde javadoc kontrol araçları (Eclipse'in uyarıları gibi) temiz çıkacak ve çoğaltma yapılmayacaktır.


Yazım hatasını düzeltebilir misin? "Setters için @return bölümü"
Jonik

1
Maaş () 'ın yorumunda da bir yazım hatası var. JavaDoc yorumu değil.
Fostah

1
Erişimcileri yorumlamak için en iyi yaklaşımın bu olduğuna katılıyorum.
Fostah

31
Araçlarımızdan aşırı bilgiçlik gösteren uyarıları susturmak uğruna kodunuza gürültü eklemek bana yanlış geliyor. Bir programcıya değer katmıyorsa, doğru çözüm araçların ayrıntılarını azaltmak / düzeltmek ve / veya araçların bizi ödüllendirmesi için çemberlerden atlamayı ne kadar önemsediğimizi kolaylaştırmak olacaktır. Analiz araçlarının bize daha fazla anlamsız görevler yaratması değil, bize yardımcı olması ve emekten tasarruf etmesi gerekiyor.
Lyle

1
@Lyle Bu doğru olabilir, ancak neredeyse her zaman bir programcının söyleyebileceği, bir alıcı / ayarlayıcıyı yalnızca yöntem imzasından daha iyi tanımlayan yararlı bir şeyler olduğunu hissediyorum. Evet, bir programcının tembel olduğu ve yorumda sadece yöntem imzasını tekrarladığı durumlar vardır, ancak genel olarak konuşursak, zorlamanın yararlı bir davranış olduğunu düşünüyorum.
Matt Vukas

174

Kesinlikle anlamsız - bu tür saçmalıklar kodunuzu karıştırmadan daha iyi durumda olursunuz:

/**
 * Sets the foo.
 * 
 * @param foo the foo to set
 */
public void setFoo(float foo);

Gerekirse çok yararlı:

/**
 * Foo is the adjustment factor used in the Bar-calculation. It has a default
 * value depending on the Baz type, but can be adjusted on a per-case base.
 * 
 * @param foo must be greater than 0 and not greater than MAX_FOO.
 */
public void setFoo(float foo);

Özellikle mülkün gerçekte ne anlama geldiğinin açıklaması, alan modellerinde çok önemli olabilir. Ne zaman yatırım bankacılarının, biyokimyacıların veya kuantum fizikçilerinin anladığı belirsiz isimlerle dolu bir fasulye gördüğümde ve yorumlar setGobbledygook () yönteminin "gobbledygook'u ayarladığını" açıkladığında, birini boğmak istiyorum.


2
Duygularım tam olarak, en kötüsü, yalnızca bir alan uzmanının mülkün ne anlama geldiğini bildiği alana özgü modellerdir.
ThaDon

7
Yararlı olsa bile getFoo () için ne yapardınız. Aynı yorumu getFoo () için de kopyalayacak mısınız?
Vinoth Kumar CM

3
@cmv: Açıkçası "param" kısmı kopyalanmayacak. Bilginin her iki erişimciye de eklenmesinin değerinin, bilginin kopyalanmasını doğrudan haklı gösterip göstermediğine kararsızım. Muhtemelen evet. Daha da iyisi, her ikisine de bir yorum eklemenin bir yolu olacaktır; Bunun Project Lombok'ta mevcut olduğuna inanıyorum.
Michael Borgwardt

@VinothKumar: Alıcıdaki özelliği ("Foo, Bar hesaplamasında kullanılan ayarlama faktörüdür" gibi) ve ayarlayıcıdaki değeri değiştirmenin etkilerini (veya gerekli olup olmadığını) basitçe açıklamak belki daha iyi olabilir ya da bu değeri başlatmamak - cevabın örneğinde, "Baz türüne bağlı olarak varsayılan bir değere sahip olduğundan" Foo'yu başlatmak gerekli değildir.
freitass

"Yalnızca yatırım bankacılarının, biyokimyacıların veya kuantum fizikçilerinin anladığı belirsiz isimler" için +1
Jackson,

36

Genelde hiçbir şey, eğer yardım edebilirsem. Toplayıcılar ve ayarlayıcılar kendi kendini açıklayıcı olmalıdır.

Bunun cevapsız gibi göründüğünü biliyorum, ancak zamanımı açıklama gerektiren şeyleri yorumlamak için kullanmaya çalışıyorum.


5
Bu satırlardaki bir başka geçerli cevap da "alıcılar ve ayarlayıcılar içeren tasarımlar kapsülleme kavramını tam olarak anlamıyor" olabilir :)
Trejkaz

2
@Trejkaz: Doğru değil, çünkü erişimci yöntemleri salt okunur veya salt yazılır özelliklere ve polimorfizme (ve böylece sarma, proxy yapma vb.) İzin veriyor.
Laurent Pireyn

2
Bunlara izin verebilirler, ancak genellikle bir kurucu kalıbı ayarlayıcıların yerini alabilir (daha az değişebilir) veya bir ziyaretçi düzeni alıcıların yerini alabilir (daha esnek.)
Trejkaz

İnşaatçı modelini kesinlikle beğeniyorum ve kullanıyorum, ancak POJO'lar için o kadar çok destek var (örn. Hazırda Bekletme'de) alıcılar ve ayarlayıcılar, iyi ya da kötü için hala çok önemli bir yere sahipler. Java, IMHO ile ilgili en kötü şey bu ve on yıldan fazla bir süredir tekrarlayan JavaDocs yazdıktan sonra, @ sleske'nin tavsiyelerine abone olmaya hazırım.
Michael Scheper

34

Alıcıları ve ayarlayıcıları yorumlamak için yalnızca bir tür yan etkiye sahiplerse veya başlatma dışında bir tür ön koşul gerektiriyorsa endişelenmenizi söyleyebilirim (yani: alma bir öğeyi bir veri yapısından kaldıracak veya ihtiyacınız olan bir şeyi ayarlamak için) önce x ve y'nin olması). Aksi takdirde buradaki yorumlar oldukça fazladır.

Düzenleme: Ek olarak, alıcı / ayarlayıcınızda çok sayıda yan etkinin bulunduğunu fark ederseniz, alıcı / ayarlayıcıyı farklı bir yöntem adına sahip olacak şekilde değiştirmek isteyebilirsiniz (yani: bir yığın için itme ve çıkarma) [için teşekkürler aşağıdaki yorumlar]


10
Muhtemelen, tüm geliştiriciler yorumları okumayacağından, yan etkileri olan alıcıların adını daha net olacak şekilde değiştirmelisiniz.
akf

Sorun değil - ancak bu, API'nizin kullanıcılarının bunu bilmesini gerektirir, herhangi bir yan etki olsaydı, belgelenirdi !
oxbow_lakes

akf, yazdıktan sonra aynen öyle düşünüyordum :) Sanırım cevabıma ekleyeceğim.
Gopherkhan

1
ama "aptal" alıcıları ve ayarlayıcıları belgelemezseniz (benim de tercih ettiğim şey bu!) - eksik javadoc ile ilgili Eclipse uyarılarından nasıl kurtulursunuz? Çalışma alanımı bunun gibi uyarılarla karıştırmak istemiyorum, ancak bu uyarının diğer tüm yöntemler için devre dışı bırakılmasını da istemiyorum ...
Zordid

12

Kendinize, yorumlar JavaDocs olarak görüntülendiğinde (bir tarayıcıdan) insanların ne görmesini istediğinizi sorun. Birçok insan, açık olduğu için dokümantasyonun gerekli olmadığını söylüyor. Alan özelse bu geçerli olmaz (özel alanlar için JavaDocs'u açıkça etkinleştirmediğiniz sürece).

Senin durumunda:

public void setSalary(float s)
public float getSalary()

Maaşın ne ile ifade edildiği net değil. Sent, dolar, pound, RMB mi?

Ayarlayıcıları / alıcıları belgelerken, kodlamadan neyi ayırmayı seviyorum. Misal:

/**
 * Returns the height.
 * @return height in meters
 */
public double getHeight()

İlk satır yüksekliği döndürdüğünü söylüyor. Dönüş parametresi, yüksekliğin metre cinsinden olduğunu belgeler.


1
Size katılıyorum, ancak işlev yorumlarının kötü seçilmiş, açık olmayan bir işlev adı olmadığından emin olunması gerektiğini düşünüyorum.
karlipoppins

JavaDocs'un büyük bir destekçisiyim ama aynı zamanda kendi kendini belgeleyen kodun da büyük bir destekçisiyim. Bu yüzden en azından pasör için şöyle bir şey yapardım public void setSalary(float aud)(veya daha gerçekçi bir şekilde public void setSalary(BigDecimal aud)). Daha da iyisi, malın türü olması gerektiğini abstract class CurrencyAmountsırayla özellikleri vardır, java.util.Currency currencyve java.math.BigDecimal amount. Birlikte çalıştığım çoğu geliştirici JavaDoc konusunda son derece tembeldir, ancak API'yi bu şekilde uygulamak, bunu daha az sorun haline getirir.
Michael Scheper

Birim, metre / saniye gibi bir SI birimi ise, belgelendirmeye daha az ihtiyaç vardır, bir Si birimi değilse, standart olmayan birimi içerecek şekilde belgelendirilmeli veya daha iyi adlandırılmalıdır, örneğin, heightFeet
AlexWien

8

Alıcılardan ve ayarlayıcılardan alan değerini ve referansı yorumlamanıza izin vermek için neden sadece bir referans etiketi eklemiyorlar?

/**
* The adjustment factor for the bar calculation.
* @HasGetter
* @HasSetter
*/
private String foo;

public String getFoo() {
  return foo;
}

public void setFoo() {
  this foo = foo;
}

Böylece dokümantasyon alıcı ve ayarlayıcı için olduğu kadar alan için de geçerlidir (eğer özel javadoclar açıksa, yani).


Katılıyorum. Ve sonra fark ettim ki, neden bu kadar kolay yazı yazıyorsunuz? Lombok Projesi hakkındaki cevabımı görün.
Michael Scheper

7

Bu tür bir kazan plakası, Project Lombok kullanılarak önlenebilir . Sadece alan değişkenini belgeleyin, öyle olsa bileprivate ve Lombok açıklamalarının doğru şekilde belgelenmiş alıcılar ve ayarlayıcılar oluşturmasına izin verin.

Benim için bu fayda tek başına maliyete değer .


4

Temelde kapsamlı belgelemenin zaman kaybı olduğunu söyleyen cevaplar beni gerçekten hayal kırıklığına uğrattı. Nasıl API müşterileri adında bir yöntem olduğunu bilmek gerekiyor setXbir olan standart JavaBean özellik kurucu sürece sen belgelerinde kadar net söylemek ?

Dokümantasyon olmadan, arayan kişinin, yöntemin herhangi bir yan etkisi varsa, takip edilen görünen kongre hakkında parmaklarını şaklatmak dışında hiçbir fikri olmayacaktır.

Eminim ki, adı verilen bir yöntemin setXbir özellik belirlemekten çok daha fazlasını yapmasının zor yolunu bulmak için talihsizlik yaşayan tek kişi ben değilim .


11
Belgeleme olmadan, herhangi bir arayan, setX adında bir yöntemin X'i ayarladığını varsayabilir. Bunun sonucu olarak, eğer setX gerçekten X'i ayarlarsa, önemli bir şey yapmadan, belgelendirmeye ihtiyacınız olmaz.
mqp

Bu harika! Şimdi, API'sini kodladığım bu CrudTech şirketi sizin kurallarınıza uyuyor mu yoksa bu ileti dizisinde başka birinin izini mi takip ediyor? Hmmmm
oxbow_lakes

5
Eğer yöntem sadece price özelliği için değer ayarlıyorsa, setPrice belgesinde "fiyatı ayarlar" yazmanın bir anlamı yoktur, ancak aynı zamanda örneğin totalPrice özelliğini günceller ve vergiyi yeniden hesaplarsa, bu tür davranış açıkça belgelenmelidir.
João Marcus

8
Görünüşe göre dokümantasyondan "Bu beklediğiniz şeyi yapıyor" demesini istiyorsunuz. Bu da bir fincan kahvenin üzerine "Dikkat: SICAK" yazmak gibidir. Kusursuz bir dünyada böyle şeyler söylemeye gerek kalmazdı.
Kevin Panko

1
Evet - gibi şeyler olarak adlandırılan yöntemlerin setXbeklenenden farklı yan etkilere sahip olduğu API'leri kullandığım için, bunun mükemmel bir dünya olmadığını gerçekten güvenle söyleyebilirim.
oxbow_lakes

4

Alıcı / ayarlayıcıda özel bir işlem yoksa genellikle yazarım:

Javadoc ile (özel seçenekle):

/** Set {@see #salary}. @param {@link #salary}. */
public void setSalary(float salary);

ve / veya

/** 
 * Get {@see #salary}.
 * @return {@link #salary}.
 */
public float salary();

Doxygen ile (özel ekstrakt seçeneğiyle):

/** @param[in] #salary. */
public void setSalary(float salary);

/** @return #salary. */
public float salary();

2
Bu yaklaşımla ilgili sorun, Javadoc'un özel belgeleri varsayılan olarak oluşturmamasıdır! Bu durumda {@see #salary}, oluşturulan belgelerde referans etiketi geçersizdir.
Jarek Przygódzki

1

Erişimcileri yorumlamak, özellikle de herhangi bir yerde herhangi bir işlem yapmazlarsa, gereksizdir ve parmak uçlarını israf eder.

Kodunuzu okuyan biri bunu anlayamazsa person.getFirstName() , bir kişinin ilk adını döndürdüğünü onu kovmak için gücünüzdeki her şeyi denemelisiniz. Bir veritabanı büyüsü yaparsa, birkaç zar atarsa, ilk adı almak için İlk İsimler Sekreterini çağırırsa, bunun önemsiz bir işlem olmadığını varsaymak ve iyi belgelemek güvenlidir.

Öte yandan, person.getFirstName()bir kişinin adını iade etmezseniz ... peki, oraya gitmeyelim, olur mu?


6
Ya getFirstName () null döndürürse? Bu nerede belgelenecek?
Steve Kuo

Security.getFinalMaturity () nasıl olur? Tüm mülkiyet adlarının hemen anlaşılabilir bir anlamı yoktur. Bunun ne anlama geldiğini bilmediğin için kovulmak ister misin?
Michael Borgwardt

Ya yöntem döndürerek uygulanırsa? Açıkça belgelenmedikçe bunu nasıl bileceksiniz? Doktor öyle olduğunu söylemedikçe, bunun bir standart belirleyici olduğunu nasıl bileceksiniz?
oxbow_lakes

2
bence get / set alıcılar ve ayarlayıcılar için ayrılmalıdır. Veritabanı aramaları "lookupPerson" gibi adlandırılmalıdır.
Thorbjørn Ravn Andersen

1

Alan adı içeriği yeterince açıklayıcıysa hiçbir şey koymayın.

Genel olarak, kodun kendi başına durmasına izin verin ve mümkünse yorum yapmaktan kaçının. Bu, yeniden düzenleme gerektirebilir.

DÜZENLEME: Yukarıdakiler yalnızca alıcılara ve ayarlayıcılara atıfta bulunur. Önemsiz olmayan herhangi bir şeyin düzgün bir şekilde javadoc'lanması gerektiğine inanıyorum.


1
Yorum yapmak ve belgelemek arasında bir fark vardır.
Tom Hawtin - tackline

1
Çok doğru. Aynen bu yüzden alıcılar ve ayarlayıcılar hakkında yorum yapmıyorum. Kendinden açıklamalı olmalılar ve bir yorum eklemek, kodun kendi kendini açıklayıcı olmadığını gösterir.
Thorbjørn Ravn Andersen

0

(b) bölümünü doldurmanızda bir sakınca yoktur, özellikle alan bildirimine alanın neyle ilgili olduğunu belirten bir yorum koyarsanız.


İyi değil - insanlar alan yorumlarını okumaz. Javadoc, varsayılan olarak özel belgeleri bile oluşturmaz ve IDE'ler, bir yöntem çağrısında hızlı yardımı kullandığınızda size alan belgelerini göstermez.
Trejkaz

insanlar gerekmedikçe alan yorumlarını okumazlar. Bir kez ihtiyaç duyulduğunda, ne kadar fazla bilgi o kadar iyidir.
akf

0

Javadoc hiçbir şey eklemezse, javadoc'u silerim ve otomatik olarak oluşturulan yorumları kullanırım.


0

Ben her zaman ikisini de doldururum. Yazmak için harcanan ek süre önemsizdir ve genel olarak daha fazla bilgi, daha azdan daha iyidir.


Sadece "bu bir özellik belirleyicidir" derseniz kendini açıklarlar. Aksi takdirde, bir API istemcisinin yöntemlerin içinde gerçekte ne olduğu hakkında hiçbir fikri yoktur
oxbow_lakes

1
Açıklayıcı olmaktan kim bahsetti?
Paul Sonier
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.