シンプルなゲッター/セッターコメント


124

ゲッターとセッターにコメントするためにどの規則を使用していますか?これは私がかなり長い間疑問に思っていたものです。例えば:

/**
 * (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();

1a / bと2a / bでまったく同じものを書いていることにいつも気づきます。1a)従業員の給与を設定します。1b)従業員の給与を設定します。それはとても冗長なようです。今私はあなたがコンテキストを与えるためにあなたが(a)の部分でより多く書くかもしれないもっと複雑な何かを見ることができました、しかしそこにいるゲッター/セッターの大部分にとって言葉遣いはほとんど正確に同じです。

単純なゲッター/セッターについて、(a)部分または(b)部分のいずれかのみを入力してもよいかどうか、私は興味があります。

どう思いますか?


54
余談ですが、フロートを金銭的なもの(ここでは給与など)に使用しないでください。たとえば、stackoverflow.com
questions / 965831 /…を

3
代わりにBigDecimalを使用してください。
Josep

回答:


83

私は通常、setterのparam部分とgetterの@return部分のみを入力します。

/**
 * 
 * @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();

これにより、javadocチェックツール(Eclipseの警告など)がクリーンになり、重複がなくなります。


タイプミスを修正できますか?「セッター用の@returnパーツ」
Jonik

1
salary()のコメントにもタイプミスがあります。JavaDocコメントではありません。
フォスタ2009年

1
私はそれがアクセサをコメントするための最良のアプローチであることに同意します。
フォスタ2009年

30
私たちのツールからの過度に不自然な警告を止めるために、コードにノイズを追加することは私には間違っていると感じます。それがプログラマーに付加価値を与えない場合、適切な解決策は、ツールの冗長性を下げる/修正する、および/またはツールが私たちに報いるように、フープをジャンプすることについて気にする量を緩和することです。分析ツールは、私たちを助けて労力を節約するためのものであり、私たちにとってより無意味なタスクを作成するものではありません。
Lyle

1
@Lyleそれは本当かもしれませんが、プログラマーがメソッドのシグネチャだけではなく、ゲッター/セッターをよりよく説明できる便利なものがほとんど常にあるように感じます。はい、プログラマーが怠惰でコメントのメソッドシグネチャを繰り返すだけの場合もありますが、一般的に言えば、強制することは有用な動作だと思います。
Matt Vukas 2014

174

絶対に無意味です-このようながらくたがコードを散らかさない限り、あなたのほうが良いでしょう:

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

必要に応じて、非常に役立ちます。

/**
 * 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);

特に、プロパティが実際に何を意味するかの説明は、ドメインモデルでは非常に重要です。投資銀行家、生化学者、または量子物理学者だけが理解できるあいまいな名前のプロパティでいっぱいのBeanを見るたびに、コメントにsetGobbledygook()メソッドが「gobbledygookを設定する」と説明されているときはいつでも、誰かを絞め殺したいと思います。


2
私の感情は正確に言うと、最悪なのはドメイン固有のモデルであり、ドメインの専門家だけがそのプロパティの意味を知っているということです。
ThaDon、2009年

7
getFoo()で何をするのが便利だとしても。getFoo()にも同じコメントをコピーしますか?
Vinoth Kumar CM、2011

3
@cmv:明らかに「param」部分はコピーされません。両方のアクセサーに情報を添付することの価値が、情報の複製を直接正当化するかどうかは、私には定かではありません。多分そう。さらに良いのは、両方に1つのコメントを付ける方法です。これはProject Lombokで利用できると思います。
Michael Borgwardt、2011

@VinothKumar:ゲッターのプロパティ( "Fooはバー計算で使用される調整係数です。"など)とセッターの値を変更した場合の効果(または必要かどうか)またはその値を初期化しない-答えの例では、「Bazタイプに応じてデフォルト値がある」ため、Fooを初期化する必要はありません。
freitass 2013年

+1「投資銀行家、生化学者、量子物理学者のみが理解するあいまいな名前」
ジャクソン

36

私がそれを助けることができるなら、一般的に何もない。ゲッターとセッターは一目瞭然です。

私はそれが無回答のように聞こえることを知っていますが、説明が必要なものにコメントするために自分の時間を使うようにしています。


5
これらの線に沿った別の有効な答えは、「ゲッターとセッターを使用した設計は、カプセル化の概念を適切に理解していない」かもしれません:
Trejkaz

2
@Trejkaz:真ではありません。これは、アクセサメソッドが読み取り専用または書き込み専用のプロパティ、およびポリモーフィズム(ラッピング、プロキシなど)を許可するためです。
Laurent Pireyn

2
(より柔軟な。)彼らはそれらのものを可能にすることができるが、多くの場合、Builderパターンはセッターを置き換えることができます(以下可変)またはビジターパターンはゲッターを置き換えることができます
Trejkaz

私は確かにビルダーパターンを気に入って使用していますが、POJO(Hibernateなど)のサポートが非常に多いので、ゲッターとセッターは依然として、良くも悪くも、非常に目立つ場所にあります。これはJavaとIMHOの最も厄介なことであり、10年以上にわたって繰り返しJavaDocsを書いた後、@ sleskeのアドバイスを受け入れる準備ができています。
Michael Scheper 2013年

34

ゲッターとセッターに何らかの副作用がある場合、または初期化以外に何らかの前提条件が必要な場合(つまり、データ構造から項目を削除するか、必要なものを設定するため)にコメントすることだけを心配します最初にxとyを配置します)。そうでなければ、ここのコメントはかなり冗長です。

編集:さらに、ゲッター/セッターに多くの副作用が含まれていることがわかった場合は、ゲッター/セッターを別のメソッド名に変更することをお勧めします(例:スタックのプッシュとポップ)。以下のコメント]


10
間違いなく、すべての開発者がコメントを読むわけではないため、副作用のあるゲッターの名前をより明確に変更する必要があります。
akf 2009年

これは問題ありませんが、APIのユーザーは、副作用があったとしても、文書化されていたことを知る必要があります。
oxbow_lakes 2009年

akf、私は投稿後に正確にそれを考えていました:)私はそれを私の応答に追加すると思います。
Gopherkhan 2009年

1
しかし、「愚かな」ゲッターとセッターを文書化しない場合(それも私が好むものです!)-欠落しているjavadocに関するEclipseの警告をどのように取り除くのですか?そのような警告でワークスペースを乱雑にしたくありませんが、他のすべてのメソッドでその警告を無効にしたくありません...
Zordid

12

コメントが(ブラウザから)JavaDocsとして表示されたときに人々に何を見てほしいと思うかを自問してください。多くの人々は、それが明白であるため、文書化は必要ないと言っています。フィールドがプライベートの場合、これは保持されません(プライベートフィールドのJavaDocsを明示的にオンにしない限り)。

あなたの場合:

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

給与が何で表されているのかはっきりしていません。それは、セント、ドル、ポンド、人民元ですか?

セッター/ゲッターを文書化するとき、何をエンコードから分離するのが好きです。例:

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

最初の行は高さを返すと言っています。戻りパラメーターは、高さがメートル単位であることを示します。


1
私はあなたに同意しますが、関数のコメントが、不適切に選択された、明示的ではない関数名を示していないことを確認する必要があると思います。
karlipoppins 2010

私はJavaDocsの大きな支持者ですが、自己文書化コードの大きな支持者でもあります。したがって、少なくともセッターについては、public void setSalary(float aud)(またはより現実的にはpublic void setSalary(BigDecimal aud))のようなことを行います。さらに良いことに、プロパティはである必要がありabstract class CurrencyAmount、それは順番にプロパティjava.util.Currency currencyandを持っていますjava.math.BigDecimal amount。私が一緒に働いたほとんどの開発者はJavaDocでひどく怠惰ですが、このようにAPIを強制することでこれは問題を少なくします。
Michael Scheper 2013年

単位がメートル/秒のようなSI単位の場合、ドキュメント化の必要性は少なくなります。Siユニットでない場合は、ドキュメント化するか、非標準の単位を含めるように名前を付ける必要があります。たとえば、heightFeet
AlexWien

8

フィールドの値とゲッターとセッターからの参照にコメントを付けるための参照タグを含めないのはなぜですか。

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

public String getFoo() {
  return foo;
}

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

そのため、ドキュメントはフィールドだけでなくゲッターとセッターにも適用されます(プライベートjavadocsがオンになっている場合)。


同意する。そして、私は気づきましたが、なぜこの定型文をとにかく書くのですか?Project Lombokに関する私の回答を参照してください。
Michael Scheper、2014

7

この種のボイラープレートは、Project Lombokを使用することで回避できます。たとえフィールド変数であっても、それを文書化し、privateLombokアノテーションに適切に文書化されたゲッターとセッターを生成させます。

私にとって、このメリットだけでもコストに見合う価値があります


4

包括的な文書化は時間の無駄だと基本的に言っている答えに本当にがっかりしています。ドキュメントで明確に述べられていない限り、APIのクライアントは、呼び出されたメソッドsetX標準のJavaBeanプロパティセッターであることをどのようにして認識すべきですか?

ドキュメンテーションがなければ、呼び出し側は、メソッドに何らかの副作用があるかどうか、どのような規則に従っているのかを理解する以外に、まったくわかりません。

ここで呼び出されたメソッドsetXがプロパティを設定するだけではなく、はるかに多くのことを実行する困難な方法を見つけたのは、私だけが不幸なことではないでしょう。


11
ドキュメンテーションがなければ、呼び出し元はsetXと呼ばれるメソッドがXを設定すると想定します。したがって、setXが実際にXを設定し、他に何も重要でない場合は、ドキュメンテーションは必要ありません。
mqp 09年

それは素晴らしいことです!APIをコーディングしているこの会社はCrudTechですか、あなたの慣例に従っていますか?うーむ
oxbow_lakes

5
メソッドがpriceプロパティの値を設定するだけの場合は、setPrice docに「sets the price」を記述する意味はありませんが、たとえば、totalPriceプロパティを更新して税を再計算する場合、そのような動作は明らかに文書化する必要があります。
ジョアン・マーカス

8
あなたは「これはあなたが期待することをする」と述べる文書を求めているようです。一杯のコーヒーに「注意:HOT」と書くのと少し似ています。完璧な世界では、そのようなことを言う必要はないでしょう。
Kevin Panko、2010

1
はい-などのメソッドsetXが予期した以外の副作用を伴うAPIを使用していたので、これが完全な世界ではないことを確信を持って述べることができます。
oxbow_lakes 2010

4

ゲッター/セッターに特別な操作がない場合、通常は次のように記述します。

Javadoc(プライベートオプションあり)の場合:

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

および/または

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

Doxygenの場合(プライベート抽出オプションあり):

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

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

2
このアプローチの問題は、Javadocがデフォルトで非公開ドキュメントを生成しないことです。その場合{@see #salary}、生成されたドキュメントでは参照タグは無効です。
JarekPrzygódzki2012年

1

アクセサにコメントを付けることは、特にどこでも操作を行わない場合は不要であり、指先の無駄です。

コードを読んperson.getFirstName()でいる人が人の名を返すことが理解できない場合は、自分の力であらゆることを試みて解雇する必要があります。それがデータベースの魔法をかけ、いくつかのサイコロを投げ、名の秘書を呼び出して名を取得した場合、それが重要な操作であると想定して、それを文書化することは安全です。

一方、あなたperson.getFirstName()の人の名が返されない場合は、まあ、そこに行かないでください。


6
getFirstName()がnullを返すとどうなりますか?それはどこに文書化されますか?
スティーブクオ

security.getFinalMaturity()はどうですか?すべてのプロパティ名がすぐに理解できる意味を持つわけではありません。それが何を意味するのか知らないために解雇されたいですか?
マイケルボルグワート

メソッドがスウィズリングによって実装されている場合はどうなりますか?それが明確に文書化されていない限り、どうやってそれを知ることになっていますか?それが標準のセッターであることを、ドキュメントがそうでない限り、どうやってあなたはそれを知っているはずですか?
oxbow_lakes 2009年

2
get / setは私の意見ではゲッターとセッターのために予約されるべきです。データベースルックアップには、「lookupPerson」などの名前を付ける必要があります。
するThorbjörnRavnアンデルセン

1

フィールド名が内容を十分に説明している場合は、何も入力しないでください。

一般に、コードは自立させ、可能な場合はコメントを避けます。これには、リファクタリングが必要な場合があります。

編集:上記はゲッターとセッターのみを指します。些細なことはすべて適切にjavadocで処理する必要があると思います。


1
コメントと文書化には違いがあります。
トム・ホーティン-タックライン

1
とても本当です。だからこそ、私がゲッターとセッターにコメントしないのはそのためです。それらは自明である必要があり、コメントを追加すると、コードは自明ではないことが示されます。
するThorbjörnRavnアンデルセン

0

特にフィールドの内容を示すコメントをフィールド宣言に配置する場合は、(b)の部分に入力しても問題ありません。


よくありません-人々はフィールドのコメントを読みません。Javadocは、デフォルトではプライベートドキュメントも生成しません。また、メソッド呼び出しでクイックヘルプを使用する場合、IDEはフィールドドキュメントを表示しません。
Trejkaz

必要がない限り、人々はフィールドのコメントを読みません。必要が生じたら、情報が多いほど良いでしょう。
akf

0

javadocが何も追加しない場合は、javadocを削除して、自動生成されたコメントを使用します。


0

私は常に両方を記入します。タイピングに費やされた追加の時間はごくわずかであり、一般に、多くの情報は少ないよりも優れています。


「これはプロパティセッターです」と言った場合にのみ、説明がわかります。それ以外の場合、APIのクライアントは、メソッド内で実際に何が起こっているのか
まったくわかり

1
誰もが自明のことについて何か言った?
ポール・ソニエ、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.