[解決済み】ゲッターとセッターは設計が悪いのか?矛盾するアドバイスが見受けられる【重複あり
質問
私は現在、Javaでいくつかの異なるモードを持つ簡単なゲームを作っています。メインのGameクラスを拡張して、メインのロジックを他のクラスの中に入れています。それでも、メインのゲーム・クラスはかなり重いです。
私のコードをざっと見たところ、ゲッターとセッターが大部分(60%)を占めており、残りの部分はゲームのロジックに本当に必要なものでした。
Googleで検索すると、ゲッターとセッターは悪だと言う人もいれば、良いOOの実践と素晴らしいプログラムのために必要だと言う人もいます。
では、どうすればいいのでしょうか?どっちがいいんだろう?プライベート変数のゲッターとセッターを変更すべきなのか、それともこのままで良いのか?
どのように解決する?
また、ほとんどの場合、セッターを使用しても、意味のない値を設定することができるため、カプセル化を解除してしまうという指摘もあります。例えば、ゲームのスコアカウンタが常に上昇するものである場合、その代わりに
// Game
private int score;
public void setScore(int score) { this.score = score; }
public int getScore() { return score; }
// Usage
game.setScore(game.getScore() + ENEMY_DESTROYED_SCORE);
であるべきです。
// Game
private int score;
public int getScore() { return score; }
public void addScore(int delta) { score += delta; }
// Usage
game.addScore(ENEMY_DESTROYED_SCORE);
これは少し安直な例かもしれません。私が言いたいのは、ゲッター/セッターとパブリックフィールドについて議論すると、オブジェクトが互いの内部状態を親密に操作し、それゆえ密接に結合しすぎているという大きな問題が見えなくなってしまうことがよくあるということです。
やりたいことを直接やるメソッドを作ろうということです。例えば、敵の「生きている」というステータスを設定する方法です。setAlive(boolean alive)メソッドを持ちたくなるかもしれません。その代わり、次のようなメソッドを用意する。
private boolean alive = true;
public boolean isAlive() { return alive; }
public void kill() { alive = false; }
この理由は、もし実装を変更してモノが "alive" というブール値を持たず、代わりに "hit points" という値を持つようにしても、先に書いた二つのメソッドの契約を破棄せずにそれを変更することができるためです。
private int hp; // 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; }
関連
-
[解決済み] JVM起動時のパラメータ「-Xms」「-Xmx」とは何ですか?
-
[解決済み] Visual Studioでゲッターとセッターを生成するにはどうしたらいいですか?
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] 最も近い整数への切り捨て - 私は不正をしているのでしょうか、それともこれは十分すぎるほど適切なのでしょうか?
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] JavaFX 同じパッケージ内なのに「場所が必要です。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] mixinとは何か、なぜ有用なのか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] JavaでFileFilterを作るには?
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] javacが「using unchecked or unsafe operations」という警告を出す原因は何ですか?
-
[解決済み] Javaでのスキャナが動作しない
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] java.util.MissingFormatArgumentException: 形式指定子 '%s' がありません。
-
[解決済み] Java の文字列インデックスが範囲外です。0 [閉店]
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?