Nel nostro codice abbiamo alcune classi che rappresentano la logica aziendale. Prima dell'uso, vengono creati e popolati con due tipi di input:
- dati aziendali richiesti per l'esecuzione (ad esempio
name
,maxValue
...) - riferimenti infrastrutturali ad es. database, bus messaggi, client http ... ecc., tutto ciò che non è correlato al business, ma necessario per la comunicazione con l'infrastruttura di underlaying.
Abbiamo le seguenti opzioni per separare gli input:
/ A ha tutto nel costruttore:
public Foo(String name, DbRef db)
Mi piacerebbe essere in grado di separare in qualche modo questi due tipi di input. Poiché il numero di argomenti può essere grande, non voglio sovraccaricare il costruttore o farlo con un numero enorme di argomenti.
/ B infra nel costruttore, dati tramite setter
public Foo(DbRef db)...
public Foo setName(String name)...
In questo modo non puoi creare un oggetto senza passare l'infra, ma devi aggiungere una validazione extra se alcuni argomenti richiesti non mancano (non c'è un controllo in fase di compilazione per questo).
/ C dati richiesti nel costruttore, infra e dati opzionali tramite setter
public Foo(String name)...
public Foo bind(DbRef dbref)...
public Foo setMaxValue(int maxValue)...
In questo modo non devi dimenticare di chiamare bind
, ma almeno è sempre lo stesso metodo e questa associazione può essere eseguita automaticamente, ad es. proxy, probabilmente, per ridurre possibili errori umani.
Ho iniziato con B ma ora mi sto appoggiando alla C.
Come faresti ad architettare questo?