메멘토 패턴의 철학


9

나는 다양한 인터넷 소스에서 memento 패턴을 읽었습니다. 다른 출처의 정보와 다른 점 때문에이 패턴이 실제로 필요한 이유에 대해 혼란스러워했습니다.

dofactory 구현이 패턴의 주요 목적은 시스템의 상태를 복원하는 것을 말한다.

Wiki 는 주요 목적은 시스템의 변경 사항을 복원 할 수 있도록 하는 것이라고 말합니다 . 이것은 시스템이 복원 할 필요없이 메멘토를 구현할 수 있다고 말하는 다른 영향을줍니다. 그리고 그 복원 능력은 이것의 특징입니다.

OODesign 은 말합니다

어떤 시점에서 오브젝트의 내부 상태를 캡처하고 나중에 오브젝트를 해당 상태로 복원하는 기능이 필요할 때가 있습니다. 이러한 경우는 오류 또는 실패시 유용합니다.

그래서 제 질문은 왜 우리가 이것을 정확하게 사용해야합니까? 이전 상태를 저장해야합니까, 아니면 관리인과 Memento 사이의 캡슐화를 촉진해야합니까? 이러한 유형의 캡슐화가 왜 그렇게 중요합니까?

편집 : 방문하는 사람들은 구현을 확인하십시오 !

편집 : 내 문제에 대한 memento 솔루션을 구현하고 있습니다. 나는 그것에 관한 또 다른 질문을 게시하고 그 질문을 이것에 연결합니다. 소중한 제안에 응답 해 주셔서 감사합니다!

편집 3 : 여기 내 샘플 구현에 대한 링크 가 있습니다

답변:


2

비슷한 패턴 인 메모 또는 메모도 상태를 저장하지만 종종 프로그램 속도 최적화로 사용됩니다. 시간이 많이 걸리는 작업에 제한된 수의 공통 입력 및 출력이있는 경우 가장 일반적인 입력 또는 출력을 해시 테이블에 저장할 수 있습니다. 동일한 입력으로 다시 호출하면 먼저 해시 테이블을 확인하고 찾은 경우 다시 계산하지 않고 이전 출력을 반환합니다.

Memento 패턴을 성능에도 사용할 수 있다고 생각합니다. 역 상태 변경을 위해 모든 역 계산을 수행하는 대신 이전 상태에서 복원하십시오. 일부 기능은 단방향이므로 이전 상태를 저장하지 않으면 실행 취소가 없습니다.

Memento 패턴을 사용하여 사인과 같은 주기적 또는 대칭 기능을 기억할 수 있습니다. 0-180도에서 모든 값을 계산 한 다음 뒤로 이동하여 180-360에서 음수 값을 얻습니다. 더 좋은 방법은 0-90에서 값을 계산 한 다음 그 값을 거꾸로하여 90-180을 얻고 180-270을 향해 앞으로, 270-360에서 뒤로 가져옵니다.

Word에서 Ctrl-Z 또는 모든 소프트웨어의 실행 취소 기능은 memento 패턴을 사용하거나 경우에 따라 각 변경을 수행 한 기능의 역으로 ​​구현 될 수 있습니다. 두 번째 경우, 함수가 호출 된 이력은 메멘토 스이므로 메멘토 패턴이 항상 실행 취소에 사용된다고 가정합니다.


역 계산을 피하고 주기적 기능에 사용되는 암기 패턴-이 정보에 감사드립니다! 개념을 이해하기위한 실제적인 예와 같은 것은 없습니다!
TheSilverBullet

또한 제곱근 근사를위한 뉴턴의 방법과 같은 방법으로 사용하여 완료 시점을 결정할 수도 있습니다. mitpress.mit.edu/sicp/full-text/book/… 기본 부동 소수점 표현의 정확도가 제한적이므로 모든 숫자는 반복적 인 근사값을 갖습니다. 이전 근사치가 무엇인지 알면 처음으로 답을 반복 할 때 근사치를 중지하고 시간과 메모리를 희생하여 최대 정확도를 얻을 수 있습니다.
GlenPeterson

8

Memento 패턴 자체만으로 상태를 캡처하고 저장하는 데 사용됩니다. 캡슐화는 시스템의 나머지 부분으로부터 상태를 보호하기 위해서만 존재합니다. 일단 상태가 캡처되면주의해서 제어해야합니다. 예를 들어, 이전 상태가 저장되면 (이력이 변경 될 수 있음) 이전 상태를 변경하는 것은 의미가 없으며 다른 객체에 영향을주지 않고 단순히 한 객체의 이전 상태로 돌아가는 것은 의미가 없습니다. 시스템이 완전히 유효하지 않은 상태가되는 것).

내가 본 Memento의 가장 일반적인 용도는 실행 취소 기능을 지원하는 것입니다. 또한 시간을 거슬러 뒤로 이동하여 다시 실행 기능을 저장하는 것과 관련이 있습니다.


또한 복사 논리 및 직렬화 논리 (와이어를 통해 객체를 보내거나 상태를 파일에 저장하기 위해)에서 사용했습니다.
Scott Whitlock

@ScottWhitlock 상태를 파일에 저장하면 Memento에 적합합니다. Memento 개체는 지정된 형식으로 자신을 작성하고이 형식을 읽어서 새 형식을 만들 수있는 반면, Caretaker는 외부 형식으로 상태를 저장하거나 외부 형식에서 상태를로드 할 수있는 인터페이스를 제공합니다. 메모리에 상태를 저장합니다. 그래도 복사 논리에서 사용되는 것을 볼 수는 없습니다. 그것에 대해 더 많이 생각해야 할 것입니다.
Thomas Owens


@ThomasOwens, memento가 기본적으로 상태를 "저장"한다는 설명에서 중요한 부분에 감사드립니다. 복원 여부는 구현 자의 재량입니다! 나는 모든 참고 문헌에서 누락 된 설명 의이 부분을 발견했습니다 !!
TheSilverBullet 1

@ScottWhitlock, memento 구현에 대한 링크에 감사드립니다! 나는 기본적인 사용법뿐만 아니라 당신이했던 것처럼 직관적 인 사용법을 이해할 수있었습니다!
TheSilverBullet 1

1

이 모든 정의는 당신을 같은 방향으로 인도합니다. 그들은 모두 요점이 이전 상태로 무언가 를 복원 할 수 있다고 말합니다 . 그것은 전체 시스템이거나 단일 객체 일 수 있습니다.

이 패턴은 레코드가 시간이 지남에 따라 상태를 변경하는 경우 유용하지만 언제든지 이전 상태로 레코드를 복원 할 수있는 비즈니스 요구 사항이 있습니다. 또는 이전 시점과 마찬가지로 레코드를 볼 수 있어야하는 경우. 이러한 유형의 요구 사항은 많은 유형의 시스템에서 매우 일반적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.