は、Javaのように、彼らを想定しないし、言うことが、何もしないと予想している - x.getB()
は論理属性b
の現在の値を返しますが、何もしなかった場合、それは驚くだろう、またはx.setB(2)
が何らかの内部作業を行う必要がある場合でも何でもした場合x.getB()
返信2
。
はしかし、何の言語に課さ保証この予想される動作について、名前get
またはset
で始まるメソッドの本体に、すなわち、コンパイラ強制制約はありません。むしろ、それは常識まで残って、社会的慣習、 "スタイルガイド"、およびテスト。
x.b
の挙動がアクセスし、割り当てようx.b = 2
として、(含むがパイソンに限定されるものではない言語のセット)の特性を持っている言語では、ゲッターとセッターメソッドと同じ正確あります例えば、Java:同じ期待、言語強制保証の同じ欠如。
プロパティの最初の勝利は、構文と読みやすさです。例えば、代わりに神々への復讐のために叫んで
x.b += 1
明白なの
x.setB(x.getB() + 1)
を記述すること。プロパティをサポートする言語では、クラスのユーザーがそのようなByzantine定型文の旋律を通過するように強制する正当な理由は全くなく、コードの可読性には何の影響も与えません。
具体的には、getterやsetterの代わりにプロパティ(または他の記述子)を使用することにはもう1つ大きな利点があります。クラスを再編成して基礎となるsetterとgetterがもう必要なくなる場合、クラスの公開されているAPIを破ることなく)単にそれらのメソッドとそれに依存するプロパティを削除して、をx
のクラスの通常の「格納済み」属性にします。
Pythonでは、メソッドを経由せずに直接(実行可能な場合)作業を行うことが重要な最適化であり、プロパティを体系的に使用することで、いつでもこの最適化を実行できます。メソッドおよびプロパティを介してアクセスおよび/または設定時に計算を必要とする)。あなたは、ユーザーのコードの可読性に影響を与える超えたゲッターとセッターの代わりのプロパティを、使用している場合
だから、あなたはもが無償で無駄マシンサイクル(およびそれらのサイクルの中に自分のコンピュータに行くエネルギーがある;-) 、再び何の理由もありません。
プロパティに対するあなたの唯一の引数は、 「外部のユーザーは、割り当ての結果として通常は副作用を期待しません」ということです。 (getterやsetterが普及しているJavaなどの言語で)同じユーザーがセッターを呼び出した結果として(観察可能な)「副作用」を期待しないという事実を忘れている;-)。彼らは妥当な期待です。クラスの作者として、あなたのセッターとゲッターが直接的に、あるいは財産を通して使用されても、違いはありません。目に見える重要な副作用を持つメソッドがある場合は、ではなくという名前を付けてください。getThis
、setThat
、およびプロパティで使用しないでください。
プロパティが「実装を隠す」苦情は全く不当である:最もOOPのすべては、情報隠蔽を実装についてです - 外の世界への論理インタフェースを提示し、それが最善として内部的にそれを実装するためのクラスが責任を作りますできる。ゲッターとセッターは、プロパティとまったく同じように、この目標に向けたツールです。プロパティは、より良い仕事をします(それをサポートする言語で;-)。
あなたは間違っています。 .setB()は、実際のプロパティを持たない言語用のパッチです。 Python、C#およびその他のものはプロパティを持ち、解決方法は同じです。 – liori
私はJavaの方が悪いことを知っています。これはゲッターとセッターをすべての属性に書き込むことです。後ですべてをリファクタリングするのは苦痛だからです。 –
@gnibbler、プロパティをサポートしていない言語(またはプロパティよりもはるかに前のPythonの '__getattr__/__setattr__'などのやや同等の可能性)では、他に" Javaの人 " C++などの言語はカプセル化を維持するために可能性があります)。 –