createColne 매소드를 모든 심볼에 대해서 구현을 완료 했습니다.
concreteSymbol의 clone함수를 구현하려다 보니 부모 클래스의 멤버 변수도 모두 복사해야 다 던데요..
그부분을 각각의 concreteSymbol에 넣으니까 각 클래스에 중복된 코드가 엄청 많아 졌습니다.
부모클래스에 그 코드를 넣으려고 해도 자식클래스가 어떤 타입인지 모르기 때문에 결국 다시
하위 클래스에서 다시 복사해야 할 것 같아서 일단 모두 concreteSymbol에서 모두 복사하도록
하였습니다.
그렇게 하고 모듈 테스트를 위해 여전히 도형의 생성에 대해서만 redo undo 를 체크 했는데 생각하는
것과 다른 결과가 나왔습니다.
undo를 많이 하고 나서 다른 작업을 할때는 redo할것이 없어야 합니다.( 다른 프로그램이 그렇게 하더
군요..ㅋㅋ) 하지만 그렇게 동하지 않았습니다.
정상적으로 동작하지 않을때의 UndoRedoManager의 add함수입니다.
/**
* history의 가장 마지막에 memento를 저장한다.
* @param memento
*/
public void add(DMemento memento){
System.out.println("add memento to manager");
// 만일 삽입할 위치 뒤에 다른 memento가 있다면 삭제 시킨다.
// 현재 위치바로 위에 memento가 없을때까지 history의 현재 위치 다음
// memento를 삭제 한다.
for ( int i =0 ;i < history.size(); ++i){//<---- 문제의 지점
history.remove(i);
}
// 현재 위치를 증가 시키고 거기에 memento를 삽입한다.
history.add(++currentPos, memento);
System.out.println("Debug : after add history size = " + this.history.size());
System.out.println("Debug : after add currentPos = " + this.currentPos);
}
처음에는 어디가 문제인지 모르고 이리 저리 뒤적였지만 문제는 빨간색 부분의 코드였습니다.
저의 생각은 "현재 포지션 다음의 것을 모두 지워라"였지만
실제 동작방식은 그렇게 되지 못했습니다.
history의 자료 구조가 LinkedList이고 이때 remove를 하면 전체 사이즈가 줄어든다는 것을 생각하지
못했습니다.
왜 그런지 알겠죠?( 모르면 ... 저처럼 삽질합니다.ㅋ)
그래서 코드를 다음과 같이 멋지게 수정했습니다.
// 현재 위치바로 위에 memento가 없을때까지 history의 현재 위치 다음
// memento를 삭제 한다.
// 와우~~ 멋집니다~~
// memento를 삭제 한다.
// 와우~~ 멋집니다~~
while(currentPos + 1 < history.size()){
history.remove(currentPos + 1);
}
이제 남은 것은 history에 언제 넣어 줄것인가 입니다.
painter코드가 좀 지저분한데.... 즉 심볼이 바뀌는 것을 모조리 찾아서 쌍으로 넣어주려고 하니까.. 코
드가 지저분해 질 것 같습니다... 일단 좀 생각해봐야 겠습니다.