ソフトウェア エンジニアリングでは、ゲッターとセッターはそれぞれプライベート変数のアクセサーと修飾子として機能します。これらは優れたオブジェクト指向プログラミングの実践には不可欠ですが、潜在的な設計上の欠点については議論があります。
よくある批判の 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 サイトの他の関連記事を参照してください。