質問

この質問に答えはこちら

今、簡単なゲームJavaにおける複数の異なるモードがある。私は長、メインゲームのクラスのメインロジック内のその他のそれにもかかわらず、メインゲームのクラスはも多額.

しえてくれて本当になかがいい自分のコードの大半でしたsetterか、セッター(60%)と比較して休むことが真に必要とされるための論理ゲームです。

カップルでのGoogle検索を主張していることsetterか、セッターが悪ないと主張しているのに必要な良いOOの実践とプログラム.

ではどうしたらよいですか?うになるのでしょうか?きさを変更する私のsetterか、セッター自分のプライベート変数、あるいはこだわ。

役に立ちましたか?

解決

セッターを使用して、ほとんどの時間はまだあなたが無意味な値を設定できるようにすることで、カプセル化を壊すという観点もあります。非常に明白な例として、あなたは、しか上がるゲームのスコアカウンターを持っている場合、代わりの

// 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);

これはおそらく容易例のビットです。私が言うことをしようとしていることはゲッター/セッター対publicフィールドを議論することは、多くの場合、オブジェクトは親密な方法で、お互いの内部状態を操作するので、あまりにも密接に結合された状態で大きな問題をあいまいということです。

アイデアは、直接、あなたがやりたいことを行う方法を作ることです。例では、敵の 『生きている』状態を設定する方法だろう。あなたはsetAlive(生きboolean)メソッドを持つように誘惑されるかもしれません。代わりにあなたが持っている必要があります:

private boolean alive = true;
public boolean isAlive() { return alive; }
public void kill() { alive = false; }

この理由は、あなたは物事がもはや「生きている」ブールではなく、「ヒットポイント」の値を持っていない実装を変更した場合、あなたはあなたが以前書いた二つの方法の契約を壊すことなく、その周りに変更することができるということです。

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; }

他のヒント

  • 非常に悪publicフィールドです。
  • やや悪Setterか、セッターが彼らは必要ありません。
  • :Setterか、セッターのみな本当に必要となりのタイプを暴く"大"の行動させることができることを 使用 その状態だけでなく、治療のタイプとしてリポジトリの状態を操作する他の種類です。

その内容によって状況がありますか した拠データオブジェクトです。

あなたはすでにこれに良い答えをたくさん持っていたので、私はちょうど私の2セントを与えるでしょう。ゲッターとセッターは非常に、非常に邪悪です。彼らは基本的にあなたの時間のほとんどは、あなたがやったすべての内部状態を隠すために何もしない冗長なコードに翻弄されたときに、オブジェクトの内部を非表示にするふりをしましょう。簡単なPOJOの場合は、のgetName()とのsetName()はobj.name =「トム」に置き換えることができない理由はありません。

メソッド呼び出しは、単に割り当てを置き換える場合は、

、その後、あなたはメソッド呼び出しを好むことで得たすべてのコードの膨張です。残念ながら、言語はJavaBeans仕様でgetterとsetterの使用を安置しているので、Javaプログラマは、そうすることは全く意味がない場合でも、それらを使用することを余儀なくされています。

幸い、Eclipseの(そして同様に、おそらく他のIDE)は、あなたがそれらを自動的に生成することができます。そして、楽しみのプロジェクトのために、私は一度XSLTで彼らのためにコード・ジェネレータを内蔵し。しかし、一つのことがあれば、私は、Javaでの過剰依存性ゲッターとセッターにそのインクルードを取り除くと思います。

Setterか、セッター実施の概念 封止 オブジェクト指向プログラミング

の状態のオブジェクトから外の世界に、オブジェクトは真に担そのもので改変を行うことはできませんとなります。唯一の方法は、オブジェクトを操縦するときの心配をする必要があり露出公開が完了していない商品についてsetterか、セッター.

あのメリットとsetterか、セッター:

1.可能な未来を変更無し変更を使用するコードのクラスです。

一つの大きな利点のgetterおよびsetterであることのできる公共の方法を定義してあることができたり、背後にある実装に変更する必要などこのバグが必要で固定し、異なるアルゴリズムの性能向上等)、 のsetterか、セッターのみの操作は、オブジェクトすることにより、既存のコードは、必ず記入してください、期待通りの動作をした後でも変化します。

例えば、ということかがあ setValue 方法を設定します value private変数オブジェクト:

public void setValue(int value)
{
    this.value = value;
}

その後、新たな要求する必要の回数 value を変更しました。のセッターの変化がかなり明:

public void setValue(int value)
{
    this.value = value;
    count++;
}

の場合 value フィードの公開がないようになり、後に追加カウンターがトラックの数倍の値を変更しました。そのため、setterか、セッターは一つの道を"未来の証明"のクラスを変更しています。

2.強制する手段としてのオブジェクトを操作する

別の言い方をsetterか、セッター重宝する執行方法は、オブジェクトでも操作される可能性があること、したがって、このオブジェクトは、独自の状態です。公共の変数オブジェクトに、露出されたのですが壊れる可能性があります。

例えば、 ImmutableArray オブジェクトが含まれて int 配列と呼ばれ myArray.場合に配列した公共分野、それだけではな変更でき:

ImmutableArray a = new ImmutableArray();
int[] b = a.myArray;
b[0] = 10;      // Oops, the ImmutableArray a's contents have been changed.

を実施する真の変更不能な配列、ゲッターの配列(getArray 方法をまとめて記載して下さいコピーを返します、その配列:

public int[] getArray()
{
    return myArray.clone();
}

ともに以下の場合:

ImmutableArray a = new ImmutableArray();
int[] b = a.getArray();
b[0] = 10;      // No problem, only the copy of the array is affected.

ImmutableArray は変更できません。露出の変数オブジェクトのできる操作方法な目的でのみ触れる方法(setterか、セッター)、オブジェクトでも操作される可能性があること、意図しない。

と思うとsetterか、セッターがより重要であることを授業の一部であるAPIで使用されるのか、他人としてこのAPIはそのままに、変更可能にしながらの変化にも実装されます。

すべてのメリットsetterか、仕掛け人た場合、ゲッターはその値のprivate変数の設定機能メソッドは単に受け入れる価値に割り当個数そのsetterか、セッターで余計なと思います。場合にクラスするだけ内部で使用するアプリケーションを使用しない、他人をsetterか、セッター広場などを書く際には、公開APIに含まれています。

彼らは絶対悪です。

は、残念ながら、彼らは絶対に彼らが行うすべてはあなたが実際にあなたがメソッドの誇大妄想を持つプロパティを経由してデータを公開しているときにデータをカプセル化していると思わせるで、「カプセル化の概念を強制」しません@coobird。何ゲッター/セッターは、公共分野が優れていません。

あなたが公共のデータが必要な場合は、

まず、それを公開すると、クライアントが通じ苦労し、それが例えばにより、値の変更するクライアントのために、それは認知的に簡単にするために持っているメソッドの数を減らすためにゲッター&セッターメソッドを取り除きます。

object.field = value;

の代わりに、より多くの認知強烈

object.setField(value);

ここで、クライアントは、今ではどんな副作用があるかどうかを確認するためにゲッター/セッターメソッドを確認する必要があります。

あなたが本当にこの方法で何かを行う必要がある場合は、

第二に、なぜそれが単に取得または設定よりも多くの責任を持っているのget / setメソッドを呼び出しますか? どちらのSRPに従うか、実際にあなたを伝える方法何かを呼んで、<私>全は方法は例えば、彼は述べたZarkonnenの例のように行います。

public void kill(){
    isAlive = false;
    removeFromWorld(this);
}

の代わりに

public void setAlive(boolean isAlive){
    this.isAlive = isAlive;
    if (isAlive)
        addToWorld(this);
    else
        removeFromWorld(this);
}

ここでsetAlive(boolean)メソッドは、副作用として、それは世界からオブジェクトを削除しますことをクライアントに伝えるのでしょうか?なぜ、クライアントはのisAlive分野についての知識を持っている必要がありますか?プラスオブジェクトが世界に再度追加されたときに何が起こるか、それはする再初期化する必要がありますか?なぜだろうとのいずれかについて、クライアントのケア?

道徳的な私見、彼らは正確に何を言うSRPに従い、ゲッター/セッターを取り除くために、名前のメソッドにあります。 ゲッター/セッターのない問題がある場合、代わりに他のクラスでそれらで物事をしようと、独自のクラス内で自分の汚い仕事をするためにオブジェクトを教えてくれます。

ここではそのことについて申し訳ありませんが、私の暴言をendeth;)

この滑りやすいといえます。

簡単に移動オブジェクト(またはパラメータオブジェクトとなっている場合があり唯一の目的の保有分野をその値とします。しかし、でもその退化した場合にはそもそもオブジェクトは不変なので--の設定のコンストラクタ露み get...ます。

あるものの場合クラスの紹介を一部制御ノブ";車ラジオのUIくご理解頂いてよいでしょ露のようなもの getVolume, setVolume, getChannel, は、 setChannel, が、その機能は信号を受信および発光す。そのノブはなく多くの実装詳細わからないから面のほか、無線ではトランジスタ、-ソフトウェア、または真空管。

のときの考えでは、オブジェクトとして積極的に参加問題領域タスクのいいと考えていいで なんとか うことの連携lineの友だちともline playが、その内部の状態を聞くので、そのデータで その他コード 何か協力できる値です。

なので---"悪"?をしなければいけません。それでも毎回だけ傾け入れる価値なも get...や set...方法は、その値だけがなぜか、そのオブジェクトのreponsibilityのプラットフォームに対応場合にのみ応答えることができ自分自身は、この値は"自分にとって、その な○○っています。

それは多くの変数ことを公開する場合は、

あなたのゲームクラスは、おそらく神オブジェクトのアンチパターンに従っています。 (Javaでその冗長ビットいらいらすることができますが)ゲッターとセッターには何の問題もありません。各クラスが明確に分離機能を持っているうまく設計されたアプリで、あなたは、単一のクラスでそれらの数十を必要としません。

編集のゲッターとセッターのための主なポイントは、「設定」にゲームクラッセであれば(私はそのようにあなたのコメントを理解し)、その後、あなたはおそらく、それは完全です(ゲッターを必要としません。 )getメソッドを使用せず、独自のプライベート変数にアクセスするためのクラスの罰金、とあなたはおそらく、概念的に一緒に属しているいくつかの変数を設定し、「グループセッター」にセッターの多くを折りたたむことができます。

ゲッターとセッターの存在は、(あなたが小学校の言語のその種にしている場合は、「香り」)を設計上の問題があることを示している傾向があります。ささいなゲッターとセッターは、公共分野からかろうじて区別されます。貧困層のカプセル化、およびあなたはOOと安心のプログラマーではないから期待するもの。

- 一般的にデータを操作コードは、別のクラスになります。

いくつかのケースではゲッターとセッターは大丈夫です。しかし、原則として、getterとsetterの両方を持つタイプは、設計上の問題を示しています。ゲッターは不変性のために働きます。セッターは「聞かないで伝える」ために働きます。不変性と限りそれらが重なったスタイルで適用されていないとして、優れたデザインの選択肢は、「聞かないで言う」両方ます。

私の意見はゲッターとセッターが良いプログラムのための要件であるということです。それらに固執するが、不必要なゲッター/セッターを書いていない - それは直接、すべての変数に対処することは必ずしも必要ではないのです。

私は本当に彼らは悪とは思いません。しかし、私は私は本当にに必要な場合を除き、それらを使用していたことがない世界に生きたいと思ってます。

私は上記の読ん一例としては、あなたのコードをfuture-proofingました。たとえばます:

public void setValue(int value)
{
    this.value = value;
}

次に、要件が変更とあなたは値が設定された回数を追跡する必要があります。

ですからます:

public void setValue(int value)
{
    this.value = value;
    count++;
}

これは美しいです。わかった。しかし、Rubyで、次のように同じ目的を果たしていないのでしょうか?

someobject.my_value = 100

後で、my_valueが設定された回数を追跡する必要があります。それでは、あなただけのセッターをオーバーライドすることができなかったの THEN を唯一の THEN

def my_value=(value)
    @my_value = value
    @count++
end

私たちが持っているJavaクラスの山々を見文字通り基本的なゲッター/セッターしかし、何が醜いと迷惑ではないです何千行ものコードと数千人を見て、私は美しいコードのすべてが、私は認めざるを得ません。

私はC#のフルタイムでの現像された場合には、

、我々はすべての時間をパブリックプロパティを使用して必要なだけカスタムゲッター/セッターをしました。魔法のように働いて、それが何かを壊しませんでした。

いつものように唯一の答えは:それは依存しています。あなたは、コードに触れるだけペロンある場合は、あなたが撮影ショートカットを含め、あなたが快適だ何かを行うことができます。

セッターを使用する利点の1つは、チェックはあなたのコード内で唯一の場所で実行する必要があるということです。

あなたが実際に取得され、これらの方法で設定されているものにいくつかの近くに注意を払うようにしたいかもしれません。あなたはおそらく、定数を使用して、オフに優れている定数値へのアクセスを提供するためにそれらを使用している場合。

このは、問題のプログラミング言語に依存します。あなたの質問は、ゲッターとセッターは、一般的には良いことであると考えているようだジャワの文脈で囲まれています。

これとは対照的に、Pythonの世界では、彼らは一般的に悪いスタイルとして考えられている:彼らは実際に機能を追加することなく、コードに行を追加します。 Pythonプログラマは、彼らが取得および/またはオブジェクトの属性の設定をキャッチするためにメタプログラミングを使用することができますする必要がある場合。

Javaでは(私は十年前、わずかに学んだのJavaの少なくともバージョン)、それは不可能でした。このように、Javaでそれはあなたがする必要がある場合は、変数へのアクセスを無効にすることができるように、宗教的にゲッターとセッターを使用するのが最善です。

(これは、Java以外Pythonは必ずしも良くただ違うことはありません。)

ただ、FYI:このスレッド内のすべての優れた答えに加えて、あなたがのためかに対するゲッター/セッターを考え出すことができるすべての理由のことを覚えて、パフォーマンスが1(一部は信じるとして)ではありません。 JVMは(限り、彼らが実際に上書きされていないとしても非finalもの)ささいなゲッター/セッターをインライン化するのに十分なスマートです。

あなたは値クラスによって、あなたのクラスの一部を置換することもできます。これはゲッターを削除して、コンテンツがあなたの下から変更されたときの問題を回避するためにあなたをできるようになります。

あなたは、個々のフィールドの値、使用ゲッターと/またはセッターへの外部からのアクセスが必要な場合。ない場合は、しないでください。 publicフィールドを使用しないでください。それはそれと同じくらい簡単です! (OK、これはのことの簡単なことはないが、それは親指の良いルールです)。

良い事である(常にではないが最良の選択) - - あなたは不変あなたのオブジェクトを作成しようとしている場合は特に -

一般的に、あなたはまた、あなたがゲッターよりもはるかに少ないことが多いセッターを供給する必要があることを見つける必要がありますが、でも、ない場合ます。

私は数ヶ月前のJavaでプログラミングをしてきた、と私はそれがアプリケーションのために必要だ場合にのみ、我々はゲッター&セッターを使用する必要があることを学んできた。

楽しみを持っている:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top