私は「正しい」解決策やパターンが見つからないという設計上の問題があります。コードで説明しましょう。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);
}
}
ビルドはダメージのものを返すので、単一の「必須のセットは、」選ばれたことは、このクラスをインスタンス化する方法を適切に設計されており、明確である:ダークナイトは最終的に私の目を開いて、私はこれを思いついた答え使用されます。
ビルダーにも同じ問題があります。そのコンストラクタだけが必須パラメータをとります。 – Madmenyo
@MennoGouwここで問題は毎回コンストラクタを追加できないことです。代わりにビルダーをプログラム的に扱うようにしてください。 –
私はこれについて考えました。しかし、ビルダーは必須パラメータと各セットを追加するメソッドを持たないでしょう。したがって、パラメータを設定したり、あまりに多くのパラメータを設定したりすることは、まだ可能です。私は複数のクラスでそれらを分割することができますが、これは基本的に同じことをするクラスの多くに終わると思います。 – Madmenyo