Problema : ho un sistema complesso con molti livelli di astrazioni. Ho bisogno di un comportamento diverso basso nelle astrazioni, ma per essere configurato in alto nell'astrazione.
Soluzione 1 : avere un parametro per definire il comportamento scelto e passare questo parametro nell'astrazione fino al metodo che lo usa.
Soluzione 2 : avere un modulo di configurazione impostato in alto nell'astrazione e il modulo in basso nell'astrazione ha accesso al modulo di configurazione.
Soluzione 3 : modello di progettazione della strategia?
Secondo il libro Codice pulito, la soluzione 1 non funziona perché una funzione non dovrebbe avere i flag di controllo come parametri, il diverso percorso dovrebbe diventare una nuova funzione. In questo caso, duplicare ciò che viene chiamato in questa funzione e in quelle sottostanti.
Il problema con la soluzione 2 è lo scopo della configurazione, se è troppo alto diventa difficile testare il codice perché ho una dipendenza che non posso iniettare, se mi inietto sono tipo nella soluzione 1 Inoltre, seguendo un'architettura esagonale, potrei forzare il mio livello di applicazione a dipendere da moduli esterni, ad esempio se l'utente accede a percorsi di codice diversi a seconda della pagina in cui ha effettuato l'accesso alla funzionalità.
Un amico mi ha consigliato di dare un'occhiata al modello di strategia, ma per quello che ricordo deve passare un riferimento all'implementazione che verrà utilizzata e alla fine è simile all'iniezione della dipendenza.
La mia conclusione
Ritengo che la soluzione 2 sia migliore in quanto posso definire in quale livello dell'astrazione avrò questo modulo di configurazione, ma vorrei sapere se il problema è risolto per un modello di progettazione migliore o una strategia di refactoring.