Ho trovato un articolo di Martin Fowler che mi ha fatto dubitare delle mie scelte progettuali, in particolare degli oggetti dati. Martin Fowler ha scritto un articolo su ciò che pensa sia un odore di codice .
In questo articolo, dice:
The best smells are something that's easy to spot and most of time lead you to really interesting problems. Data classes (classes with all data and no behavior) are good examples of this. You look at them and ask yourself what behavior should be in this class. Then you start refactoring to move that behavior in there. Often simple questions and initial refactorings can be the vital step in turning anemic objects into something that really has class.
Ora, per il mio uso personale caso di classi di dati / oggetti / DTO / qualunque. : -)
Sto scrivendo una serie di classi che trasferiscono crediti dalla simulazione della nostra azienda alla simulazione di un destinatario. Questo processo ha tre fasi:
- Convalida: in questa fase, i dati sono convalidati - abbiamo già trasferito crediti sull'account di questa persona? Abbiamo già gestito questo articolo? Possiamo riprovare o abbiamo raggiunto la soglia della "modalità manuale"?
- Processo: in questa fase, facciamo il vero lavoro di spostare i crediti da un account all'altro. Utilizziamo gli oggetti recuperati nella fase di convalida, per ridurre il numero di query nel database e anche per migliorare le prestazioni della nostra applicazione.
- Post-process: a questo punto, controlliamo i dati e se i dati devono essere corretti automaticamente (IE l'utente ha inserito informazioni errate e sappiamo come correggerlo automaticamente), lo contrassegniamo per la correzione automatica.
Ora, gli articoli 2 e 3 stanno utilizzando molti dati che vengono recuperati o inizializzati nella fase 1: il gestore eventi, l'ordine e gli oggetti di pagamento e transazione e così via. Quello che facciamo è il seguente:
- L'oggetto di validazione memorizza tutti i suoi dati recuperati che sono utili al resto del processo in un
data transfer object
(DTO
). Questo oggetto ha solo setter e getter. - Il resto delle classi (la classe
process
e la classepost-process
) accettano ilDTO
come argomento del costruttore e eseguono l'elaborazione, la gestione degli eventi e la manipolazione dei dati su tali oggetti. Alla fine, quegli oggetti sono persistenti nel database.
L'oggetto dati (o l'oggetto di trasferimento dati) non è raccomandato qui? Dovremmo usare un altro modo per condividere i dati tra queste tre classi?