Su un'applicazione web per servizi di contabilità, ho la buona vecchia fattura. Per mantenere questo esempio il più semplice possibile, ogni fattura ha molte righe e ogni riga ha il suo articolo con il suo prezzo.
All'inizio, i prezzi degli articoli vengono letti da una tabella Listino prezzi.
Ogni volta che viene emessa una fattura, memorizzo la chiave dell'elemento della tabella Listino prezzi nella mia tabella InvoiceRows.
Ma i prezzi nella tabella Listino prezzi possono cambiare (e spesso lo fanno) quindi ho inserito un campo prezzi nella tabella InvoiceRows, che conterrà una copia del prezzo.
Ho gestito tutto questo attraverso un ORM (in realtà uso le rotaie ActiveRecord) ma Hibernate sarebbe più o meno lo stesso. Quindi il mio ORM lega alcune classi, ad esempio Fattura e InvoiceRow alle relative tabelle del database. Entrambi hanno un metodo di salvataggio che persiste i dati sul database.
Sono abbastanza indeciso su dove mettere la logica di copia esposta finora.
A condizione che possa andare in posti diversi e funzionare bene, mi chiedo se ci sia una pratica ben consolidata là fuori.
Finora, la mia idea è la seguente
Metodo di salvataggio prevalente
al momento contiene la logica di convalida e salvataggio.
vantaggi
Sarebbe impossibile dimenticarlo. Ciò sarebbe particolarmente utile nei team in cui la logica sarebbe "corretta per impostazione predefinita".
Inconvenienti
Lungo il percorso possono sorgere casi in cui voglio modificare una riga senza ricopiare i valori, ad esempio posso avere una colonna 'shipping_date' a livello di riga che può essere modificata (e quindi la riga salvata ) ma ciò non determina la nuova copia del prezzo.
Quindi probabilmente forzerei lo sviluppatore a "prendere una posizione" sul problema della copia e non dimenticarlo, piuttosto che consentire una singola modalità di salvataggio dei record.
Ecco perché in questo caso sarebbe meglio un argomento per il metodo di salvataggio di un secondo metodo chiamato save_whit_price_copy. Perché un argomento non può essere ignorato come si potrebbe fare con un secondo metodo con un nome diverso.
Questo è più o meno il meglio che potessi pensare a questo punto, quindi mi chiedo se ci sono altri approcci o varianti di questo che sono migliori di questo.