Sto lavorando su un progetto Java che utilizza un framework di integrazione delle dipendenze creato dalla società stessa. Il framework applica la seguente convenzione di denominazione: supponi di avere una classe Foo
che dipende da un'interfaccia chiamata org.company.IBar
:
class Foo {
@Injection
private IBar bar;
...
}
allora il framework cercherà una classe chiamata org.company.implementation.Bar
, creerà una nuova istanza di quella classe e quindi assegnerà all'attributo Foo.bar
. Il framework consente comunque alcune personalizzazioni. In quell'annotazione @Injection
, puoi dichiarare il tuo stabilimento, con il quale puoi applicare le tue convenzioni. Ma ogni volta che vuoi usare un certo factory, devi dichiararlo esplicitamente nell'annotazione sull'attributo da iniettare.
Questa strategia, tuttavia, renderà le tue classi strettamente accoppiate l'una all'altra, perché quando dichiari una dipendenza su un'interfaccia, ti stai già impegnando in una determinata implementazione. Così, ho deciso di implementare il mio stabilimento per eseguire manualmente l'iniezione di dipendenza. È fondamentalmente una classe che istanzia tutti gli oggetti dell'applicazione e li collega insieme. Ogni oggetto ha il suo ambito (singleton o prototipo) controllato dalla fabbrica. Pensa a un file di configurazione IoC Spring (ma scritto in Java, anziché XML).
I miei colleghi non hanno approvato questa decisione. La loro tesi è che la fabbrica che ho creato "ha troppe responsabilità" e che l'istanziazione di ogni oggetto deve essere lasciata al framework. Se è necessario utilizzare un'altra convenzione, è necessario creare fabbriche personalizzate per ogni classe (come descritto sopra). Sicuramente, secondo loro, non ci dovrebbe essere una singola fabbrica in cui tutti gli oggetti sono istanziati.
Sono strongmente in disaccordo con le loro argomentazioni. La fabbrica ha una sola responsabilità : creare il grafico dell'oggetto. Se dovesse sorgere la necessità di modificare quel grafico, c'è solo una classe che dovrà cambiare. Ma potrei mancare qualcosa qui. Quali sono i pro e i contro di ciascuna strategia?