3

これは他の誰かを怒らせますか?私はむしろ見たい:

 block.key(newKey);  // set the key for this block

 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

まず、「set」と「get」は冗長です(したがって、読みやすさを低下させるノイズが追加されます)。アクション (set/get) は、各ステートメントの構文によって定義されます。過積載はわかります。実際、まったく同じ識別子を使用すると、これらがオブジェクトの同じプロパティであることが強化されます。「getKey()」と「setKey()」を読んだとき、よくわからないかもしれません。

第二に、「get」と「set」がセッターとゲッターとして厳密に解釈される場合、値の設定/取得に関連する他のセマンティック、たとえば副作用は驚くべきものになります。

この偏見は、私の Smalltalk のバックグラウンドによるものだと思いますが、ポリモーフィズムが問題なく機能する世界では、"get" と "set" がいたるところに散らばっていないほうがよいのではないでしょうか? これらの 3 文字を何度も入力する必要がなければ、どれだけ多くのコードを入力できるか考えてみてください! (頬に舌を少し入れる)

同じように感じている人はいますか?

4

11 に答える 11

4

C# の設計者は明らかに同意しており、「C#」タグは StackOverflow で 2 番目に人気のある言語を 2 対 1 で上回っています。聖歌隊に説教をしていると思われます。

于 2009-08-05T01:48:45.533 に答える
4

いくつかの言語では、getter と setter を処理する方法が異なります。Java では getName と setName があり、Qt では name と setName があります。以下の理由から、私は Java の方法を好みます。

  1. ドライブと呼ばれる機能があるとしたらどうでしょうか。それはあなたのクラスにドライブを引き起こしますか、それともドライブを設定/取得しますか?
  2. 候補をオンにして、get と入力すると、すべてのゲッターを取得できます。これは、必要なゲッターの名前を覚えていない場合に非常に便利です。
  3. 理由 1 に基づいて、機能をさまざまなグループに分けます。何かを行う関数がありますが、それらは get または set で開始されません (ただし、do で開始する必要があります)。次に、プロパティを取得する関数があり、それらはすべて get で始まります。次に、プロパティを設定する関数があり、それらはすべて set で始まります。
于 2009-08-05T01:48:52.213 に答える
3

私にとって、get接頭set辞は、コードを読むときの脳の働きを低下させます。get/メソッドを一貫して使用setすると、ヘッダーの grep が容易になり、クラスの学習と使用が容易になる可能性があります。私はコードを読むのとコードを書くのに不釣り合いに多くの時間を費やしているので、 と の余分な文字は私getsetは問題ありません。

于 2009-08-05T01:48:01.293 に答える
3

現在、Java 言語にはプロパティがないため、getter / setter 構文がデファクト スタンダードになっています。Java コードを作成する場合は、Java 規則を使用するのが適切です。これは、他のプログラマーがコードを読み取れるようにするためだけではありません。さらに重要なことは、Java Beanスタイルの getter/setter をサポートするオブジェクトを処理するために、他の何百もの Java フレームワークが構築されていることです。

たとえば、Velocity テンプレート エンジンでは、次のように記述できます。

The answer is $block.key

上記は次の呼び出しを試みます。

block.getkey();
block.getKey();

block.getKey() を定義した場合は、すべて正常に動作します。一般に、言語の規則に従うのが最善です。

于 2009-08-05T02:42:30.643 に答える
2

アクセサーに「get」を、ミューテーターに「set」をプレフィックスとして付ける方法は、言語によって異なりますが、ほとんど Java で普及しているようです。例えば:

  • Python では、プロパティの概念があるため、アクセサは次のようobj.fooに見え、ミューテータは次のように見える場合がobj.foo = barあります (メソッドはバックグラウンドで呼び出されますが)。Ruby などの言語にも同様の概念が存在します。そのため、多くの言語では、アクセサーとミューテーターの呼び出しは、インスタンス変数への直接の "呼び出し" のように見え、"setFoo" や "getFoo" のようなものは見当たりません。
  • Objective-C などの言語では、アクセサーの前に「get」を付けることを推奨していないため、Objective-C では[obj foo]や などの呼び出しが表示されます[obj setFoo:bar]

Java でアクセサーの前に「get」を付ける慣習も好きではありませんでしたが、ミューテーターの前に「set」を付けるメリットはあると思います。とはいえ、Java では "get"/"set" というプレフィックスを付けるのが一般的な慣行であるため、私自身のコードでもこの傾向を続けています。

于 2009-08-05T01:55:09.053 に答える
2

C ++では、オーバーロードを使用するだけです

int parameter() const { return m_param }
void parameter(int param) { m_param = param; }
于 2009-08-05T01:56:58.523 に答える
2

一般に、プロパティ名は名詞にする必要がありますが、メソッド名は動詞にする必要があります。したがって、上記の例のプロパティは「driver」と呼ばれ、メソッドは「drive」になります。もちろん重複する場合もありますが、一般的にはこれでうまくいき、コードが読みやすくなります。

于 2009-08-05T02:02:43.443 に答える
1

はい、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 つだと思います。

于 2009-08-05T01:49:31.620 に答える
0

getDrive()またはへの参照をコードベースで簡単に検索できますsetDrive()。メソッドの名前が「ドライブ」だけの場合、検索時にさらに多くの誤検出が発生します。

于 2009-08-05T02:07:35.200 に答える
0

聞いて聞いて。

ゲッターとセッターの特別な記法が本当に好きです。CLU は次の点で最善を尽くしました。

  • 式で使用p.xすることは、 call と同等でしたget_x(p)

  • (代入)を使用p.x := eすることは、 call と同等でしたset_x(p, e)

object のインターフェースがまたはをpエクスポートしなかった場合、対応する操作を実行できませんでした。単純。get_xset_x

構文糖について聞いてみましょう!

于 2009-08-05T05:57:06.357 に答える
0

C# のゲッターとセッターは "ファースト クラス" のエンティティであり、構文的には関数呼び出しに似ていません (ただし、任意のコードはアクセサーのコンテキストで実行できます)。

私は、Objective-C のように、強制される言語でのみ get/set を使用します。

于 2009-08-05T01:50:59.853 に答える