2016-03-21 1 views
0

私は「正しい」解決策やパターンが見つからないという設計上の問題があります。コードで説明しましょう。Xパラメータのうちいくつかの必須パラメータメーカ候補がありますか?

//Mandatory set 1 
int minDamage; 
int maxDamage; 

//Mandatory set 2 
int damage; 

このオブジェクトを作成するには、必須セット1または必須セット2を指定する必要があります。これは、2つの異なるオーバーロードコンストラクタによって簡単に対応できます。しかし、この必須セットを追加するとどうなりますか?

//Mandatory set 3 
int percentageBasedDamage; 

両方とも同じ単一データ型を含む過負荷を設定することはできません。はい、私は最後のものをフロートにすることができましたが、他のいくつかの必須セットを追加するとどうなりますか?私は最終的にデータ型がなくなった。ビルダーのパターンはここで助けにならないようです。私が考えることができる唯一のことは、すべての必須メソッドを提供することですが、これは多くのパラメータを持つコンストラクタに終わる可能性があります。また、どのようにオブジェクトを使用するか明確ではない、私は最小/最大ダメージ、指定されたダメージまたはパーセンテージベースのダメージを行いたい。

public class MyObject 
{ 
    int minDamage; 
    int maxDamage; 
    int damage; 
    int percentageBasedDamage; 

    public MyObject(int minDamage, int maxDamage, int damage, int percentageBasedDamage) 
    { 
    this.minDamage = minDamage; 
    //... 
    } 
} 

MyObject myObject = new MyObject(10, 18, 0, 0); //Correct usage 

MyObject myObject = new MyObject(0, 0, 5, 8); //Incorrect usage 

まあJavaはこれを取り組むために提供している何かがなければなりません。

編集

私は実際にBuilderパターンを使用する方法について多くのことを思ったが、それを把握することができませんでした。

public class Damage extends Action { 
String target; 
String type; 
int minDamage; 
int maxDamage; 
int damage; 
int currentHealthPercentageDamage; 
int maxHealthPercentageDamage; 

private Damage(Builder build) { 
    target = build.target; 
    this.type = build.type; 
    this.minDamage = build.minDamage; 
    this.maxDamage = build.maxDamage; 
    this.damage = build.damage; 
    this.currentHealthPercentageDamage = build.currentHealthPercentageDamage; 
    this.maxHealthPercentageDamage = build.maxHealthPercentageDamage; 
} 

public static class Builder 
{ 

    private String target; 
    private String type; 
    private int minDamage; 
    private int maxDamage; 
    private int damage; 
    private int currentHealthPercentageDamage; 
    private int maxHealthPercentageDamage; 

    public Builder(String target, String type) { 
     this.target = target; 
     this.type = type; 
    } 

    public Damage minmax(int minDamage, int maxDamage) 
    { 
     this.minDamage = minDamage; 
     this.maxDamage = maxDamage; 
     return new Damage(this); 
    } 

    public Damage damage(int damage) 
    { 
     this.damage = damage; 
     return new Damage(this); 
    } 

    public Damage currentHealthPercentageDamage(int currentHealthPercentageDamage) 
    { 
     this.currentHealthPercentageDamage = currentHealthPercentageDamage; 
     return new Damage(this); 
    } 

    public Damage maxHealthPercentageDamage(int maxHealthPercentageDamage) 
    { 
     this.maxHealthPercentageDamage = maxHealthPercentageDamage; 
     return new Damage(this); 
    } 

} 

ビルドはダメージのものを返すので、単一の「必須のセットは、」選ばれたことは、このクラスをインスタンス化する方法を適切に設計されており、明確である:ダークナイトは最終的に私の目を開いて、私はこれを思いついた答え使用されます。

答えて

1

Builderパターンを使用して、呼び出し元が異なるコンストラクタの呼び出し元を強制するのではなく、渡すパラメータを決定できるようにします。参照先this

+0

ビルダーにも同じ問題があります。そのコンストラクタだけが必須パラメータをとります。 – Madmenyo

+0

@MennoGouwここで問題は毎回コンストラクタを追加できないことです。代わりにビルダーをプログラム的に扱うようにしてください。 –

+0

私はこれについて考えました。しかし、ビルダーは必須パラメータと各セットを追加するメソッドを持たないでしょう。したがって、パラメータを設定したり、あまりに多くのパラメータを設定したりすることは、まだ可能です。私は複数のクラスでそれらを分割することができますが、これは基本的に同じことをするクラスの多くに終わると思います。 – Madmenyo

関連する問題