Jak działa undo
? Czy kopiuje wszystkie zarządzane obiekty za każdym razem, gdy zmieni się dowolna z wartości? Czy też kopiuje tylko rzeczywiste zmiany wraz z informacją, które obiekty zostały dotknięte? Czy to jest ciężkie czy lekkie?Jak działa funkcja cofania?
Odpowiedz
Mechanizm "cofnij" dla prawie każdego języka, który obsługuje konstrukty zorientowane obiektowo, wykorzystuje Memento Design Pattern, aby to umożliwić.
Oto przybliżona implementacja, która pomoże Ci myśleć. Zajmuje się stosem nieprzystosowanych operacji. (To nie obsługuje przerobić, ale to jest łatwe do obsługi przez zastąpienie stosu z listą i śledzenie aktualnej pozycji).
public class Undoable {
public static void Do(Action do, Action undo) {
do();
sUndoStack.Push(new Undoable(do, undo));
}
public static void Undo() {
sUndoStack.Pop().mUndoCallback();
}
private Undoable(Action doCallback, undoCallback) {
mDoCallback = doCallback;
mUndoCallback = undoCallback;
}
private Action mDoCallback, mUndoCallback;
// note: using a global stack here is lame, but works for demo purposes
private static readonly Stack<Undoable> sUndoStack = new Stack<Undoable>();
}
Aby to wykorzystać, powiedzmy, że użytkownik może zmienić wartość w niektórych obiekt tak:
public class Foo {
public string Bar {
get { return mBar; }
set {
if (mBar != value) {
mBar = value;
}
}
}
private string mBar;
}
Aby operacja cofnąć, po prostu zmienić setter do:
set {
if (mBar != value) {
string oldValue = mBar;
Undoable.Do(() => mBar = value,
() => mBar = oldValue);
}
}
teraz, jeśli zadzwonisz Undoable.Undo() z dowolnego miejsca w aplikacji, swoje wystąpienie Foo woli przywrócić poprzednią wartość paska. Jeśli Foo również podnosi zdarzenie, gdy pasek się zmienia (nie pokazano tutaj), interfejs będzie również poprawnie odświeżał się po cofnięciu.
- 1. Jak zaimplementować funkcję cofania?
- 2. Jak działa funkcja waitForAngularEnabled?
- 3. Jak działa funkcja pthread_create()?
- 4. Jak działa funkcja GetSchemaTable()?
- 5. Jak działa funkcja pause()?
- 6. Jak działa funkcja Double.isNaN()?
- 7. Jak działa funkcja Page.IsValid?
- 8. Jak std :: funkcja działa
- 9. Jak działa funkcja DateTime.Now.Ticks?
- 10. Jak działa funkcja @ Html.BeginForm()?
- 11. Jak zapobiec ustawianiu granicy cofania przez Emacs?
- 12. Jak działa funkcja agregacji Spark - działa funkcja aggregateByKey?
- 13. Metoda cofania Pythona
- 14. Jak działa ta funkcja javascript/Struktura działa
- 15. Jak działa funkcja Pyspark mapPartitions?
- 16. Jak działa funkcja $ zegarka AngularJS?
- 17. Jak działa funkcja noConflict jQuery?
- 18. Jak działa funkcja [UIView beginAnimations]?
- 19. Jak działa funkcja pushStack jQuery?
- 20. Jak działa funkcja geolokalizacji HTML5?
- 21. Jak działa funkcja synchronizacji statycznej?
- 22. Jak działa funkcja paramiko Channel.recv()?
- 23. Jak działa funkcja Dplyr :: n?
- 24. Jak działa ta funkcja min()?
- 25. Jak działa funkcja czytnika Safari?
- 26. Jak działa funkcja MaximumPoolSize ThreadPoolExecutor?
- 27. Jak działa funkcja wyszukiwania Pythona?
- 28. Jak działa funkcja python difflib.get_close_matches()?
- 29. Jak dokładnie działa funkcja python()?
- 30. cofania ciąg w Rust
To niekoniecznie musi być prawda. Memento może spalić dużo pamięci. Aplikacje, nad którymi pracowałem, zazwyczaj używają wzorca polecenia, w którym każde polecenie zawiera logikę, aby wykonać zmianę i ją cofnąć. W ten sposób wydajesz tylko pamięć na różnicę między poprzednim i następnym stanem obiektu. – munificent