Clean Architecture: ottieni un'istanza nella cerchia interna della classe dal cerchio esterno

4

Questa potrebbe essere una domanda facile per ingegneri esperti del software.

Attualmente sto leggendo il libro Clean Architecture di Uncle Bob, e sto cercando di implementare la pulizia architettura in un progetto Java.

Ora, nel mio progetto, mi sono imbattuto nella stessa identica situazione descritta qui nel capitolo 17 del libro:

Lalinearossaèilconfinetrailcomponentedelleregoledibusinessdialtolivelloeilcomponentedidatabasedibassolivello.GrazieaDatabaseInterface,chefapartedelcomponentedialtolivello,maimplementatonelcomponentedibassolivello,laregoladidipendenzaèsoddisfatta.

Tuttavia,inchemodoBusinessRulespuòottenereun'istanzadiunoggettocheimplementaDatabaseInterfacesenzaviolarelaregoladidipendenza?

LaclassediimplementazioneDatabaseAccesssitrovanelcomponentedibassolivelloeilcomponentedialtolivellonondevesaperenullasulleclassinelcomponentedibassolivello.

Inaltreparole,nonpossiamoistanziareunoggettoDatabaseAccessall'internodiBusinessRules,perchéciòviolerebbelaregoladidipendenza.

Inchemodoquestoproblemavienegeneralmenterisolto?

Nota:

LastessasituazioneèdescrittaanchenelCapitolo18:

E anche qui, in che modo Client può ottenere un'istanza di ServiceImpl senza violare la regola di dipendenza?

Il libro non fornisce alcun indizio su come ciò sia fatto nella pratica. Sarei molto interessato a sapere quale sia la strategia corretta per risolvere questa situazione.

    
posta weibeld 08.06.2018 - 21:28
fonte

2 risposte

7

La struttura della tua applicazione dovrebbe avere un componente "Punto di ingresso" (con il metodo main ), che "conoscerà" tutti gli altri componenti / librerie.
La responsabilità della componente del punto di ingresso sarà quella di incollare insieme le astrazioni di alto livello e le implementazioni di basso livello.

.----------------.       .----------------<I>-.       .-----------------.   
| Business rules | ----> | Database interface | <|--- | Database access |  
'----------------'       '--------------------'       '-----------------'  
        ^                         ^                            ^  
        |                         |                            |  
        |                         |                            |  
        |                  .-------------.                     |  
         ----------------  | Entry point |  -------------------  
                           '-------------'  

Nel punto di ingresso puoi istanziare oggetti di regole aziendali e passare implementazioni dell'interfaccia di database senza regole aziendali per conoscere i dettagli di implementazione.

public void main()
{
    // MyDatabase implements IDataAccess
    IDataAccess dataAccess = new MyDatabase(connectionString); 

    // BusinessRules expect an instance of IDataAccess as constructor parameter
    MyBusinessRule rule = new MyBusinessRule(dataAccess);
}

Questo approccio è ben noto come iniezione di dipendenza. Esistono molti framework per l'iniezione delle dipendenze che automatizzano questo processo. Ma per motivi di apprendimento sarà bene farlo manualmente e risolvere i possibili problemi da solo.

    
risposta data 08.06.2018 - 22:46
fonte
1

Un approccio tipico consiste nell'utilizzare una specie di fabbrica (Wikipedia: modello di metodo di fabbrica). Il tuo codice di alto livello richiede un oggetto dalla fabbrica e la fabbrica sa da quale classe concreta deve essere creato l'oggetto.

Modifica: l'implementazione della fabbrica (non la sua interfaccia) è specifica dell'applicazione, fa parte della configurazione. "Incolla" la logica aziendale e il livello inferiore, ma non fa parte di nessuno dei due.

L'approccio factory è utile se la decisione, quando e quanto spesso gli oggetti del livello inferiore devono essere costruiti è nella logica aziendale. In altri casi, è possibile utilizzare un'altra inversione dei meccanismi di controllo, ad esempio fornire alla business logic gli oggetti durante l'avvio della business logic (vedere risposta di Fabio).

    
risposta data 08.06.2018 - 22:09
fonte

Leggi altre domande sui tag