Attualmente sto pensando a come implementare un software che ho scritto alcuni anni fa con un'architettura pulita / esagonale / a cipolla. Questo non sarà un "Grand Redesign from Heaven", dal momento che non sono più coinvolto nel progetto, ma piuttosto mi piacerebbe imparare cosa avrei potuto fare meglio.
Una cosa che ho problemi a realizzare per casi d'uso specifici è il "Dillo, non chiedere" principio ( TDA ). Senza entrare troppo nei dettagli del dominio del problema, vorrei dare una breve descrizione dei principali casi d'uso
Locali base:
- I dati sono organizzati in partite (abbiamo analizzato uno sport di squadra)
- Ogni partita ha un numero di giocatori ciascuno per la casa e il gruppo di visitatori
- C'è una serie di azioni per ogni partita (in pratica i giocatori toccano la palla)
- Ogni azione è associata a un giocatore
- Per motivi di semplicità, ho omesso set all'interno della partita e sostituzioni di giocatori e simili
Utilizza i casi per la corrispondenza
- Aggiungi home player
- Aggiungi lettore visitatore
- Aggiungi azione per casa / visitatore e numero di riferimento
(di nuovo, c'è molto di più, ma penso che sarà sufficiente per descrivere il mio problema)
L'analisi dei dati all'interno delle partite (anche su più corrispondenze, ma - semplicità) è centrale per l'applicazione. All'interno dell'architettura posizionerei le analisi sul secondo anello, poiché non sono entità dell'applicazione, ma forniscono comunque casi d'uso centrali. Le analisi si basano molto sul filtraggio e sul successivo conteggio delle azioni all'interno della corrispondenza.
- Filtro per il giocatore
- Filtraggio con altre azioni (ad esempio, prendi azione
A
se si verifica dopo l'azioneR
, ma non dopo l'azioneD
; prendi solo azioneA
dopo un'azione buona o molto buonaR
;. ..) - Filtro per qualità
- Calcoli basati sulle qualità delle azioni rimanenti
- e così via
In ogni caso, solo chiedendo all'oggetto della partita che i suoi contatti operassero su di loro sarebbe una violazione del TDA. E dal momento che la partita contiene la logica del business, ritengo che dovrei rispettare TDA. D'altra parte, non vedo un modo per aggiungere analisi a una corrispondenza e mantenere comunque le definizioni delle analisi sul secondo squillo.
Come posso eseguire analisi delle azioni all'interno della partita, ma aderire ancora al TDA? O non dovrei comunque operare su una partita per le analisi, ma ottenere direttamente le azioni da un repository?
var contacts = contactsRepository.GetContactsForMatch(match);
Sebbene ciò risolva il problema per le analisi, non lo farebbe per salvare i contatti per una corrispondenza, e il salvataggio diretto dalla rispettiva classe violerebbe certamente l'SRP e non è nel senso dei paradigmi dell'architettura.