Durante la progettazione di un sistema, mi trovo spesso ad affrontare il problema di avere un gruppo di moduli (registrazione, accesso al database, ecc.) Utilizzati dagli altri moduli. La domanda è: come posso fornire questi componenti ad altri componenti. Due risposte sembrano possibili iniezione di dipendenza o utilizzo del modello di fabbrica. Tuttavia entrambi sembrano sbagliati:
- Le fabbriche rendono il test una seccatura e non consentono un facile scambio di implementazioni. Inoltre non rendono evidenti le dipendenze (ad esempio, stai esaminando un metodo, ignaro del fatto che chiama un metodo che chiama un metodo che chiama un metodo che utilizza un database).
- L'iniezione di dipendenza gonfia enormemente gli elenchi di argomenti del costruttore e diffonde alcuni aspetti in tutto il codice. La situazione tipica è quella in cui i costruttori di oltre la metà delle classi sembrano così
(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d)
Ecco una situazione tipica con cui ho un problema: ho classi di eccezioni, che usano descrizioni di errori caricate dal database, usando una query che ha un parametro di impostazione della lingua dell'utente, che si trova nell'oggetto sessione dell'utente. Quindi per creare una nuova eccezione ho bisogno di una descrizione, che richiede una sessione del database e la sessione dell'utente. Quindi sono condannato a trascinare tutti questi oggetti attraverso tutti i miei metodi nel caso in cui potessi aver bisogno di lanciare un'eccezione.
Come affrontare un problema del genere ??