Ho letto il libro di Mark Seemann su DI e ho una domanda specifica riguardo all'implementazione di un Default locale.
Il libro sostiene l'iniezione di proprietà in questo caso, ma volevo chiederti se la seguente è un'alternativa più semplice e versatile: assegnare un argomento predefinito nullo nel parametro costruttore e cambiare la clausola di guardia di quella classe per assegnare il Default locale.
Ad esempio,
class B {
var a:IA;
public function new(a:IA = null){
if(a == null){
a = new DefaultA();
}
this.a = a;
}
}
In questo modo, lasciamo la classe aperta all'istanza con una IA diversa
var b:B = new B(new ConcreteA());
Oltre a consentire l'istanziazione della classe senza gli argomenti del costruttore per brevità.
var b:B = new B(); // Uses DefaultA
Non dobbiamo mai preoccuparci della nullità di una proprietà, né della creazione di metodi di iniezione di proprietà con clausole di protezione, poiché il nostro costruttore garantisce che non sarà nullo.
Inoltre, per gli utenti che creano una nuova istanza di B
, = null
indica sia che è facoltativo E che è possibile passare una dipendenza diversa; in tutti gli altri casi con DI non avremmo mai uno scenario parameter = null
predefinito perché i nostri argomenti del costruttore sarebbero delle dipendenze non opzionali.
Come vantaggio, possiamo combinare il costruttore per consentire sia le implementazioni predefinite che quelle che richiedono una classe concreta passata.
class B {
var a:IA;
var c:IC;
public function new(a:IA, c:IC = null){
if(a == null){
throw NullException;
}
this.a = a;
if(c == null){
c = new DefaultC();
}
this.c = c;
}
}
Così come fare cose come
if(c == null){
c = new DefaultC(a); // If our DefaultC depends on an IA
}
this.c = c;
Quali sono gli aspetti negativi di questo metodo? Mi rendo conto che ora abbiamo inserito un po 'di logica nel costruttore, ma in realtà funziona come una clausola di protezione predefinita in un modo simile che chiameremmo un setter con un parametro Local Default nel costruttore se si utilizza l'iniezione di proprietà.
Questo metodo sembra troppo ovvio per non essere stato raccomandato, quindi c'è qualcosa che mi manca per il motivo per cui ciò non va bene per l'accoppiamento / l'estendibilità / l'ingannevole / etc?