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