2011-01-06 3 views
2

내 응용 프로그램에서 실행 취소/다시 실행을 지원하는 명령 패턴을 구현하고자합니다. 데이터는 매우 밀접하게 묶여 있기 때문에 실행 취소 할 수있는 객체 중 일부를 수정하면 다운 스트림 결과가 발생합니다. 내 주요 관심사는 어디로 다운 스트림 명령을 실행하는 코드를 넣어야합니다. 예를 들면 : 명령 패턴 실행 취소/다시 실행 : 내 접근 방식에 문제가 있습니까?

class:MoveObjectCommand 
{ 
    private hierarchicalObject:internalObject; 

    public MoveObjectCommand(hierarchicalObject:newObject) 
    { 
     internalObject = newObject; 
    } 

    public Execute() 
    { 
     internalObject.Location = someNewLocation; 

     foreach(hierarchicalObject:child in internalObject.Children) 
     { 
      if(someNewLocation = specialPlace) 
      { 
       var newCommand:MoveObjectCommand = new MoveObjectCommand(child) 

       CommandManager.add(newCommand); 
      } 
     } 

    } 

    public Undo() 
    { 
     internalObject.location = oldLocation; 
    } 
} 

는 지금까지 내가 말할 수있는, 이런 일이 잘 될 일 것입니다,하지만 난 실행 코드의 대부분이 실제로 어디로 가야 주위에 내 머리를 정리하고 수 없습니다. hierarchicalObject에 모든 후속 명령을 추가하는 .changeLocation() 메서드가 있거나 위의 명령 자체에 있어야합니까? 내가 생각할 수있는 유일한 차이점은 위의 예에서 MoveObjectCommand는 후속 프로세스 변경을 위해 호출되어야하지만 다른 방법은 명령을 호출하지 않고도 호출 할 수 있고 같은 방식으로 처리 할 수 ​​있다는 것입니다 (부정적인 결과가 발생할 수 있음). 실행 취소/다시 실행 단계 추적). 나는 이것을 overthinking인가? 어디에서 그걸 왜 넣었습니까? (분명히이 예제는 모든 각도를 다루지는 않지만 커맨드 패턴과 관련된 일반적인 모범 사례는 무엇입니까?).

답변

2

당신은 모델 (hierarchicalObject 내가 추정)에서 changeLocation() 메소드를 가져야 만합니다. 새 위치와 객체를 명령에 저장하면됩니다.

실행 취소/다시 실행을 위해서는 명령 또는 두 개가 필요합니다.

hierarchicalObject와 같은 소리는 http://en.wikipedia.org/wiki/Composite_pattern 일 수 있으므로 4 권의 책에서 매크로 명령을 살펴보십시오. 리뷰 : http://en.wikipedia.org/wiki/Command_pattern.

크리스토퍼 알렉산더 (Christopher Alexander)는 "각 패턴은 우리 환경에서 반복적으로 발생하는 문제를 설명하고 그 문제에 대한 해결책의 핵심을이 방법으로 백만 번 이상 사용할 수있는 방법을 설명합니다 , 두 번이나 똑같이하지 않아도됩니다. "

+0

그래, 나도 조금 생각하고 생각하기 시작했다. 코드가 명령 개체에 있으면 계층 적 개체를 수정할 수 있고 명령 기록을 저장할 수 없다는 것을 의미합니다. – Ocelot20