문제

쓰고 있어요 구조적 모델링 도구에 대한 시민 enginering 응용 프로그램.나는 하나의 거대한 모델을 나타내는 클래스 전체에 건물을 포함하의 컬렉션 노드 라인 요소,로드,등등.또한 사용자 정의됩니다.

나는 이미 코드는 취소 엔진을 절약하는 깊은 복사 후 각 변형 모델입니다.지금 내가 생각하기 시작이 있다면 코드 다릅니다.대 깊은 복사,수도의 목록을 저장하고 각자의 액션으로 대응하는 역 수 있게 되었습니다.그래서 내가 적용할 수 있는 역 수정을 현재 모델을 취소,또는 수정을 다시 수행합니다.

내가 상상할 수 있는 방법을 수행 간단한 명령을 변경하는 객체 속성,등등.그러나는 방법에 대해 복잡한 명령?처럼 삽입하는 새로운 노드에 객체를 모델을 추가하는 일부 광고있는 개체를 유지를 참조하여 새로운 노드입니다.

어떻게 한 것이 이동을 구현하는 방법에 대한?

도움이 되었습니까?

해결책

대부분의 예로는 본 사용의 변형 명령 패턴 니다.모든 사용자는 활동의할 수 있는 고유 명령으로 인스턴스에 모든 정보를 실행하여 조치와 롤백합니다.할 수 있습니다 다음의 목록을 유지하는 모든 명령을 실행되었고할 수 있습들을 하나 하나입니다.

다른 팁

나는 생각을 모두 죽음 명령은 실용적이지 않을 때 당신과 함께 다루고 있는 모델의 크기와 범위는 영업 이익을 의미합니다.그들은 일이지만,그것은 것이 많은 작업을 유지하고 확장할 수 있습니다.

이러한 유형의 문제,나는 당신을 구축해야에서 지원하는 데이터 모델을 지원하는 차별 검사점 모든 객체 에 관련된 모델입니다.해봤으면 그 일은 매우 매끄럽습니다.가장 큰 일을 해야 할 일은 피하는 직접 포인터를 사용하거나 참조에서 모델이다.

모든 대한 참조 다른 객체를 사용하여 어떤 식별자(같은 정수).때마다 개체가 필요하고,당신이 조회는 현재 정의로부터 물체의 표입니다.테이블을 포함하는 링크 목록에 대한 각 개체를 포함하는 모든 이전 버전과 함께 관련 정보에는 체크포인트 그들이 활동했습니다.

구현/취소 간단하다:귀하의 작업을 설정하는 새로운점;롤백하는 모든 개체 버전을 엽니다.

그것은 몇 가지 분야에서 코드는 많은 이점이 있습니다:당신이 필요하지 않 복사 때문에 당신이 하고 있는 차등 저장소 모델의 상태;할 수 있습 범위의 양을 메모리를 사용할( 중요 같은 것들에 대한 CAD 모델)중 하나에 의해 수 redos 또는 메모리 사용된다;확장성 및 낮은 유지 보수를 위해 기능을 하는 모델에서 작동하지 않기 때문에 아무것도 할 필요가를 구현하는 취소/을 다시 만들었습니다.

얘기하는 경우에 GoF,the 유품 패턴 특별히 주소 취소합니다.

으로 다시 명령 패턴은 매우 강력한 방법을 구현하는 취소/을 다시 만들었습니다.하지만 중요한 이점을 내가 명령에 패턴이 있습니다.

를 구현할 때는 취소/재생 명령을 사용하여 패턴을 방지할 수 있습니 많은 양의 중복되는 코드에 의해 추상화(정도)가 수행하는 작업에 데이터를 활용 작업에 취소/다시 시스템입니다.예를 들어 텍스트 편집기에서 잘라내어 붙여 넣은 보완적인 명령(따로서 관리의 클립보드).다시 말해서,실행 취소 작업에 대해 잘 붙여넣기 및 실행 취소 작업을 넣고 절단한다.이 적용하는 훨씬 더 간단한 작업으로 입력하고 삭제하는 텍스트입니다.

여기에 키를 사용할 수 있/취소 시스템으로의 기본 명령은 시스템에 대한 편집기입니다.를 쓰는 대신에,시스템과 같은"만들기 취소체,수정하고 문서"당신은 할 수 있습니다"만들 취소체,실행을 다시 실행에 대한 작업을 취소 개체 문서를 수정하".

지금 보면,많은 사람들이 생각하는 자신을"잘 이런지 부분의 포인트는 명령의 패턴을 가지고 있는가?" 그렇지만,나는 본 적이 너무 많은 명령한 시스템은 두 가지 명령 집합,한를 위한 즉각적인 작업과 다른 설정/취소.나는지는 말이 있지 않는 명령에 특정한 즉각적인 운영 및/취소,하지만 감소 복제 만들 것입니다드 더욱 유지 가능합니다.

할 수 있습을 참조하 Paint.NET 코드 을 위해 자신의 취소-그들은 정말 좋은 취소 시스템입니다.그것은 아마도 조금보다 더 간단하게 당신이 필요하지만,그것은 당신을 줄 수 있는 몇 가지 아이디어이고 지침이 있습니다.

-Adam

이 될 수 있는 경우 CSLA 할 권한을 가지고 있습니다.그것을 제공하도록 설계되었습니다 복잡한 취소를 지원하는 객체에서 윈도우 Forms 응용 프로그램입니다.

구현했는 복잡한 취소 시스템의 성공적으로 사용하는 기념 패턴 매우 쉽고,혜택의 자연적으로 제공하는 다시 실행 framework too.더 미묘한 혜택은 집계하는 작업이 포함될 수 있는 하나의 취소 too.

간단히 말해서,당신은 두 가지 스택의 유품 개체입니다.하나 취소,다른 위해 다시 수행합니다.모든 작업을 만듭니다 새로운 기념품,선택할 수 있을 것입니다 일부 전화 상태를 변경하려면의 모형,문서(또는 어떤).이에 추가하는 취소 스택입니다.을 할 때에는 취소 작업 외에도,실행 실행 취소 작업에 기념 객체 모델을 변경 다시 다시,당신은 또한 팝업체 off 스택을 취소하고 밀어 오른쪽에 다시 실행 스택입니다.

방법을 변경하는 국가의 문서가 구현 따라 달라집에서 완전히 구현한다.할 수 있는 경우 단순히 API 를 통화(예:ChangeColour(r,g,b)),그 앞에는 쿼리를 저장합니다 해당하는 상태입니다.하지만 본 것입니다 또한 지원을 복사본을 만들어,메모리 스냅샷,임시 파일을 창조 등-그것의 모든 당신을 그것은 단순히 가상 방법을 구현합니다.

을 집계 작업(예:사용자 이동 선택의 로드하는 개체는 작업에 같은 삭제,이름 변경 특성)을 작성하는 코드는 새로운 스택을 실행 취소를 하나의 기념물,그리고 전달하는 실제 작업을 추가하는 개별 작업을니다.그래서 당신의 작업 방법이 필요하지 않은(a)글로벌 스택에 대해 걱정하며(b)코딩될 수 있습니다 같은지 그들은 실행에서 격리의 일부로 또는 하나의 집계 작업입니다.

많은 취소 시스템에서 메모리,하지만 당신은 수 있습 유지 스택을 실행 취소를 하고자 하는 경우에,나는 생각한다.

되어에 대해 읽기 명령 패턴에 민첩한 책 개발-어쩌면 그가 잠?

할 수 있는 모든 명령을 구현하는 명령어 인터페이스(는 Execute()메서드를 사용하여).하려면 실행 취소를 추가할 수 있습 취소 방법입니다.

더 많은 정보

Mendelt Siebenga 사실에 사용해야 하는 명령은 패턴이다.패턴을 사용되었다 기념 패턴할 수 있는 것이 매우 낭비이다.

이후에서 작업하는 메모리를 많이 사용하는 응용 프로그램,당신이 할 수 있어야한 지정 중 하나 얼마나 많은 메모리를 실행 취소 엔진은 허용되고,얼마나 많은 수준의 취소는 저장하거나 저장하는 것이 유지됩니다.해야 당신이 이렇게하지 않을,당신은 곧 당신이 직면 오류로 인한 기계의 메모리입니다.

용할 수 있는지 여부를 확인하는 프레임워크를 이미 만들어진 모델에 대한 실행 취소에서 프로그래밍 언어/의 프레임워크는 당신의 선택입니다.그것은 좋은 발명하는 새로운 물건이지만,그것의 더 나은 뭔가를 취할 이미 작성,디버깅 및 테스트 실시 시나리오.그것은 도움이 될 경우 추가 쓰고 있는 이에,그래서 사람들을 추천할 수 있는 프레임워크는 그들은 알고있다.

Codeplex 프로젝트:

그것은 간단한 프레임워크를 추가/취소 기능을 응용 프로그램을 기반으로,고전 명령어 디자인 패턴입니다.그것을 지원합 병합하는 작업을 중첩된 거래 지연된 실행(실행에서 최고 수준의 트랜잭션 적용)그리고 가능한 비선형 역사 취소(할 수 있는 선택의 여러 작업을 다시 실행).

대부분의 예로는 내가 읽은 그것을 사용하여 명령하거나 기념 패턴이다.하지만 그것을 할 수 있는 없는 디자인 패턴을 너무 간단한 야 하는 구조.

영리를 처리하는 방법을 취소하는 것이 귀하의 소프트웨어에 적합한 다중 사용자 협업을 구현하는 변환 운영 데이터 구조입니다.

이 개념은 매우 인기가 있지만,잘 정의하고 유용합니다.면 정의를 보이는 너무 추상 당신 이 프로젝트 성공적인 방법의 예는 운영상의 변화에 대한 JSON 체를 정의하고 구현에서 Javascript

참고를 위해,여기에 간단한 구현의 명령에 대한 패턴/취소에서는 C#: 간단한 취소/재시스템 C#.

우리는 다시 사용하는 파일과 코드의 직렬화를 위한"개"편리한 형태로 저장 및 복원 전체 상태의 개체입니다.우리는 그들을 직렬화 개체에 취소 스택에 관한 정보와 함께 어떤 작업을 수행했고 힌트에는 취소 ing 는 작업이 없는 경우에는 충분한 정보로부터 수집 된 데이터를 직렬화.취소하고 다시는 종종 다만 교체하는 개체는 또 다른 이론().

많은 많은 버그로 인해 포인터(C++)는 개체에 적이 없었다는 고정까지 수행할 때 어떤 이상한 취소 다시 실행 시퀀스(그 장소를 업데이트되지 않을 더 안전한 취소식"id").버그에서 이 영역에 종종...음...흥미롭습니다.

일부 작업할 수 있는 특별한 경우 속도/리소스 사용과 같은 크기는 것,이동하는 것이다.

다중 선택 제공하는 몇 가지 흥미로운 합병증뿐만 아니라.는 인터넷 이용이 가능 우리는 이미 그룹의 개념에서의 코드입니다.Kristopher 존슨 의견에 대한 하위 항목은 아주 가까이 있습니다.

가 이렇게 쓸 때 찾기위한 페그-점프 퍼즐 게임입니다.나는 각 이동 명령 객체는 개최되는 충분한 정보를 수 있다는 것 중 하나가 될 수행하거나 취소할 수 있습니다.나의 케이스에서 이었으로 간단을 저장하는 위치를 시작하고 서로의 방향으로 이동합니다.나는 다음 저장된 이러한 모든 개체 스택에서 프로그램을 쉽게소로 많은 움직임으로 필요하면서 되돌아.

당신이 시도할 수 있는 준비의 구현 취소/재 패턴에 PostSharp. https://www.postsharp.net/model/undo-redo

그것은 당신이 추가/취소 기능을 하지 않고 응용 프로그램을 구현하는 패턴 자신입니다.사용 가능한 패턴의 변화를 추적하는 모델에서 그리고 작동 INotifyPropertyChanged 패턴은 또한 구현에서 PostSharp.

와 함께 제공됩니다 UI 컨트롤 및 결정할 수 있습니다 무엇의 이름과 세부기 각각의 작업이 될 것입니다.

저는 한 번에 근무하는 응용 프로그램에는 모든 변경 사항에 의해 만들어진 명령은 응용 프로그램의 모델(i.e따라...우리가 사용하여 MFC)었 유지 끝에서의 명령에 의해 필드 업데이트 내부 데이터베이스에서는 안됩니다.그래서 우리가하지 않았을 쓰는 별도의 취소/재 코드에 대한 각각의 작업입니다.실행 취소 스택은 단순히 기억하고 기본 키,필드 이름과 오래된 값을 모든 시간은 기록이 변경되었습니다(각각의 끝에서 명령).

첫 번째 섹션의 디자인 패턴(GoF,1994)는 사용 사례를 구현하는 취소/재으로 디자인 패턴입니다.

할 수 있는 초기 생각이 확대됨.

지속적인 데이터 구조, 고,스틱을 유지 의 목록을 참조하여 구 주변.(그러나 저만이 정말로 작동하면 작업에 모든 데이터의 상태는 변경할 수 없고,모든 작업은 그것에 새로운 버전---그러나 새로운 버전을 필요가 없는 깊은 복사,그냥 바꾸기 변경된 부분을'cow'.)

내가 찾는 명령 패턴 매우 이러한 경우에 유용합니다.을 구현하는 대신 여러 가지 역 명령을 사용하고 rollback 지연 실행에 두 번째 인스턴스의 API 를 사용합니다.

이 방법인하려면 낮은 구현 노력과 쉬운 유지 보수성(을 감당할 수 있는 추가 메모리에 대한 2 인스턴스).

여기에 참조에 대한 예를 들어:https://github.com/thilo20/Undo/

내가 알지 못하는 경우 이의를 사용하여 당신은,하지만 했을 때 비슷한 일을 하나의 프로젝트는 다운로드 UndoEngine 서 http://www.undomadeeasy.com 훌륭한 엔진 및 내가 정말 걱정하지 않은 너무 많은 것에 대해 보닛 아래에-그것은 단지 일했다.

제 생각에는 취소/재을 구현할 수 있습에서 2 가지 방법으로 광범위하게.1.명령을 수준(라는 명령을 수준의/취소) 2.문서 레벨(이라는 세계/취소)

명령을 수준:으로 많은 대답을 지적한,이를 효율적으로 사용하여 달성 기념 패턴이다.는 경우는 명령을 지원한 분개,행동시 쉽게 지원합니다.

제한:한 번의 범위는 명령은이,취소/재생이 불가능에 이르게 문서 레벨(global)/취소

나의 케이스에 맞는 글로벌 취소/재생 이후에 적합한 모델을 포함하는 많은 메모리를 적게 사용합니다.또한,이에 적합한 선택적으로 취소/을 다시 실행한다.두 가지 기본 형식

  1. 모든 메모리/취소
  2. 개체 수준을 취소 Redo

에서"모든 메모리/취소"전체 메모리로 처리되는 연결된 데이터로(나무 또는 목록 또는 그래프)및 메모리에 의해 관리되는 응용 프로그램이 아닌 OS.그래서 새 및 삭제 연산자는 경우에는 C++에서는 오버로드를 포함한 더 구체적 구조를 효과적으로 구현하는 작업과 같은.면 모든 노드가 수정,b.을 들고 및 데이터를 삭제 etc., 방법 그 기능은 기본적으로 전체를 복사 메모리(가정하는 메모리 할당은 이미 최적화된 응용 프로그램에 의해 관리되 고급 알고리즘을 사용하여)고에 저장할 스택입니다.는 경우 이 메모리의 복사본을 요청하는 나무 구조가 복사에 기초가 필요 얕은 깊은 복사합니다.깊은 복사를 위해 만들어졌는 변수는 수정합니다.이후로 모든 변수를 할당하여 사용자 정의 할당,응용 프로그램은 마지막 말을 할 때 그것을 삭제 할 필요가있는 경우.는 것은 매우 흥미로운 경우에 우리는 파티션/취소될 때 그것은 그래서 일어나는 우리가 해야 프로그래밍-선택적으로 취소/재정 작업입니다.이 경우에만 새로운 변수를,또는 삭제된 변수거나 수정한 변수가 주어 플래그 그래서는 취소/재생에만 취소/그 메모리를 다시 수행 일들이 더욱 재미 있다면 우리가 해야 할 부분 취소/재 내부 개체입니다.을 때 이러한 경우는,최신의 아이디어는"방문자"패턴이 사용됩니다.그것은"개체 수준의 취소/재"

  1. 개체 수준의/취소:면 알림을 취소/재생이라는 매체를 구현하는 스트리밍 동작 상기 식에서,트리머에게서 얻는 개체 오래된 데이터/새로운 데이터는 프로그램입니다.데이터 교란하지 않은 왼쪽에 방해받지 않습니다.모든 객체를 가져옵 트리머로 인수하고 내부에는 취소/을 다시 호출 스트림/unstreams 데이터의 개체입니다.

모두 1 및 2 있을 수 있었 같은 방법 1.BeforeUndo() 2.AfterUndo() 3.BeforeRedo() 4.AfterRedo().이러한 방법을 수 있는 기본적인/취소 명령(지 않은 상황에 맞는 명령)에서는 모든 객체를 구현하는 이 방법이 너무 특정 작업입니다.

는 좋은 전략이를 만들어 하이브리드의 1 및 2.아름다움은 이 방법(1&2)자신을 사용하여 명령 패턴

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