Ho un problema di progettazione e immagino che non sia qualcosa di totalmente insolito, quindi ci devono essere alcune buone pratiche là fuori.
Ho 2 entità di dominio: Processo e Attività. Un processo è essenzialmente un elenco di attività.
La funzionalità di un processo è sapere quali tipi di attività consiste (le istanze di attività vengono create utilizzando una fabbrica quando il processo passa allo stato "avviato") e per valutare lo stato in base allo stato delle attività incluse.
Un'Attività ha molte funzionalità, ma ciò di cui il Processo ha effettivamente bisogno solo è lo stato, quindi ho pensato che dovrei applicare l'ISP qui. A tale scopo ho creato un'interfaccia TaskStatus, implementata nella classe Task abstract di base, e Process contiene una raccolta di oggetti TaskStatus.
Ha senso fino a questo punto?
Ora il problema è che un componente diverso, chiamiamolo TaskProcessor, ottiene l'elenco delle attività da un processo e ha bisogno di un diverso tipo di accesso agli oggetti Task.
Come posso risolvere questo? Un modo in cui ho capito che mi avrebbe permesso di mantenere ISP è quello di spostare l'elenco di attività fuori dal processo, in un TaskRepository globale singleton. Sia Process che TaskProcessor possono eseguire query su TaskRepository per ottenere ciò di cui hanno bisogno senza dipendere da alcuna funzionalità di cui non hanno bisogno.
Non mi piace particolarmente questa soluzione a causa di 3 cose: 1. In generale, penso che meno singleton globali, meglio è 2. Sposta la responsabilità di tenere un elenco di Compiti fuori dal Processo, che potrebbe essere una buona cosa dal punto di vista dell'SRP, ma credo che appartenga effettivamente al Processo dal punto di vista del DDD. 3. Questo è un bel po 'di complessità aggiunta rispetto alla semplice modifica del tipo di elenco di attività in Processo e in corso con esso.