Uso C # e questi sono i miei approcci. Tener conto di:
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.
}
Opzione 1. Costruttore con parametri opzionali
public Foo(int i = 0, string s = "bla", Bar b = null)
{
this.i = i;
this.s = s;
this.b = b;
}
Usato come ad es new Foo(5, b: new Bar(whatever))
. Non per le versioni Java o C # precedenti alla 4.0. ma vale comunque la pena mostrare, in quanto è un esempio di come non tutte le soluzioni siano indipendenti dalla lingua.
Opzione 2. Costruttore che accetta un singolo oggetto parametro
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() { }
}
Esempio di utilizzo:
FooParameters fp = new FooParameters();
fp.I = 5;
fp.S = "bla";
fp.B = new Bar();
Foo f = new Foo(fp);`
C # da 3.0 in poi lo rende più elegante con la sintassi dell'inizializzatore di oggetti (semanticamente equivalente all'esempio precedente):
FooParameters fp = new FooParameters { I = 5, S = "bla", B = new Bar() };
Foo f = new Foo(fp);
Opzione 3:
ridisegna la tua classe in modo da non richiedere un numero così elevato di parametri. Potresti suddividere le sue responsabilità in più classi. Oppure passare i parametri non al costruttore ma solo a metodi specifici, su richiesta. Non sempre fattibile, ma quando lo è, vale la pena farlo.