12

明確な明快さは別として、なぜ固執する必要があるのか​​:
car.getSpeed()そしてcar.setSpeed(55)
、これがいつ使用できるのか: car.speed()そしてcar.speed(55)

get() と set() は、すべてを 1 か所にまとめることで、データ メンバーへの変更を管理しやすくするのに役立つことを知っています。

また、明らかに、私はcar.speed()car.speed(55)同じ関数であることを理解していますが、これはこれを間違っていますが、PHP と Zend Framework でも同じアクションが GET、POST、ポストバックに使用されます。
VB と C# には「プロパティ」があり、私が聞いた純粋主義者の嫌悪感に満ちた多くの人によって使用されています。Ruby には and などがあり5.timesます。また.each、 演算子のオーバーロード、多重継承、仮想関数があります。 C++ の特定の組み合わせは、誰をも狂わせる可能性があります。.to_i

私が言っているのは、非常に多くのパラダイムと方法があり、私が言及した特定の組み合わせを誰も試していないのは奇妙に思えるということです.

私の理由は、コードを読むのが短くてきれいだからです。
私は非常に間違っているのでしょうか、少し間違っていますか?

それでも正しいままでいることにした場合は、car.speed()andを使用できますcar.setSpeed(55)
それは何らかの形で間違っていますか(「get」を省略しただけです)?

説明をありがとう。

4

12 に答える 12

10

car.speed() を呼び出した場合、車にスピードを出すように、つまり速度を上げて速度制限を破るように指示していると思うかもしれません。明らかにゲッターではありません。

一部の言語では、const オブジェクトを宣言できるため、オブジェクトのデータを変更しない関数の呼び出しのみに制限されます。そのため、変更操作と読み取り操作には別の関数が必要です。パラメータにオーバーロードを使用して 2 つの機能を持たせることもできますが、混乱を招くと思います。

また、あなたが読みやすいと言うとき、私はそれを読む方法を理解するために先を見なければならないと主張することができます:

car.speed()

「車速…」と読んでみると、数字がないので「車速を出そう」と修正。

car.getSpeed()

「この車のためにスピードを出せ」を読みました

car.setSpeed(55)

「この車の場合、速度を55に設定してください」と読みました

基本的に、言語の他の機能を混乱させるものとして引用し、それをゲッター/セッターをより混乱させるための防御として使用したようですか? あなたが提案したことがより混乱していることを認めているように聞こえます。これらの機能は、汎用性が高いため、混乱することがあります。抽象化はより混乱を招くこともありますが、最終的には再利用性を高めるという目的に役立つことがよくあります。speed() と speed(55) を支持する議論をしたいのであれば、それがプログラマーに新しい可能性をどのように可能にするかを示したいと思うでしょう。

一方、C#には、使用されているコンテキストに応じて、プロパティがゲッターまたはセッターとして異なる動作をするため、あなたが説明したようなものがあります。

Console.WriteLine(car.Speed); //getter

car.Speed = 55 //setter

しかし、これは単一のプロパティですが、取得と設定を実装するための 2 つの別個のコード セクションがあり、プロパティの () が省略されているため、これが getter/setter であり、関数の速度ではないことは明らかです。したがって、car.speed() は明らかに関数であり、car.speed は明らかにプロパティの getter です。

于 2010-01-12T19:43:06.460 に答える
8

私見 get および set メソッドのシンタックスシュガーとしてプロパティを持つC#スタイルは、最も表現力豊かです。

于 2010-01-12T19:31:37.517 に答える
4

私は、ゲッターやセッターよりも操作をカプセル化するアクティブオブジェクトを好むので、意味的に豊富なオブジェクトを取得できます。

たとえば、ビジネスオブジェクトではなくADTvectorですが、C++でも対関数があります。

size_type capacity() const // how many elements space is reserved for in the vector  
void reserve(size_type n)  // ensure space is reserved for at least n elements 

void push_back ( const T& ) // inserts an element at the end
size_type size () const     // the number of elements in the vector

車を運転する場合は、アクセル、クラッチ、ブレーキ、ギアの選択を設定できますが、速度は設定しません。スピードメーターから速度を読み取ることができます。動作のあるオブジェクトにセッターとゲッターの両方が必要になることは比較的まれです。

于 2010-01-12T19:56:45.323 に答える
3

There is no right answer, it's a matter of style, and ultimately it does not matter. Spend your brain cycles elsewhere.

FWIW I prefer the class.noun() for the getter, and class.verb() for the setter. Sometimes the verb is just setNoun(), but other times not. It depends on the noun. For example:

my_vector.size() 

returns the size, and

my_vector.resize(some_size) 

changes the size.

于 2010-01-12T20:30:15.460 に答える
3

参考までに、Objective-C ではcar.speed()and car.setSpeed(55)(別の構文を除き、[car speed]and [car setSpeed:55].

それはすべてコンベンションについてです。

于 2010-01-12T19:34:56.290 に答える
1

これは、Javaにはゲッターとセッターの規則があります。C#にはプロパティがあり、Pythonにはパブリックフィールドがあり、JavaScriptフレームワークは取得にfield()を使用し、設定にfield(value)を使用する傾向があります。

于 2010-01-12T19:59:41.260 に答える
1

コードの最終的なベンチマークは次のようになります。

  1. 正しく動作しますか?
  2. 壊れたら簡単に直せる?
  3. 将来的に新しい機能を追加するのは簡単ですか?
  4. 他の誰かが入って修正/強化するのは簡単ですか?

これらの 4 つの点がカバーされている場合、なぜ誰かがそれに問題を抱えているのか想像できません。「ベスト プラクティス」のほとんどは、通常、これら 4 つのポイントを達成することを目的としています。

自分に合ったスタイルを使用してください。一貫性を保つだけで問題ありません。

于 2010-01-12T19:45:30.733 に答える
1

プロパティへの groovy なアプローチは非常に優れています。http://groovy.codehaus.org/Groovy+Beans

于 2010-01-12T19:37:16.850 に答える
1

これは単なる慣例の問題です。Smalltalk では、あなたが提案した方法で行われますが、それについて誰かが不平を言うのを聞いた覚えがありません。車の速度を取得するのはcar speedで、車の速度を 55 に設定するのは ですcar speed:55

あえて推測すると、このスタイルが普及しなかった理由は、オブジェクト指向プログラミングが私たちにもたらされた 2 つの行 (C++ と Objective-C) にあると言えます。C++ では (その歴史の早い段階で)、メソッドは C 関数と非常に密接に関連しており、C 関数は慣習的に の行に沿って命名され、setWhatever()さまざまな数の引数のオーバーロードを持たないため、一般的な命名スタイルが維持されています。 . Objective-C は主に NeXT (後に Apple になった) によって保持され、NeXT は API の冗長性を優先する傾向があり、特にさまざまな種類のメソッドを区別する傾向がありました。明確にするために。これが、最近の Objective-C の事実上の標準ライブラリである Cocoa の慣習になりました。

于 2010-01-12T19:49:28.410 に答える
0

.() は動詞であることを意味します。no () は名詞であることを意味します。

   car.Speed = 50;
   x = car.Speed
   car.Speed.set(30)
   car.setProperty("Speed",30)

しかし

   car.Speed()

速度制限を超えるコマンドを意味します。

于 2010-01-15T15:23:14.727 に答える
0

明確な明快さは別として、car.getSpeed() および car.setSpeed(55) に固執する必要があるのは、これも使用できる場合: car.speed() および car.speed(55)

私が遭遇したすべての言語でcar.speed()car.speed(55)構文に関しては同じだからです。そのように見ただけで、どちらも値を返す可能性がありますが、後者がセッターであることが意図されている場合、これは当てはまりません。

于 2010-01-12T19:38:51.697 に答える
0

セッターを呼び出すつもりで、引数を入れるのを忘れたらどうしますか? コードは有効であるため、コンパイラは文句を言わず、すぐに実行時エラーをスローしません。それはサイレントバグです。

于 2010-01-12T20:50:44.503 に答える