Filozofia stojąca za wzorem memento


9

Czytałem o modelu memento z różnych źródeł w Internecie. Różnice w informacjach z różnych źródeł wprawiły mnie w zakłopotanie, dlaczego ten wzorzec jest w rzeczywistości potrzebny.

Dofactory realizacja mówi, że podstawową intencją tego wzorca jest przywrócenie stanu systemu.

Wiki mówi, że głównym celem jest być w stanie przywrócić zmian w systemie. Daje to inny wpływ - mówiąc, że system może mieć implementację pamiątek bez konieczności przywracania. I ta zdolność przywracania jest tego cechą.

OODesign tak mówi

Czasami konieczne jest uchwycenie stanu wewnętrznego obiektu w pewnym momencie i możliwość przywrócenia obiektu do tego stanu w późniejszym czasie. Taki przypadek jest przydatny w przypadku błędu lub niepowodzenia.

Moje pytanie brzmi: dlaczego właśnie tego używamy? Czy ma to uratować poprzednie stany - czy też promować enkapsulację między Opiekunem a Pamiątką? Dlaczego ten rodzaj enkapsulacji jest tak ważny?

Edycja: dla odwiedzających, sprawdź implementację!

Edycja : Pracuję nad wdrożeniem pamiątkowego rozwiązania mojego problemu. Wyślę kolejne pytanie na ten temat i połączę to pytanie z tym. Dziękujemy wszystkim za udzielenie cennych sugestii!

Edycja 3 : Oto link do mojej przykładowej implementacji

Odpowiedzi:


2

Podobny wzorzec, Memo lub Memoization, przechowuje również stan, ale często jest wykorzystywany jako optymalizacja szybkości programu. Jeśli czasochłonna operacja ma ograniczoną liczbę wspólnych wejść i wyjść, najbardziej powszechne (lub wszystkie z nich) można zapisać w tablicy mieszającej. Po ponownym wywołaniu z tymi samymi danymi wejściowymi najpierw sprawdza tablicę mieszającą, a jeśli ją znajdzie, zwraca poprzednie wyjście bez ponownego obliczenia.

Wyobrażam sobie, że wzorzec Memento może być również użyty do wydajności - zamiast wykonywać wszystkie obliczenia wsteczne dla zmiany stanu odwrotnego, po prostu przywróć poprzedni stan. Niektóre funkcje są jednokierunkowe, więc nie można cofnąć, chyba że zapiszesz poprzedni stan.

Możesz użyć wzorca Memento, aby zapamiętać funkcję okresową lub symetryczną, np. Sinus. Oblicz wszystkie wartości od 0-180 stopni, a następnie przejdź przez nie do tyłu, aby uzyskać wartości ujemne od 180-360. Jeszcze lepiej, oblicz wartości od 0-90, a następnie przejdź przez te wartości wstecz, aby uzyskać 90-180, do przodu dla 180-270 i do tyłu od 270-360.

Ctrl-Z w programie Word lub funkcja cofania dowolnego oprogramowania jest prawdopodobnie implementowana przy użyciu wzorca memento lub, w niektórych przypadkach, prawdopodobnie przez odwrotność funkcji, która wprowadziła każdą zmianę. W drugim przypadku historia wywoływanych funkcji byłaby pamiątkami, więc przypuszczam, że wzorzec pamiątkowy jest zawsze używany do cofania.


wzór zapamiętywania używany, aby uniknąć odwrotnego obliczania i funkcji okresowych - dzięki za te informacje! Nie ma to jak praktyczny przykład na wprowadzenie pomysłów!
TheSilverBullet

Może być również używany z czymś takim jak metoda Newtona do przybliżania pierwiastka kwadratowego, aby zdecydować, kiedy skończysz. mitpress.mit.edu/sicp/full-text/book/… Ponieważ podstawowa reprezentacja zmiennoprzecinkowa ma ograniczoną dokładność, wszystkie liczby ostatecznie będą miały powtarzające się przybliżenia. Jeśli wiesz, jakie były stare przybliżenia, możesz przestać zbliżać się przy pierwszym powtórzeniu odpowiedzi i uzyskać maksymalną dokładność (kosztem czasu i pamięci).
GlenPeterson

8

Sam wzorzec Memento służy do przechwytywania i zapisywania stanów. Hermetyzacja istnieje tylko w celu ochrony stanów przed resztą systemu - po przechwyceniu stanu należy go dokładnie kontrolować. Na przykład nie ma sensu zmieniać poprzedniego stanu po jego zapisaniu (to byłaby zmiana historii) i może nie mieć sensu po prostu powrót do poprzedniego stanu jednego obiektu bez wpływu na inne (aby zapobiec system nie przechodzi całkowicie w stan nieprawidłowy).

Najczęstszym zastosowaniem Memento, które widziałem, jest obsługa funkcji cofania. Jest to również związane z przechowywaniem funkcji ponawiania poprzez cofanie się w czasie do przodu.


Użyłem go również w logice kopiowania i serializacji (do wysyłania obiektów przez drut lub zapisywania stanu do pliku).
Scott Whitlock,

@ScottWhitlock Zapisywanie do pliku ma sens dla Memento. Obiekt Memento miałby możliwość zapisania się do określonego formatu i utworzenia nowego poprzez odczytanie tego formatu, natomiast Opiekun zapewniłby interfejs do zapisywania stanu do formatu zewnętrznego lub ładowania stanu z formatu zewnętrznego - to tylko rozszerzenie do zapisywania stanu w pamięci. Ale tak naprawdę nie widzę, żeby było to używane w logice kopiowania. Musiałbym o tym pomyśleć dużo więcej.
Thomas Owens


@ThomasOwens, dziękuję za tę ważną część twojego wyjaśnienia, że ​​pamiątką jest po prostu „ratowanie” stanów. Przywrócenie lub przywrócenie zależy od autora. Znalazłem tę część wyjaśnienia brakującą we wszystkich moich odniesieniach !!
TheSilverBullet

@ScottWhitlock, wielkie dzięki za link do twojej implementacji pamiątkowej! Zrozumiałem nie tylko jego podstawowe zastosowanie, ale także intuicyjne użytkowanie, tak jak Ty!
TheSilverBullet

1

Wszystkie te definicje kierują cię w tym samym kierunku; wszyscy mówią, że chodzi o to, aby móc przywrócić coś do poprzedniego stanu. Tym czymś może być cały system lub tylko pojedynczy obiekt.

Ten wzorzec jest przydatny, jeśli rekord zmienia się z czasem, ale musisz spełnić wymagania biznesowe, aby móc przywrócić go do dowolnego poprzedniego stanu w dowolnym momencie. Lub alternatywnie, jeśli chcesz móc wyświetlić rekord w takim stanie, w jakim był on wcześniej. Tego rodzaju wymagania są bardzo powszechne w wielu typach systemów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.