Design Pattern per gli aggiornamenti degli oggetti

1

Ho una classe "Product" con ID e più campi e una funzione updateProduct (id, Product update). L'intenzione è che "aggiornamento" contenga solo le informazioni modificate - altri campi non modificati potrebbero essere mancanti o nulli.

Attualmente ho un codice simile al seguente:

Product updateProduct(long id, Product update) {
    ProductBuilder builder = new Builder().basedOn(productDatabase.get(id));

    if (update.getName() != null) {
        builder.withName(update.getName());
    }
    if (...) { 
        // Builder.with...
    }
    if (update.getPrice() != null) {
        builder.withPrice(update.getPrice());
    }

    return builder.build();
}

In sostanza, voglio prendere tutti i campi esistenti e applicare quelli nuovi in cima.

C'è un modo per esprimere meglio questa logica?

Se aggiungo una nuova proprietà Product, devo quindi aggiornare questo metodo. Anche se non è un problema per me, potrebbe essere meno ovvio dove il codice si sta rompendo in futuro.

La mia classe di prodotto ha attualmente un sacco di campi, in cui la maggior parte è facoltativa - sta avendo un'istruzione if per ognuno di essi evitabile in qualche modo?

    
posta lgj 08.04.2016 - 13:34
fonte

1 risposta

1

Se non vuoi modificare il tuo metodo updateProduct() per ogni campo (e se hai molti, molti campi, forse è abbastanza giusto), forse uno dei seguenti approcci può aiutarti:

a) fornisce i tuoi aggiornamenti come Map<String,Object> dove la chiave è un nome di campo e il valore è il valore aggiornato. Usa la riflessione per trovare il campo corrispondente e modificare quello

b) simile a quanto sopra, ma utilizzare la reflection per trovare i campi nel prodotto 'update' e quindi impostare nell'oggetto di destinazione. A differenza della prima soluzione, dovrai determinare ulteriormente il sottoinsieme di campi da aggiornare

Potresti forse evitare il riflesso memorizzando i campi sottostanti Product come Map (o struttura simile) e fornire accessors appropriati. Facendo ciò puoi semplicemente aggiornare la raccolta sottostante.

    
risposta data 08.04.2016 - 13:51
fonte

Leggi altre domande sui tag