私はC#を使用していますが、これらは私のアプローチです。検討してください:
class Foo
{
// private fields only to be written inside a constructor
private readonly int i;
private readonly string s;
private readonly Bar b;
// public getter properties
public int I { get { return i; } }
// etc.
}
オプション1.オプションのパラメーターを持つコンストラクター
public Foo(int i = 0, string s = "bla", Bar b = null)
{
this.i = i;
this.s = s;
this.b = b;
}
例として使用されnew Foo(5, b: new Bar(whatever))
ます。4.0より前のJavaまたはC#バージョンには対応していません。ただし、すべてのソリューションが言語に依存しないわけではないため、これは一例です。
オプション2.単一のパラメーターオブジェクトを取るコンストラクター
public Foo(FooParameters parameters)
{
this.i = parameters.I;
// etc.
}
class FooParameters
{
// public properties with automatically generated private backing fields
public int I { get; set; }
public string S { get; set; }
public Bar B { get; set; }
// All properties are public, so we don't need a full constructor.
// For convenience, you could include some commonly used initialization
// patterns as additional constructors.
public FooParameters() { }
}
使用例:
FooParameters fp = new FooParameters();
fp.I = 5;
fp.S = "bla";
fp.B = new Bar();
Foo f = new Foo(fp);`
3.0以降のC#では、オブジェクト初期化子構文を使用してこれをよりエレガントにしています(セマンティックは前の例と同等です)。
FooParameters fp = new FooParameters { I = 5, S = "bla", B = new Bar() };
Foo f = new Foo(fp);
オプション3:
このような膨大な数のパラメーターを必要としないようにクラスを再設計します。その責任を複数のクラスに分割できます。または、必要に応じて、コンストラクターではなく特定のメソッドにのみパラメーターを渡します。常に実行可能なわけではありませんが、実行可能な場合は、実行する価値があります。