Recentemente mi sono reso conto di avere troppe dipendenze in molte delle mie classi. Ora sto cercando di risolverlo per la classe più importante. Penso di avere un'idea di come, ma non sono sicuro se sia la migliore idea.
La classe più importante è una classe di servizio. Quello che fa è far sì che una "cosa" nell'app passi attraverso diversi stati. Esiste un flusso specifico che segue, attivato dagli utenti che eseguono determinate azioni nell'app. (Invia, conferma, rifiuta, chiudi, ...)
In questo momento, c'è un metodo pubblico per ogni azione che puoi fare per cambiare lo stato di quell'oggetto, circa 10 metodi. Questo sembra sbagliato, anche se la responsabilità di questa classe è "cambiare lo stato".
Quando lo stato cambia, tuttavia, è necessario che vengano eseguite altre azioni, come l'invio di una e-mail, la chiusura di determinate attività, la ricerca di documenti, ecc. Molte di queste attività hanno altre dipendenze e perché tutti i metodi sono nella stessa classe il servizio principale ora ha 12 dipendenze.
Il mio obiettivo principale è ridurre il numero di dipendenze nel servizio principale, pur contenendo una sorta di "panoramica" di tutte le azioni che puoi intraprendere.
Stavo guardando un elenco di modelli di progettazione comuni e ho notato il modello "Command". Penso di poter creare una serie di classi di comando come "SubmitThing", "CloseThing". Ognuno con le proprie dipendenze specifiche. In questo modo trasferisco le dipendenze ad altre classi e ogni azione ha le sue dipendenze.
Le informazioni che posso trovare sul pattern Command tuttavia descrivono i suoi principali vantaggi: è possibile tenere traccia di quali comandi sono stati eseguiti, ripristinarli, aggiungere la registrazione. Questo non è proprio il problema che volevo risolvere, anche se la descrizione del pattern sembra allettante.
Quindi, il modello di progettazione di Command è la strada da percorrere qui o ci sono schemi migliori per suddividere una classe che ha diverse azioni in parti più piccole?
Un piccolo esempio:
public class ThingService {
private IDocumentService documentService;
private IMailService mailService;
private IAnotherService anotherService;
private IActionsOnClosingService actionsOnClosingService;
public ThingService(IDocumentService documentService,
IMailService mailService,
IAnotherService anotherService,
...
) {
this.documentService = documentService;
this.mailService = mailService;
this.anotherService = anotherService;
...
}
public void submitThing(Thing thing, SubmitData data) {
thing.setStatus(SUBMITTED);
thing.setData(data);
documentService.doSomething();
mailService.doSomething();
}
public void closeThing(Thing thing, CloseData data) {
thing.setStatus(CLOSED);
thing.setData(data);
documentService.doSomething();
mailService.doSomething();
actionsOnClosingService.doActionsOnClosing();
}
}