문제

나는 다음을 읽었습니다. 기사

불변의 물체는 특히 실행 취소/레디 및 낙태와 같은 특정 일반적인 관용구를 구현하는 데 특히 편리합니다.예를 들어 실행 취소를 수행하십시오.실행 취소 구현의 일반적인 기술은 어떻게 든 각 명령을 리버스로 실행하는 방법 (소위 "명령 패턴")을 아는 객체 스택을 유지하는 것입니다.그러나 반대로 명령을 실행하는 방법을 알아내는 것은 까다로울 수 있습니다.더 간단한 기술은 연속 명령 사이의 시스템 상태를 나타내는 불변의 물체의 스택을 유지하는 것입니다.그런 다음 명령을 취소하려면 이전 시스템 상태로 되돌아 가기 만하면 (아마도 현재 상태를 레다 스택에 저장합니다).

그러나 이 기사에서는 "실행 취소" 작업을 구현하기 위해 불변 객체를 사용할 수 있는 방법에 대한 좋은 실제 예를 보여주지 않습니다.예를 들어...Gmail 받은 편지함에서 이메일 10개를 삭제합니다.그렇게 하면 실행 취소 옵션이 제공됩니다.이와 관련하여 불변 객체가 어떻게 도움이 될까요?

도움이 되었습니까?

해결책

불변 객체는 시스템의 전체 상태를 보유하므로 이 경우 원래 받은 편지함을 포함하는 객체 A, 삭제된 10개의 이메일이 포함된 받은 편지함을 포함하는 객체 B 및 (사실상) 포인터를 갖게 됩니다. B에서 A로 다시 돌아가서 "실행 취소"를 한 번 수행하면 시스템 상태로 B 사용을 중지하고 대신 A를 사용하기 시작함을 나타냅니다.

그러나 Gmail 받은 편지함은 이 기술을 사용하기에는 너무 큽니다.실제로 상당히 적은 양의 메모리에 저장할 수 있는 문서에 사용하므로 여러 수준의 실행 취소를 위해 많은 문서를 보관할 수 있습니다.

10개 수준의 실행 취소를 유지하려는 경우 두 개의 불변 개체(현재 개체와 10번의 "실행 취소" 이전 개체)와 그 사이에 적용된 명령 목록만 유지하여 잠재적으로 메모리를 절약할 수 있습니다.

"실행 취소"를 수행하려면 마지막 Command 개체를 제외한 모든 개체를 다시 실행하고 이를 새로운 현재 개체로 사용한 다음 마지막 Command를 삭제합니다(또는 "Redo" 개체로 저장).새 작업을 수행할 때마다 현재 개체를 업데이트하고 관련 명령을 목록에 추가한 다음(목록의 길이가 10개 명령을 초과하는 경우) 실행 취소 목록의 시작 부분부터 개체에 대한 첫 번째 명령을 실행합니다. 목록의 첫 번째 명령을 버립니다.

다양한 수의 시스템 전체 표현과 시스템 사이의 다양한 명령을 포함하는 다양한 다른 체크포인트 시스템도 수행할 수 있습니다.그러나 이는 귀하가 인용한 원래 아이디어에서 점점 더 멀어지고 점점 더 일반적인 변경 가능한 시스템과 유사해집니다.그러나 명령을 일관되게 되돌릴 수 있게 만드는 문제는 방지됩니다.객체에 명령을 적용하기만 하면 되고 역방향으로는 적용하지 않아도 됩니다.

SVN 및 기타 버전 제어 시스템은 사실상 디스크 또는 네트워크 기반의 실행 취소 및 다시 실행 형태입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top