ホームページ > Java > &#&チュートリアル > オブジェクト指向プログラミングでゲッターとセッターを避けるべき場合は?

オブジェクト指向プログラミングでゲッターとセッターを避けるべき場合は?

Susan Sarandon
リリース: 2024-12-12 18:55:09
オリジナル
927 人が閲覧しました

When Should You Avoid Getters and Setters in Object-Oriented Programming?

ゲッターとセッター: 知恵を絞った設計

ソフトウェア エンジニアリングでは、ゲッターとセッターはそれぞれプライベート変数のアクセサーと修飾子として機能します。これらは優れたオブジェクト指向プログラミングの実践には不可欠ですが、潜在的な設計上の欠点については議論があります。

よくある批判の 1 つは、ゲッターとセッターが不必要なカプセル化違反を引き起こし、操作のために内部変数を公開するというものです。次のコード スニペットを考えてみましょう。

private int score;

public int getScore() { return score; }

public void setScore(int score) { this.score = score; }
ログイン後にコピー

getScore() メソッドではプライベート スコア変数に直接アクセスでき、setScore() では任意の値の割り当てが可能です。これにより、以下のコードに示すように、一貫性のない、または無効な状態変更が発生する可能性があります。

// Attempt to increment score by destroying an enemy
game.setScore(game.getScore() + ENEMY_DESTROYED_SCORE);
ログイン後にコピー

このアプローチは、スコアが恣意的に設定されるのではなく増加するだけの場合、エラーが発生する傾向があります。より適切な設計は、スコア増加操作をカプセル化する専用のメソッドを作成することです。

public void addScore(int delta) { score += delta; }
ログイン後にコピー

セッターを制限し、スコア操作の代替メソッドを導入することにより、この設計はデータの一貫性を確保し、無効な状態遷移を防ぎます。 .

さらに、ゲッターとセッターにより、オブジェクト間の密結合が生じる可能性があります。オブジェクトの「生きている」ステータスが setter メソッドと getter メソッドによって制御される次の例を考えてみましょう:

private boolean alive = true;

public boolean isAlive() { return alive; }

public void setAlive(boolean alive) { this.alive = alive; }
ログイン後にコピー

このロジックの実装が将来変更された場合でも、getter 署名と setter 署名は同じまま維持されます。互換性。ただし、これにより、基礎となるデータ構造 (「生きている」ステータスを表すブール値など) がオブジェクトの状態を正確に反映できなくなる状況が発生する可能性があります。

これらの設計上の懸念に対処するには、メソッドを作成することをお勧めします。ゲッターとセッターのみに依存するのではなく、必要なアクションを直接実行します。たとえば、「生きている」ステータスは、専用のメソッドを通じて処理できます:

private int hp; // Hit points set in constructor

public boolean isAlive() { return hp > 0; } // Same method signature

public void kill() { hp = 0; } // Same method signature

public void damage(int damage) { hp -= damage; }
ログイン後にコピー

このアプローチは、オブジェクトの生きているステータスを操作するロジックをカプセル化し、他のオブジェクトがオブジェクトと対話するための明確で簡潔なインターフェイスを提供します。 .

結論として、ゲッターとセッターは特定の状況では役立ちますが、潜在的な設計上の欠点を認識することが重要です。データの一貫性、オブジェクトのカプセル化、疎結合を優先する代替設計パターンを採用することで、開発者は長期的にはより堅牢で保守しやすいソフトウェアを作成できます。

以上がオブジェクト指向プログラミングでゲッターとセッターを避けるべき場合は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート