Tipi di oggetti
Ai fini della nostra discussione, separiamo i nostri oggetti in tre diversi tipi:
Questi sono gli oggetti che portano a termine il lavoro. Spostano denaro da un conto corrente a un altro, eseguono gli ordini e tutte le altre azioni che prevediamo di intraprendere il software aziendale.
Gli oggetti logici di dominio normalmente non richiedono accessori (getter e setter). Piuttosto, si crea l'oggetto passandogli le dipendenze attraverso un costruttore e quindi manipolando l'oggetto attraverso metodi (dire, non chiedere).
Gli oggetti di trasferimento dati sono allo stato puro; non contengono alcuna logica aziendale. Avranno sempre accessori. Possono avere o meno setter, a seconda che tu li scriva o meno in modo immutabile . O imposterai i tuoi campi nel costruttore e i loro valori non cambieranno per la durata dell'oggetto, oppure i tuoi accessori saranno letti / scritti. In pratica, questi oggetti sono in genere mutabili, in modo che un utente possa modificarli.
Visualizza oggetti modello contengono una rappresentazione dei dati visualizzabile / modificabile. Possono contenere una logica aziendale, generalmente limitata alla convalida dei dati. Un esempio di un oggetto Visualizza modello potrebbe essere InvoiceViewModel, contenente un oggetto Cliente, un oggetto Intestazione fattura ed Elementi pubblicitari fattura. Visualizza gli oggetti del modello contengono sempre accessori.
Quindi l'unico tipo di oggetto che sarà "puro", nel senso che non contiene gli accessi ai campi, sarà l'oggetto Logica di dominio. La serializzazione di un tale oggetto salva il suo attuale "stato computazionale", in modo che possa essere recuperato in seguito per completare l'elaborazione. Visualizza modelli e DTO possono essere liberamente serializzati, ma in pratica i loro dati vengono normalmente salvati in un database.
Serializzazione, dipendenze e accoppiamento
Mentre è vero che la serializzazione crea dipendenze, nel senso che devi deserializzare un oggetto compatibile, non ne consegue necessariamente che devi cambiare la configurazione della serializzazione. I buoni meccanismi di serializzazione sono di uso generale; a loro non importa se cambi il nome di una proprietà o di un membro, purché possa ancora mappare i valori ai membri. In pratica, ciò significa solo che è necessario ricerializzare l'istanza dell'oggetto per rendere la rappresentazione di serializzazione (xml, json, qualunque cosa) compatibile con il nuovo oggetto; non dovrebbero essere necessarie modifiche alla configurazione del serializzatore.
È vero che gli oggetti non dovrebbero preoccuparsi di come sono serializzati. Hai già descritto un modo per separare tali preoccupazioni dalle classi di dominio: la riflessione. Ma il serializzatore dovrebbe preoccuparsi di come serializza e deserializza gli oggetti; quella, dopo tutto, è la sua funzione. Il modo in cui tieni gli oggetti disaccoppiati dal processo di serializzazione è di rendere la serializzazione una funzione di uso generale , in grado di funzionare con tutti i tipi di oggetti.
Una delle cose di cui le persone si confondono è che il disaccoppiamento deve avvenire in entrambe le direzioni. Non è così; deve funzionare solo in una direzione. In pratica, non puoi mai disaccoppiare completamente; c'è sempre qualche accoppiamento. L'obiettivo dell'accoppiamento libero è facilitare la manutenzione del codice, non rimuovere tutte le dipendenze.