どのような状況でも、クラス内のクラスのゲッター/セッターを使用する必要がありますか?
4 に答える
ゲッター セッターは通常、フィールドに直接アクセスする内部からクラスの外部から使用されます。主な利点/目的は、ゲッター セッターのカプセル化です。
ゲッター セッターに論理コードがある場合は、それを使用します。
例えば :
public void setValue(int val){
if(val > 100)
this.val = 0;
else
this.val = val;
}
こちらもご覧ください
はい、ゲッターとセッターは便利です。PHP は int や string などの単純な型の型ヒントをサポートしていないため、値を強制的に正しい型にすることはできません。
セッターを使用すると、設定されている値をいつでも確認できます。int プロパティに設定された値が int でない場合、間違った値を受け入れる代わりに、型キャストするか、エラーを発生させるかを選択できます。
これにより、アプリケーションのデバッグと保守が非常に簡単になります。したがって、これらのチェック以外のロジックがあまり含まれていなくても、ゲッターとセッターを使用することをお勧めします。
@ゴレズトロール
トピックに PHP バッジはなく、あなたは間違っています。あなたが説明していることは、セッターとは何の関係もありません。セッターだけでなく、任意のメソッドを使用して、(PHP で) パラメーターの型を強制できます。
あなたは書ける:
setX( X $x ){ ...}
setY( Y $y ){ ...}
あるいは単に:
iAmMethodNotASetter( X $x, Y $y){
//20lines of code here end then:
$this->x = $x;
$this->y = $y;
}
ご覧のとおり、オブジェクト プロパティの型を強制するためのセッターは必要ありませんでした。
とにかく、変数の型をチェックした後にセッターでエラーをスローするのは悪い考えです。静的に型付けされた言語から動的に型付けされた言語に移行したプログラマーの一般的なエラーです。
セッターとゲッターは規約であり、何も強制しません! 今日、私たちは通常それらを Plain Old Java Objects の作成に使用しています。(POJO - php の単語では POPO) したがって、ライブラリまたはプロジェクト間で使用できるオブジェクトを作成するための慣習 (標準) にすぎません。
セッターを型チェックなどと組み合わせることができますが、それ以上のものにはなりません。
カプセル化について:
@org.life.java - ジガル・ジョシ
「主な利点/目的は、ゲッター セッターのカプセル化です。」
@ピーター・アレクサンダー
「ゲッターとセッターは、クラス内を含むほぼすべての場所で使用する必要があります。そうしないと、カプセル化が壊れている可能性があります」「ゲッターとセッターはカプセル化されています」
違う、違う、違う。カプセル化はゲッターとセッターとは何の関係もなく、非常によくある間違いです。逆さまに何度も繰り返される記事がたくさんあることは知っています...
ゲッターとセッターはカプセル化をさらに悪化させるのに役立ちません。カプセル化を破る可能性があります。それらは、オブジェクトに独自のデータで何かを行うように依頼するのではなく、オブジェクトからデータを取得するためにそれらを使用するときにそうします。
カプセル化 == オブジェクトはそのデータに対して全責任を負い、行データを提供しません。そして、プライベート プロパティの getter は、そのプロパティを複雑な方法でパブリックにする == カプセル化を破るものにすぎません。
段落のカプセル化を確認してください: http://en.wikipedia.org/wiki/C%2B%2Bまたはhttp://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 セッターまたはゲッターについて一言も...
クラス内を含め、ほぼすべての場所でゲッターとセッターを使用することになっています。そうしないと、カプセル化が壊れる可能性があり、さらに悪いことに、不変条件が無効になる可能性があります。
C++ での簡単な例として:
class BankAccount
{
public:
void withdraw(int amount)
{
m_balance -= amount;
m_withdrawals++;
}
void transfer(BankAcount& other, int amount)
{
m_balance -= amount;
other.m_balance += amount;
}
private:
int m_balance;
int m_withdrawals;
};
バグが見えますか?transfer
お金を引き出しますが、増加しませんm_withdrawals
。withdraw
これは、残高を手動で減らすのではなく、単純に呼び出した場合に回避できた可能性があります。
同じことがゲッターとセッターにも当てはまります。たとえば、値を遅延して初期化するゲッターがあることは非常に一般的です。別のメンバー関数が初期化されていないメンバーに直接アクセスしようとすると、null ポインターの逆参照が発生します。
基本的に、ゲッターとセッターが必要な機能を提供する場合は常に、ゲッターとセッターを使用するようにしてください。低レベルのことをすればするほど、低レベルのバグが増えます。ゲッターとセッターを使用しないのであれば、それらを記述しても意味がありません。