Deep Copy... 과연 많이 해도 좋을지 모르겠습니다.

오전까지의 구현에서 얕은 복사를 하고 있었기 때문에 Undo, Redo를 해도 

제대로 동작 하지 않았습니다.

그래서 UndoRedoManager가 관리 하는 history에 SymbolManager가 만들어 낸 memento를 

넣을때 SymbolManager가 갖고 있는 멤버변수를 모두 Deep copy해야 한다는 결론이 나왔습니다.

일단, SymbolManager가 갖고 있는 멤버 변수들은 모두 colloection들로 모두 레퍼런스 변수를 

담고 있습니다.

이 레퍼런스 변수는 DSymbol이라는 놈들인데요..(실제로는 DSymbol을 상속받은 것들이겠죠)

 그림에 드려질 도형들입니다.

문제는 이 DSymbol안에 있는 것들도 상당한 양의 레퍼런스 변수를 담고 있어서 Deep Copy를 하면 

시간과 메모리가 많이 들것 같습니다.

문제는 그것만이 아니더군요..

UndoRedoManager가 Undo, Redo 함수를 통해 memento를 리턴할때도 Deep Copy 를 해서 그것을 넘겨주어

야 했습니다.

그렇게 하지 않으면 SymbolManager가 그 값을 변경하면 history의 memento도 갖이 변경이

 되니까요..

두가지 상황에서 많은 Deep copy가 일어 나고 있습니다.

마땅한 다른 해결책이 없어서 그대로 쓰지만 잘 봐야 할 점인 것 같습니다.

일단 오늘은, 특정 도형에 대해서만 Clone(Deep copy를 이용) 을 구현했습니다.

모두 구현 하고 최종 테스트는 내일이 될 것같습니다.

와우~~ 수고 했어!!!ㅋ


신고
by danguria 2009.10.27 21:38
| 1 |

티스토리 툴바