2017-05-27 12 views
3

OOPについて学習しています。私は現在、HP、マナ、諜報、強さ、敏捷性、防具などのシンプルな「ヒーロープロファイル」を作成しようとしています。ご覧のとおり、ヒーローオブジェクトに追加したい属性がたくさんあります。しかし、これらの属性は非公開で宣言されています(これらの非公開宣言が最善であると言われたため)。私はそれらを非公開で宣言すると、セットを作成し、これらの属性のそれぞれにメソッドを取得する必要があります。そして、それは多くの時間を消費し、実用的でないように感じます。多くの属性がある場合にJavaでsetメソッドとgetメソッドを使用しない

もっと実用的な方法はありますか?コーダーは、それらのダースがあるにもかかわらず、実際にこれらのgetとsetメソッドをタイプしますか?私がしたいのは、これらの属性を持つ2つのヒーロープロファイルを作成してから、それらの間の1v1の戦闘をシミュレートすることだけです。

+0

Eclipse>右クリック>ソース>ゲッターとセッターを生成>すべてをチェック>完了 – Marvin

+0

私はIntelliJを使用していました。そのような機能もありますか? @Marvin – Huzo

答えて

2

オブジェクトの個々の属性がプライベートであることを、あなたに言った誰が絶対だった

OOPの基本原則の1つはEncapsulationです。簡単に言えば、オブジェクトの内部構造(「フィールド」)を隠す必要があるということです。これはOOPの最も重要な側面であり、そこからOOPの利点の大半が得られます。あなたは、もはや内部構造を隠しているので、今

、アクセサメソッド(セッターとゲッター)は、カプセル化、同じようにちょうど公共が行うそれらを作るに違反していません。それはちょうど約を保護することではありません内部フィールド、それは約を隠すです。

残念ながら、アクセサメソッドはJava(およびC#も)の共通の慣用法ですが、OOPを学ぶことに真剣に取り組んでいるなら、それらを避けてください。後で経験が豊富になると、例外が発生するケースもありますが、今は避けてください。プロジェクトロンボクを避け、自動生成するIDE機能を避けてください。

Hereは、対象のAllen Holubの素晴らしい記事です。

実際の質問に戻る:はい、あなたのフィールドをプライベートと宣言していますが、セッター/ゲッタはまったく定義していません。代わりに、オブジェクトが持つべき責任/機能/機能/ロジックについて考えてください。

したがって、統計情報について考えてみると、とは何について考えているのですか?あなたはそれらの統計情報を使用しています。オブジェクト指向のヒーローは、次のようになります。もちろん

public final class Hero { 
    private int hp; 
    private int strength; 
    private int agility; 
    private int armor; 
    ... 

    public void dealDamageTo(Hero other) { 
     other.takeDamage(stength); 
    } 

    public void takeDamage(int damage) { 
     hp = hp - Math.max(0, damage-armor); 
    } 
    ... 
} 

を、それが唯一の例ですが、あなたはおそらく、ポイントを得ます。デザインが正しい場合は、内部フィールドを公開する必要はありません。

+0

です。非常に洞察力のある。どうもありがとう! – Huzo

1

はい、あなたのフィールドのカプセル化のために、あなたのIDEのおかげでgetterとsettersを書くか、生成する必要があります。あなたがコードを変えたときにget()とset() (例:CollectionからListへ)、そしてそれはラムダメソッドの使用のためにjava8でもっと役に立ちます。

さらにあなたのクラスはその属性を管理しています。意外な方法

+0

"ゲッターとセッターを書くべきです"というのは、実際にそれらを手書きで書くか、エディタでそれらを生成させるということですか? – Pshemo

+0

エディターに書き留めて、必要に応じて変更してください。もちろん、それらを生成する方が速いです。 –

+0

[編集]オプションを使用してください。そして、それは "それは時間がかかります"主な懸念 – Pshemo

2

ゲッターを持つことは、あなたのプロパティの周りにセッターが本当に重要です。そうしないと、カプセル化が中断されます。

残念ながら、Javaはプログラマがゲッタとセッタを宣言するための適切なショートカットを提供しません。しかし、多くのIDEではアクセサメソッドを生成するためのツールが用意されています。

+0

ありがとう!IJはそのためのツールを提供していますか? – Huzo

+2

@HuzoはいInteliJ [この機能を備えています](https://www.jetbrains.com/help/idea/2017.1/generating-getters-and-setters.html) – dasblinkenlight

1

@huzo、およびJavaをしようとしてくれてありがとう:

https://projectlombok.org/

チェックこれ。あなたの質問に答えるには、IntelliJでhttps://www.jetbrains.com/help/idea/2017.1/generating-getters-and-setters.htmlを使い、一度使い慣れたら、@ Rjiukによって提案されているように、セッターとゲッターを避けるようにしてみてください。https://projectlombok.org/私は現在、あなたが見ることができるように、 私はヒーローに追加したい属性がたくさんある鎧など、HP、マナを持つ単純な「ヒーロープロファイル」、 知性、力、敏捷性を作成しようとしています

1

オブジェクト。

これらの行を見ると、ここに継承ツリーがあります。これらのために親クラスを取り、その中に共通メンバー(変数とメソッド)を保持することができます。親クラスは、interfaceまたはabstract classまたは具象クラスにすることができます。したがって、メンバー変数の値をコンストラクターに渡すことができます。

実際にはstrengthクラスがあり、メンバー変数がarmStrength(例として)だと思います。このクラスの新しいインスタンスを作成するときには、コンストラクタに値を渡すことができます。しかし、後で腕が弱くなったり壊れたりする。この場合、armStrengthを更新する必要があります。

これを達成するには、セッターメソッドも必要です。ゲッターとセッターを持つことは、OOPでより良いことです。カプセル化のために、OOPの主なポイントの1つです。

ゲッタとセッタがたくさんあるときに混乱を避けるために、別のクラスにそれらを保持することができます。

幸運にも、すべてのゲッターとセッターを入力するのではなく、IDEショートカットを使ってそれらのゲノムを生成することができます。 Eclipseで

  • Alt+Shift+S, R
  • NetBeansで:IntelliJのでAlt+Insert
  • ALT+Insert
関連する問題