ゲッターとセッターを明示的に「get…」および「set…」と命名することの利点は何ですか?
-
22-07-2019 - |
質問
これは他の誰かにランク付けされていますか?もっと見たいです:
block.key(newKey); // set the key for this block
and
testKey = block.key(); // look up the key for this block
より
block.setKey(newKey); // set the key for this block
testKey = block.getKey(); // look up the key for this block
最初に、「セット」および" get"冗長です(したがって、読みやすさを低下させるノイズが追加されます)。アクション(set / get)は、各ステートメントの構文によって定義されます。オーバーロードを理解しています。実際、同じ正確な識別子を使用すると、これらがオブジェクトの同じプロパティであることが強化されます。 " getKey()"を読んだときおよび" setKey()"よくわからないかもしれません。
2番目、" get"の場合および「設定」 setterおよびgetterとして厳密に解釈される必要がある場合、値の設定/取得に関連する他のセマンティック、たとえば副作用は驚くべきことです。
このバイアスは、Smalltalkのバックグラウンドから来ていると思いますが、ポリモーフィズムがうまく機能する世界では、「get」を使用しないほうがましではありません。および「設定」どこにでも散らばっていますか?これらの3文字を何度も入力する必要がなければ、さらに多くのコードを入力できると考えてください。 (頬にやや舌)
誰でも同じように感じますか?
解決
アクセサの前に" get"を付けるおよび「セット」を持つミューテーター言語ごとに異なるプラクティスであり、Javaで広く普及しているようです。例:
- Pythonでは、プロパティの概念があるため、アクセサーは
obj.foo
のようになり、ミューテーターはobj.foo = bar
のようになります(偶数メソッドはバックグラウンドで呼び出されます)。同様の概念は、Rubyなどの言語にも存在します。そのため、多くの言語では、アクセサーとミューテーターへの呼び出しは、直接の「呼び出し」のように見えます。インスタンス変数に追加すると、「setFoo」のようなものは表示されません。または" getFoo"。 - Objective-Cなどの言語では、アクセサーの前に" get"を付けないため、Objective-Cでは
[obj foo]
や[obj setFooのような呼び出しが表示されます:bar]
。
Javaのアクセサの前に" get"を付ける習慣は好きではありませんでしたが、ミューテータの前に" set"を付けるメリットはあります。とはいえ、一般的な慣行は「get」/「set」という接頭辞を付けることです。 Javaでは、自分のコードでトレンドを継続します。
他のヒント
C#の設計者は明らかに同意し、「C#」タグはStackOverflowの2:1で次に人気のある言語を上回っています。あなたは合唱団に説教しているのではないかと思います。
いくつかの言語には、ゲッターとセッターを処理するさまざまな方法があります。 JavaにはgetNameとsetNameがあり、QtにはnameとsetNameがあります。私はこれらの理由からJavaの方法を好みます:
- ドライブと呼ばれる機能がある場合はどうなりますか?クラスが運転する原因になりますか、それともドライブを設定/取得しますか?
- 提案をオンにすると、getと入力して、すべてのゲッターを取得できます。これは、必要なゲッターの名前を覚えていない場合に非常に便利です。
- 理由1に基づいて、機能を異なるグループに分けます。あなたは何かをする関数を持っていますが、それらはgetまたはsetで始まりません(おそらくdoで始まるべきですか?)。次に、プロパティを取得する関数があり、それらはすべてgetで始まります。次に、プロパティを設定する関数があり、それらはすべてsetで始まります。
私にとっては、 get
と set
のプレフィックスにより、コードを読むときの頭の働きが少なくなります。一貫して使用すると、 get
/ set
メソッドによりヘッダーのgrepが簡単になり、クラスの学習が容易になる可能性があります。つかいます。私は、コードの読み取りとコードの書き込みに比べて不均衡に長い時間を費やしているため、 get
と set
の余分な文字は私には問題ありません。
現在、Java言語にはプロパティがないため、getter / setter構文が事実上の標準になっています。 Javaコードを記述している場合は、Java規則を使用しても十分です。これは、他のプログラマがあなたのコードを読むことができるというだけではありませんが、さらに重要なことは、 Java Bean スタイルのゲッター/セッター。
たとえば、 Velocityテンプレートエンジンでは、次のように記述できます。
The answer is $block.key
上記は呼び出しを試みます:
block.getkey();
block.getKey();
block.getKey()を定義した場合、すべて正常に動作します。一般的に、言語の規則に従うのが最善です。
一般に、プロパティ名は名詞である必要がありますが、メソッド名は動詞である必要があるため、上記の例のプロパティは「driver」、メソッドは「drive」になります。もちろん、オーバーラップがある場合もありますが、一般にこれは機能し、コードを読みやすくします。
C ++では、オーバーロードを使用しています
int parameter() const { return m_param }
void parameter(int param) { m_param = param; }
はい、javaでのget / setは基本的に言語の問題の回避策です。
c#プロパティとの比較
http://www.csharp-station.com/Tutorials/Lesson10.aspx
またはpython http://blog.fedecarg .com / 2008/08/17 / no-need-for-setget-methods-in-python /
これはjavaの最大の障害の1つだと思います。
C#のゲッターとセッターは「ファーストクラス」です;エンティティであり、構文的には関数呼び出しに似ていません(ただし、任意のコードはアクセサーのコンテキストで実行できます)。
Objective-Cなど、強制的に使用する言語でのみget / setを使用します。
getDrive()
または setDrive()
への参照をコードベースで簡単に検索できます。メソッドの名前が単に 'drive'である場合、検索時にさらに多くの誤検知が発生します。
聞いて、聞いて。
ゲッターとセッターの特別な表記法は本当に好きです。 CLUはこれを最善にした:
-
式で
p.x
を使用することは、get_x(p)
を呼び出すことと同等でした。 -
p.x:= e
(割り当て)の使用は、set_x(p、e)
の呼び出しと同等でした。
オブジェクト p
のインターフェースが get_x
または set_x
をエクスポートしなかった場合、対応する操作を実行できませんでした。シンプル。
構文糖衣について聞いてみましょう!