「プロパティ」を構成するものは言語固有の質問であり、「プロパティ」の呼び出し元が期待するものは言語固有の質問でもあるため、これには言語に依存しない答えはないと思います。これについて考える最も実り多い方法は、発信者の観点からそれがどのように見えるかを考えることだと思います。
C#では、プロパティは(メソッドのように)大文字で表記されますが(パブリックインスタンス変数のように)括弧がありません。次のコードがあり、ドキュメントがない場合、何を期待しますか?
var reciprocalHeading = myHeading.Reciprocal;
相対的なC#初心者ですが、MicrosoftのProperty Usage Guidelinesを読んでいる人として、私はReciprocal
とりわけ以下を期待しています。
Heading
クラスの論理データメンバーである
- 安価に電話をかけ、値をキャッシュする必要がない
- 目に見える副作用がない
- 連続して2回呼び出された場合、同じ結果を生成します
- (たぶん)
ReciprocalChanged
イベントを提供する
これらの仮定のうち、(3)と(4)はおそらく正しい(ユアンの答えのHeading
ように不変の値型であると仮定)、(1)は議論の余地があり、(2)は不明だが議論の余地があり、(5)はそうではない(どんなかかわらセマンティック意味を成している見出しをおそらく持つべきイベントを)。これは、C#APIでは「逆数の取得または計算」をプロパティとして実装すべきではないことを示唆していますが、特に計算が安価で不変である場合は、境界線の場合です。HeadingChanged
Heading
(ただし、これらの懸念は、プロパティの呼び出しが新しいインスタンスを作成するかどうかとは関係がないことに注意してくださいなく、(2)でもないことに。CLRでのオブジェクトの作成自体は、かなり安価です。)
Javaでは、プロパティはメソッドの命名規則です。見たら
Heading reciprocalHeading = myHeading.getReciprocal();
私の期待は上記のものと似ています(それほど明確に設定されていない場合):呼び出しは安価で、べき等で、副作用がないことを期待しています。ただし、JavaBeansフレームワークの外では、「プロパティ」の概念はJavaでそれほど意味がありません。特に、対応するのない不変のプロパティを検討するsetReciprocal()
場合、getXXX()
慣習はやや古くなりました。Effective Javaから、第2版(すでに8年以上前):
boolean
呼び出されたオブジェクトの非関数または属性を返すメソッドは、通常、名詞、名詞句、または動詞get
…で始まる動詞句で名前が付けられます。3番目の形式(で始まるget
)のみが受け入れられると主張する発言者がいますが、この主張の根拠はほとんどありません。通常、最初の2つの形式ではコードが読みやすくなります(p。239)
そして、現代的でより流fluentなAPIでは、
Heading reciprocalHeading = myHeading.reciprocal();
-これもまた、呼び出しが安価でべき等であり、副作用がないことを示唆しますが、新しい計算が実行されるか、新しいオブジェクトが作成されるかについては何も言いません。これは問題ありません。良いAPIでは、気にする必要はありません。
Rubyでは、プロパティのようなものはありません。「属性」はありますが、見れば
reciprocalHeading = my_heading.reciprocal
私は、インスタンス変数にアクセスしてるかどうかを知るの即時方法はありません@reciprocal
経由attr_reader
または単純なアクセサメソッドを、または私は方法それを実行する高価な計算を呼んでいるかどうか。ただし、メソッド名が単純な名詞であるという事実は、言うよりもcalcReciprocal
、呼び出しが少なくとも安価であり、おそらく副作用がないことを示唆しています。
Scalaの命名規則では、副作用のあるメソッドは括弧を使用し、副作用のないメソッドは括弧を使用しませんが、
val reciprocal = heading.reciprocal
次のいずれかです。
// immutable public value initialized at creation time
val reciprocal: Heading = …
// immutable public value initialized on first use
lazy val reciprocal: Heading = …
// public method, probably recalculating on each invocation
def reciprocal: Heading = …
// as above, with parentheses that, by convention, the caller
// should only omit if they know the method has no side effects
def reciprocal(): Heading = …
(Scala は、スタイルガイドでは推奨されていないさまざまなものを許可していることに注意してください。これは、Scalaに対する私の大きな悩みの1つです。)
括弧がないことは、呼び出しに副作用がないことを示しています。この名前も、呼び出しが比較的安価であるべきであることを示唆しています。それを超えて、私は気にしませんそれがどのように価値を得るのか。
つまり、使用している言語を理解し、他のプログラマーがAPIにどのような期待を寄せているかを把握してください。それ以外はすべて実装の詳細です。
Heading
なく、不変の型としてreciprocal
新しいものを返すことHeading
は、「成功の落とし穴」の良い習慣です。(2つの呼び出しの警告でreciprocal
「同じもの」を返す必要があります。つまり、同等性テストに合格する必要があります。)