Filosofia dietro il modello del ricordo


9

Ho letto il modello del ricordo da varie fonti di Internet. Informazioni diverse da fonti diverse mi hanno lasciato confuso riguardo al motivo per cui questo modello è effettivamente necessario.

L' implementazione dofactory afferma che l'intenzione principale di questo modello è ripristinare lo stato del sistema.

Wiki afferma che l'intenzione principale è quella di essere in grado di ripristinare le modifiche sul sistema. Questo ha un impatto diverso, dicendo che è possibile per un sistema avere l'implementazione del ricordo senza bisogno di ripristinarlo. E questa capacità di ripristino è una caratteristica di questo.

OODesign dice questo

A volte è necessario catturare lo stato interno di un oggetto ad un certo punto e avere la capacità di ripristinare l'oggetto a quello stato in un secondo momento. Tale caso è utile in caso di errore o fallimento.

Quindi, la mia domanda è: perché usiamo esattamente questo? È per salvare stati precedenti o per promuovere l'incapsulamento tra il custode e il ricordo? Perché questo tipo di incapsulamento è così importante?

Modifica: per coloro che visitano, dai un'occhiata a questa implementazione!

Modifica : sto lavorando all'implementazione di una soluzione ricordo al mio problema. Pubblicherò un'altra domanda a riguardo e collegherò quella domanda a questa. Grazie a tutti per aver risposto con preziosi suggerimenti!

Modifica 3 : ecco il link alla mia implementazione di esempio

Risposte:


2

Un modello simile, Memo o Memoization, memorizza anche lo stato, ma viene spesso utilizzato come ottimizzazione della velocità del programma. Se un'operazione che richiede tempo ha un numero limitato di input e output comuni, i più comuni (o tutti) possono essere memorizzati in una tabella hash. Quando viene nuovamente richiamato con gli stessi input, controlla innanzitutto l'hashtable e, se li trova, restituisce l'output precedente senza ricalcolarlo.

Immagino che un modello Memento possa essere usato anche per le prestazioni - invece di fare tutti i calcoli inversi per un cambio di stato inverso, basta ripristinare dallo stato precedente. Alcune funzioni sono a senso unico, quindi non è possibile annullare a meno che non si memorizzi lo stato precedente.

È possibile utilizzare un modello Memento per memorizzare una funzione periodica o simmetrica come seno. Calcola tutti i valori da 0-180 gradi, quindi vai indietro attraverso di essi per ottenere i valori negativi da 180-360. Meglio ancora, calcola i valori da 0 a 90, quindi vai indietro tra questi valori per ottenere 90-180, avanti per 180-270 e indietro da 270-360.

Ctrl-Z in Word, o la funzione di annullamento di qualsiasi software è probabilmente implementata usando il modello memento, o in alcuni casi, possibilmente da un contrario della funzione che ha apportato ogni modifica. Nel secondo caso, la storia di quali funzioni venivano chiamate sarebbero ricordi, quindi suppongo che il modello di ricordo sia sempre usato per annullare.


modello di memorizzazione utilizzato per evitare il calcolo inverso e per le funzioni periodiche - grazie per queste informazioni! Niente come un esempio pratico per ottenere i concetti da vedere!
TheSilverBullet il

Può anche essere usato con qualcosa come il metodo di Newton per l'approssimazione della radice quadrata per decidere quando hai finito. mitpress.mit.edu/sicp/full-text/book/… Poiché la rappresentazione in virgola mobile sottostante ha una precisione limitata, tutti i numeri avranno eventualmente approssimazioni ripetute. Se sai quali erano le vecchie approssimazioni, puoi smettere di approssimare la prima volta che ripeti una risposta e ottieni la massima precisione (a scapito di un po 'di tempo e memoria).
GlenPeterson,

8

Di per sé, il modello Memento viene utilizzato solo per catturare e salvare gli stati. L'incapsulamento esiste solo per proteggere gli stati dal resto del sistema: una volta acquisito uno stato, è necessario controllarlo attentamente. Ad esempio, non ha senso poter cambiare uno stato precedente una volta che è stato salvato (ciò cambierebbe la cronologia) e potrebbe non avere senso tornare semplicemente a uno stato precedente di un oggetto senza influire sugli altri (per evitare il sistema non entra in uno stato completamente non valido).

L'uso più comune di un Memento che ho visto è supportare la funzionalità di annullamento. È inoltre correlato alla memorizzazione della funzionalità di ripetizione spostandosi indietro nel tempo.


L'ho anche usato nella logica di copia e nella logica di serializzazione (per inviare oggetti su un filo o salvare lo stato su un file).
Scott Whitlock,

@ScottWhitlock Il salvataggio dello stato in un file ha senso per Memento. L'oggetto Memento avrebbe la possibilità di scrivere se stesso in un formato specificato e crearne uno nuovo leggendo questo formato, mentre il Custode fornirebbe l'interfaccia per salvare lo stato in un formato esterno o caricare lo stato dal formato esterno - è solo un'estensione per salvare lo stato in memoria. Tuttavia, non riesco davvero a vedere il suo utilizzo nella logica della copia. Dovrei pensarci molto di più.
Thomas Owens


@ThomasOwens, grazie per quella parte importante nella tua spiegazione che il ricordo è sostanzialmente quello di "salvare" gli stati. È discrezione dell'implementatore ripristinare o no! Ho trovato questa parte della spiegazione mancante da tutti i miei riferimenti !!
TheSilverBullet il

@ScottWhitlock, grazie mille per il link alla tua implementazione ricordo! Sono stato in grado di capire non solo il suo uso di base, ma anche un uso intuitivo come hai fatto tu!
TheSilverBullet il

1

Tutte queste definizioni ti guidano nella stessa direzione; stanno tutti dicendo che il punto è riuscire a ripristinare qualcosa al suo stato precedente. Quel qualcosa può essere l'intero sistema o solo un singolo oggetto.

Questo modello è utile se un record cambia stato nel tempo, ma hai i requisiti aziendali per poterlo ripristinare in qualsiasi stato precedente in qualsiasi momento. O in alternativa, se è necessario essere in grado di visualizzare il record com'era in qualsiasi momento precedente. Questi tipi di requisiti sono molto comuni in molti tipi di sistemi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.