3

オブジェクトのプロパティ/属性/メンバーを返すメソッドに名前を付けるための経験則は何ですか? オブジェクトに不変の品質「blarg」がある場合、その品質を返すメソッドは「blarg()」または「getBlarg()」と呼ばれるべきですか? たとえば、Java API には一貫性がありません。ほとんどのプロパティは「get」メソッド (対応する「set」メソッドがないものも含む) を介してアクセスされますが、Object の代わりに Object.hashCode() のようなものもあります。 getHashCode()。

更新: プロパティがフィールドであるかどうか (実装において) は、ここで決定子になる必要がありますか? 2 次元空間の不変点を表すクラスはどうでしょうか? ポイントが (x,y) または (r,theta) として格納されているかどうかに関係なく、4 つのプロパティすべてに対してアクセサーが必要です。それらは getX()、getY() など、または単に x()、y() などにする必要がありますか? ユーザーの観点からすると、実装についてユーザーに知られたくない/気にしたくないので、4 つすべてが同じ命名規則を持つべきではありませんか?

4

12 に答える 12

3

言語によって異なります。

Smalltalk では、getter は blarg、setter は blarg: という慣習があります。

Java では、JavaBeansの規則は getBlarg() および setBlarg() です。さらに、ブール型プロパティの isBlarg() 。

ゲッターとセッターの両方がない場合について言及しています。一部のプロパティは読み取り専用であるため、これは理にかなっています。

規則に従うと、他の人がより簡単に読めるコードが得られます。時々ツールのサポート。たとえば、多くのツールは JavaBeans 規則を認識します。

JavaBeans の規則は、Java 1.1 まで策定されませんでした。すべての Object メソッド (hashCode() など) はそれよりも前のものです。また、下位互換性のために変更することはできません。

于 2008-11-17T20:26:48.567 に答える
2

最も頻繁に使用される規則は次のとおりだと思います。

GetBlarg() or getBlarg()

GetHashCode()オブジェクトには呼び出されるフィールドがなく、計算されるため、名前が間違っていると主張することができますhashcode

もちろん、これらはすべて規則であり、規則ではありません。それらのほとんどは長い年月をかけて進化してきたため、100% 一貫しているわけではありません。

よろしく
K

于 2008-11-17T20:12:21.513 に答える
1

メソッドがプロパティへのアクセス以外に何もしない場合は、getProperty規則に従います。このルールの一般的な例外は、ブール値にアクセスしている場合、慣習としてisProperty.

于 2008-11-17T20:15:25.360 に答える
1

プロパティのネイティブな概念を持つ言語 (Java にはありません) では、アクセサー (get または set) に副作用がなく、相対的にパフォーマンスが高く (長時間実行されない)、同じ値を返す場合にプロパティを使用する必要があります。各呼び出し、または他のプロパティに依存しない (コンテキスト依存)。これらのいずれかが当てはまる場合は、GetXxx または SetXxxx という名前のメソッドを使用する必要があります。「Xxx」は、そうでない場合はプロパティ名になります。

于 2008-11-17T20:43:59.810 に答える
1

ここで他の投稿者に同意しないために、私は通常、名前 (「blarg」) をプロパティとして使用するだけで得られる直感的な API を好みます。オブジェクト指向プログラミングについて学ぶとき、それは通常教えられることです。たとえば、「車」クラスと「エンジン」クラスの古典的な例では、車にはエンジンがあり、それは次のように見えることを教えられます。 :

car.engine

よりも理解しやすいので、それが彼らが使用するものです

car.getEngine

ほとんどの普通の人は、「getEngine とは何ですか?」と言うでしょう。車には getEngine がなく、エンジンがあります。私の経験では、これによって一時的な混乱が生じる可能性があるケースよりも、昔ながらの人間の可読性が全体的に向上したことの方がはるかに重要です。これは単なる私の意見であり、一般的に Java プログラミングの粒度に反しますが、正直なところ、それは Java プログラミング全般について私が気に入らない点の一部です。;)

于 2008-11-17T20:21:34.897 に答える
0

getBlarg() (または isBlarg()) 規則に固執する必要があると思いますが、これがプロパティを取得するためだけのものではないことを認識している必要があります。

それらが get...() と名付けられた理由は、それが単純なプロパティであろうと計算された属性であろうと、オブジェクトの特性にアクセスするプロセスを表すためです。

したがって、IMO では getHashCode() である必要がありました;) が、下位互換性の理由から、John が指摘するように、hashCode() のままになります。

于 2008-11-17T20:34:42.887 に答える
0

ブール値の場合、規則は「isBlarg()」です。

于 2008-11-17T20:16:00.647 に答える
0

私の意見では、IsFoo 規則は最悪です。ハンガリー語表記で追加しています。2 値ロジックから 3 値ロジックを使用するクラスに変更する場合は、メソッドの名前を変更する必要があります。コンパイラーでの入力を維持し、命名は避けてください。

于 2008-11-17T20:23:36.200 に答える
0

Objective-C には、クラスを Key-Value Coding に準拠させるアクセサ メソッドの命名に関する「厳密な」規則があります。

foo のセッターは常に setFoo と呼ばれます。

[obj setFoo:newFoo];

getter は、次の 3 つの選択肢のいずれかになります。

[obj foo];
[obj getFoo:otherFoo];
[obj isFoo];

1 つ目は、アクセサーが属性または属性のコピーを返すインスタンスです。2 番目は、アクセサーが引数を取り、属性をこの変数 (通常はポインター参照) に配置する場所であり、3 番目は、属性 foo がブール型である場所です。

これを使用する Objective-C の利点は、キー パスを使用して属性にアクセスでき、アクセサーを使用し、アクセサーが見つかるまでさまざまな形式のアクセサーを検索することです。

temp = obj.foo;

上記の命名スキームに従っている限り、これはアクセサーを使用します。


Python では、別のスキームを使用します。プロパティ表記を介してアクセスするプロパティの場合:

class Class:

    def get_x(self):
        return self._x

    def set_x(self,x):
        self._x = x

    x = property(get_x, set_x)

メソッド呼び出しを使用したい場合は、次を使用します。

get_thing()
于 2008-11-18T01:47:07.233 に答える