UNDO 및 REDO 옵션을 구현하고 싶습니다 (MS 워드 등에서 볼 수 있듯이). 나에게 그것에 대한 데이터 구조를 제안 할 수 있으며 어떻게 구현할 수 있습니까?UNDO 및 REDO 옵션을 구현하는 데 사용되는 데이터 구조
답변
데이터 구조가 아니라 디자인 패턴입니다. Command Pattern을 찾고 있습니다.
표준은 다단계 실행 취소를 지원하기 위해 스택에 Command 개체를 유지하는 것입니다. 재실행을 지원하기 위해 두 번째 스택은 실행 취소 한 모든 명령을 유지합니다. 따라서 명령을 실행 취소하기 위해 실행 취소 스택을 팝하면 재실행 스택에 넣은 명령과 동일한 명령을 누르게됩니다. 명령을 다시 실행할 때 역순으로 동일한 작업을 수행합니다. 다시 실행 스택을 팝하고 실행 된 스택으로 실행 된 명령을 다시 푸시합니다.
Objective-C 코코아에는 잘 문서화 된 NSUndoManager이라는 anwser가 있습니다.
당신은 실행 취소/확인이 샘플을 다시 실행 실현하려 명령 패턴을 사용할 수 있습니다
,이 기능에 대한 표준 패턴 (갱, 심지어)은 Memento입니다. 대부분의 프로그램은 실행 취소/스택을 다시 실행 사용하는 동안
또한, 특정 텍스트 편집기의 afficionados들이 몇 가지 명령을 취소 할 경우 그들의 전체 역사를 잃지 않도록 실행 취소/나무를 다시 실행 선호, 새로운 것을 시도하고, 마음을 바꿔라.
네 말이 맞아. 명령 패턴과 상호 작용하는 방법에 대한 정보를 추가하면 큰 도움이됩니다. – Kieveli
Memento의 사용을 취소하려고합니다. Memento가 undo/redo에 대한 작업 전후의 오브젝트 상태를 저장하는 데 사용됩니까? – NileshChauhan
메멘토를 생성하는 객체는 그것을 사용하여 그 상태로 돌아갑니다. 메멘토 자체는 마치 불투명 한 것으로 취급되어야합니다. 전체 상태를 메멘토에 집어 넣는 것은 명백한 구현 선택처럼 보이지만, 백엔드 저장소 나 다른 곳으로의 diff 나 id와 같은 것일 수도 있습니다. –
이것은 Command Pattern의 전형적인 경우입니다. 다음은 Python에서 실행 취소 기능의 샘플 구현입니다.
from os import rename
class RenameFileCommand(object):
def __init__(self, src_file, target_file):
self.src_file=src_file
self.target_file=target_file
def execute(self):
rename(self.src_file, self.target_file)
def undo(self):
rename(self.target_file,self.src_file)
class History(object):
def __init__(self):
self.commands=list()
def execute(self, command):
command.execute()
self.commands.append(command)
def undo(self):
self.commands.pop().undo()
if __name__=='__main__':
hist=History()
hist.execute(RenameFileCommand('test1.txt', 'tmp.txt',))
hist.undo()
hist.execute(RenameFileCommand('tmp2.txt', 'test2.txt',))
- 1. WPF의 Visual Studio 스타일 Undo/Redo 버튼
- 2. 주석을 구현하는 데 사용되는 사례
- 3. 안드로이드에서 SMS 메시지에 사용되는 데이터 구조
- 4. 스프레드 시트 구현에 사용되는 데이터 구조
- 5. C# - 설정 파일에 사용되는 데이터 구조
- 6. oracle-undo tablespace
- 7. Flex Text Control Undo
- 8. 대형 데이터 집합에 대한 선행 자동 완성을 구현하는 데 사용되는 전략은 무엇입니까?
- 9. MySQL 구조 및 데이터 병합
- 10. 벡터 및 레이어 데이터 구조
- 11. 다른 데이터 구조 및 복잡성
- 12. 레일, 데이터 구조 및 성능
- 13. 데이터 구조
- 14. OpenTk Project에 Undo 옵션 넣기
- 15. C에서 가장 많이 사용되는 일반적인 컬렉션 데이터 구조 라이브러리는 무엇입니까?
- 16. BigTable 데이터 모델을 설명하는 데 사용되는 단어의 의미
- 17. Python의 데이터 구조
- 18. 게임 도트 및 상자의 데이터 구조
- 19. jQuery 및 HTML5 DOM 변경 UNDO 함수
- 20. 배열과 같은 데이터 구조 성능
- 21. HttpClient 및 ProgressListener - 구현하는 데 도움이
- 22. 트리 데이터 구조
- 23. PowerEnumerate 함수가 반환하는 구조/데이터
- 24. Photoshop Undo System
- 25. UIActionSheet 내의 Undo 버튼
- 26. C++ 데이터 구조 시각화
- 27. 큰 값을 저장하는 데 사용되는 데이터 유형은 무엇입니까?
- 28. java의 tcp/ip를 통해 통신하는 데 사용되는 데이터 구조는 무엇입니까?
- 29. imagelinks의 데이터 구조
- 30. 복구 모드 인 UNDO 테이블 스페이스 데이터 파일을 오프라인으로 전환합니까?
또 다른 명령을 푸시하면 항상 다시 실행 스택을 지우는 것이 중요합니다. – Balk
데이터 구조는 "Command"개체의 인스턴스가있는 스택입니다. – zinovii
명령 패턴이 반드시 실행 취소 방법을 구현하는 것과 같지 않은 것처럼 느껴진다. 단지 하나의 옵션 일 뿐이며 OP 질문에 대한 대답도 아니다. 실행 취소/다시 실행 스택이 답입니다. (비록 그가 MSWord에 대해 언급했다고 가정 하긴하지만) –