È un oggetto diverso o lo stesso oggetto con una proprietà modificata (mutabile o meno)?

0

Quando progetto l'architettura di un'applicazione, di solito penso alla natura degli oggetti e alle interazioni tra loro.

Il modo in cui attualmente penso alla mutabilità è chiedermi se cambiare un membro cambia completamente l'oggetto. Un'auto può essere ridipinta, ma se cambi il produttore è un'altra macchina.

Ora, questo problema è sorto durante la progettazione di una semplice applicazione che disegna una piccola animazione. L'animazione è una linea che cresce in larghezza fino ad un certo punto, e quindi rimane la stessa.

Supponiamo che ci sia un oggetto Line, con un membro della larghezza e una funzionalità di disegno. Ora ho 2 approcci:

for (int newWidth = 10; newWidth < 1000; newWidth++) {
    line.setWidth(newWidth);
    line.draw();
}

, che significa che la larghezza è una proprietà mutabile della linea, o:

for (int newWidth = 10; newWidth < 1000; newWidth++) {
    line = Line(newWidth);
    line.draw();
}

, che crea un nuovo oggetto (cioè una linea diversa) per ogni larghezza.

Come prestazione generale, la seconda versione sembra più inefficiente, ma quale è meglio in termini di design?

    
posta Paul92 15.06.2016 - 01:59
fonte

2 risposte

3

The way I currently think about mutability is to ask myself if changing a member changes the object altogether.

Penso che questo sia il tuo problema principale. Mentre le due domande sono correlate, sono diverse l'una dall'altra. Ci sono benefici per la mutabilità e l'immutabilità che significano che entrambi possono essere utili indipendentemente dal fatto che il tuo oggetto abbia o meno identità.

Ma penso che un altro problema che hai nel tuo progetto è che hai considerato un paio di alternative (oggetto mutabile che cambia, oggetto immutabile che viene sostituito) ma ce ne sono altre da considerare (in particolare, oggetto immutabile che incapsula le modifiche e quindi rimane costante). Considera un design diverso per questo problema in cui invece dell'oggetto con una proprietà width ha una width funzione . A seconda di come stai facendo la tua animazione, potresti passare un numero di frame o un tempo come argomento, e poi Line può calcolare da sé quanto dovrebbe essere largo a quel punto dell'animazione e non ha bisogno di cambiare affatto.

Se hai linee diverse che devono comportarsi in modo diverso potresti avere una superclasse Line astratta e sottoclassi per i diversi comportamenti, oppure potresti passare il Line di riferimento a una funzione come parametro quando lo si inizializza.

    
risposta data 15.06.2016 - 10:19
fonte
2

In Domain Driven Design, c'è una nozione di Oggetto entità e oggetto Valore . Per dirla semplicemente gli oggetti entità hanno vite, sono identificati da un identificatore speciale e sono mutabili. Mentre gli oggetti valore sono identificati solo dal loro valore, di solito sono immutabili e possono essere creati / distrutti in qualsiasi momento. Stai provando a decidere ogni volta che Line è un'entità o un oggetto valore.

Ma DDD si occupa principalmente della logica di dominio complessa. Vorrei mettere in discussione la sua utilità nel tuo caso, che a mio avviso preferirebbe facilità d'uso e prestazioni rispetto all'estensibilità e alla modularità.

    
risposta data 15.06.2016 - 09:20
fonte

Leggi altre domande sui tag