Il libro GoF "Pattern di progettazione" descrive il modello Memento
come un oggetto che incapsula il suo stato in un oggetto separato. Tuttavia, il libro descrive in modo specifico il memento da utilizzare con un custode specifico; nel loro esempio, un fornitore di annullamento / ripristino.
Tuttavia, questo pattern, specialmente in C #, quando il Memento è reso un struct
(in entrambi i sensi tecnici e concettuali), può fornire molti vantaggi quando si fa una parte più generale di una classe:
- Permetti una facile clonazione, che rende il caching, ect più facile e meno soggetto a errori
- Permetti alla logica di persistenza di essere condivisa facilmente e con garbo dalle diverse versioni del modello che si estende su più domini
- Visualizza le proprietà in un'interfaccia utente che altrimenti verrebbe incapsulata
- Gestire le operazioni CRUD per le proprietà altrimenti incapsulate
- Affrontare l'invidia per quanto riguarda l'invidiabilità quando è inevitabile, ad esempio una classe che regola un'operazione tra due altre classi (un cliente prenota un volo o un volo aggiunge un cliente? Evitiamo questa domanda mettendo la prenotazione di un volo in un luogo separato)
- Possiamo usare la comoda sintassi di intilizer dell'oggetto senza rendere modificabili le nostre proprietà. Inoltre, evitiamo costruttori che sono gonfiati con argomenti
- E, naturalmente, persistenza di proprietà altrimenti incapsulate
Possiamo anche usare il memento come una sorta di versione di classe della classe implicitamente sicura per tutta l'applicazione.
Tuttavia, si potrebbe obiettare, molti di questi hanno appena abusato del modello allo scopo di aggirare le carenze linguistiche.
Ad esempio:
public class Computer
{
public Computer(ComputerMemento state)
{
_state = state;
}
private ComputerMemento _state;
public ComputerMemento State
{
get
{
var copy = _state;
return copy;
}
}
public void DoSomeComputerThing() { }
public void DoComputerStuff() { }
public int GetSomeComputerCalculation() { }
}
public struct ComputerMomento
{
public string MachineName;
public float ProcessorSpeed;
public long AmountOfRam;
public int CPUCores;
}
La precedente classe% co_de può ora esporre una rappresentazione modificabile dei suoi stati pur essendo in grado di certificare (sebbene in modo facilmente aggirabile) che le modifiche al suo stato (tramite i suoi metodi) siano valide e supportate. Fondamentalmente, il consumatore può selezionare il livello di ignoranza desiderato.
Questo uso esteso di quello che sembra essere il pattern del memento è ancora il pattern del memento? In caso contrario, ha un nome?
EDIT: nel codice precedente, poiché Computer
s viene passato per valore, lo stato è immutabile da classi esterne.