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?