Sto studiando ingegneria del software e una cosa che sto cercando di migliorare è la mia abilità nell'architettura software. La mia domanda è abbastanza ampia, quindi cercherò di spiegarlo con un esempio.
Supponiamo di avere un livello del modello e un livello di servizio. Il modello gestisce varie entità (come utenti, prodotti, ordini, campains ecc.). I servizi forniscono funzionalità quali valutare l'efficacia di una campagna e utilizzano diversi moduli del livello del modello per accedere ai dati richiesti.
In che modo e quando specifichi tali dipendenze? Vedo le seguenti possibilità:
-
Consenti l'accesso generale a tutti i modelli. Questo è l'approccio adottato in molti framework MVC, in cui i controllori possono accedere a qualsiasi classe di modello.
Pro: non devi specificare le dipendenze, lo sviluppatore che scrive il controller è molto flessibile.
Contro: se vuoi testare un servizio , non sai davvero quale modello devi prendere in giro perché il servizio potrebbe usare tutto. Queste dipendenze implicite possono anche rendere la manutenzione un dolore. -
I servizi specificano esplicitamente i modelli richiesti. I sistemi di gestione delle dipendenze come requirejs o CommonJS richiedono il lavoro in questo modo.
Pro: nessuna dipendenza implicita semplifica la manutenzione
Contro: la deduzione è impossibile. Quando si progetta il modulo, è necessario sapere esattamente di cosa avrà bisogno il modulo. Se in seguito noti che hai bisogno di un'altra interfaccia, devi cambiare l'architettura. -
Specifica le interfacce esplicite che verranno fornite al servizio. Chiunque installi il servizio dovrà fornire implementazioni delle interfacce. Penso che l'iniezione di dipendenza funzioni in questo modo, sebbene l'iniezione sia automatizzata lì.
Pro: nessuna dipendenza implicita semplifica la manutenzione, i test sono semplificati, perché sai esattamente cosa deridere.
Contro: Quando si progetta il modulo, è necessario sapere esattamente di cosa avrà bisogno il modulo. Se in seguito noti che hai bisogno di un'altra interfaccia, devi cambiare l'architettura.
In teoria, l'iniezione di dipendenza sembra il modo migliore. Ma è pratico specificare ogni requisito? Quanto dovrebbe essere fine? Per entità? Raggrupparli? O una dipendenza per "cosa puoi fare con un'entità"?
Ci sono semplicemente troppe possibilità e mi piacerebbe avere qualche consiglio del mondo reale.