メソッド名に「get」を使用する場合のベスト プラクティスは何ですか?
質問
Java (C# を含む) の多くの場所で、多くの「ゲッター」メソッドには「get」というプレフィックスが付いていますが、他の多くのメソッドにはプレフィックスが付いていません。Sun がどのようなパターンに従っているのか、私はまったく気づきませんでした。ゲッター メソッド名で「get」を使用する場合のガイドラインやルールは何ですか?
解決
セマンティクスに帰着します。はい、C#には「プロパティ」があります。これは、get / set 'method' stub ...を提供しますが、.Getで始まる.NET Frameworkの関数(..." methods" ...)開発者に、何らかの結果が得られるという唯一の目的のために何らかの操作が行われているという事実を手掛かりにすることになっています。
それはおかしいと思うかもしれませんが、「なぜ人々を手がかりにするために戻り値の型を使用しないのですか?」と言い、答えは簡単です。次の方法を考えてください:
public Person CreatePerson(string firstName, string lastName) {...}
そのメソッドの名前だけで、おそらくデータベースアクティビティが関係していること、そして新しく作成された「人」がわかるでしょう。返されます。
しかし、これについてはどうですか:
public Person GetPerson(string firstName, string lastName) {...}
そのメソッドの名前だけで、おそらく100%" Safe&quot ;;データベースからの個人の取得が行われています。
" CreatePerson"を呼び出すことはありません。複数回...しかし、あなたは" GetPerson"を呼び出しても安全だと思うはずです ずっと。 (アプリケーションの「状態」には影響しないはずです。)
他のヒント
" get"および「設定」 Javaのプレフィックスペアは、もともとはJava Beanを示すための規則として使用されます。 Javaは、C#とは異なり適切なプロパティを持たないため、後でカプセル化規則になります。
のベストプラクティス ジャワ プロパティの get および set プレフィックスを使用することです。
フレームワーク、タグ ライブラリなどは、これらのプレフィックスを持つメソッドを検索し、プロパティとして使用します。
したがって、次のような Java クラスがある場合は...
public class User{
private String name;
public String getName(){ return name;}
public void setName(String name){ this.name = name; }
}
..struts-tags (またはその他の ognl ベースのタグ ライブラリ) を使用すると、name プロパティにアクセスします。 user.name
.
Spring フレームワークでも、XML 構成ファイルでこの規則が使用されます。
Javaは(まだ)プロパティをサポートしていません。ゲッターとセッターはこれを回避するための手掛かりです。 C#を含む他の言語はプロパティをサポートしているため、代わりにこれらを使用する必要があります。これは単なる「ベストプラクティス」ではありません。どちらか:C#でのシリアル化は、ゲッターではなくプロパティに依存します&クラスをシリアル化する必要がある場合、プロパティを使用しないと将来的にあらゆる種類の問題につながる可能性があります。
プロパティの利点は、コードを読みやすくすることです。次のようなもの
obj.setX(10);
Javaでは、
obj.X = 10;
まだ舞台裏では、Xは変数ではなくメソッドなので、ダーティな入力チェックなどを実行できます。
個人的には次のルールが好きです:
- 対応する
set
メソッドで値を直接変更できる場合は常に、get
プレフィックスを使用します - 値をプロパティとして直接設定できない場合(つまり、同等のsetXXXメソッドがない場合)に、
get
プレフィックスを削除します
2番目のケースの理由は、値が実際にユーザー設定可能な「プロパティ」ではない場合です。そのため、メソッドのget / setペアは必要ありません。含意は、この規則に従っている場合にgetXXXメソッドが表示されると、setXXXメソッドの存在も想定できることです。
例:
-
String.length()
-文字列は不変なので、長さは読み取り専用値です -
ArrayList.size()
-要素が追加または削除されるとサイズが変わりますが、直接設定することはできません
APIはしばしば、 get
プレフィックスなしで読み取り専用プロパティを公開することがよくありました: String.length()
、さらに新しい Buffer.capacity()
合理的な例である。
これの利点は、綿毛が少なくなることです。欠点は、規則に基づいてプロパティを自動的に決定しようとするものは何もそれらを発見しないということです。個人的には、接頭辞を含める側の間違いを傾向します。
もちろん、C#では、「本物」が存在するため、ほとんど無関係です。とにかくプロパティ:)
状況によります。多くの場合、プロパティのない言語でも冗長な情報です。
C ++では、getAttr()/ setAttr()ペアの代わりに、Attr()関数の2つのオーバーロードを提供するのが一般的です。 void Attr(Foo f); //セッター Foo Attr(); //ゲッター
Javaでは、get / setのプレフィックスを付けるのが一般的です。 ベストプラクティスは、あなたの言語の標準に沿ったものにすることです。 Javaでは、人々はget / setプレフィックスを見ることを期待しているので、それらを省略すると、厳密に必要ではないにもかかわらず、人々を混乱させる可能性があります。
Objective C 2.0は、同じドット構文を使用してプロパティも使用します。
それ以前は、ゲッターとセッターにわずかに異なる命名スキームを使用していました(当然ながら、プロパティで使用したり、古い属性に使用したりできます)。
value = [obj attr];
[obj setAttr:value];
[obj getAttr:&value];
つまり、getは別の方法で使用されます。値を返しませんが、渡された変数に結果を保存します。
典型的なゲッターは属性と同じ名前を持ち、セッターは(Javaの慣例に従って)setが前に付いた属性です。これらの規則はKVO(Key-Value Observation)システムで使用されるため、遵守する必要があります。
ちょっとした補遺:もう1つの規約は、ブールフィールドのゲッターに「is」というプレフィックスを付けることです。 「get」の代わりに、例えば bool isEnabled(){return enabled; }