도형 객체를 복사하는 루틴을 "prototype pattern"을 적용하고 있는데,

원래 복사 하는 코드에 비효율적인 부분이 있었습니다.

DFigure라고 하는 추상 클래스는 화살표가 아닌 도형을 나타내는데요..

(단말, 처리, 분기도형 등등이 이에 해당합니다.)

여기에는 이 도형이 화살표로 연결되었을 경우 연결된 도형을 알고 있습니다.

또한, 자신에게 들어오거나, 자신으로 부터 나가는 화살표도 알고 있습니다.(알고 있

다는 표현을 한 이유는 정확하게 composition인지, aggregation인지하는 개념에 아

직 익숙하지 않아서 입니다.)

그런데 복사를 할때 자신 도형에 연결된 도형은 복사 하지 않아야 합니다.

그 이유는 그렇게 하기로 정했기 때문이죠..(다른 비슷한 프로그램들도 그렇게 하더

군요..)

하지만 코드에는 이것 들 마져 모두 복사 하고 있었습니다. 그나마 다행? 인것은 그

렇게 복사된 도형들은 도형 꾸러미에 들어가지 않아서 실제로 보여지지는 않았던 것

입니다. 그래서 제가 이런 현상을 눈치채지 못한 것이구요..

가장 비 효율적인 부분은 Procedure도형이 자신과 연결된 procedure 도형 꾸러미

를 모두 복사 하는 것이었습니다. 이것 역시 화면에 보지 지 않습니다만.. 

만일 원래 procedure코드를 변경하더라고 이것이 반영되지 않을 것이라는 버그를 

안고 있더라구요...

어쨌든 다행이 문제를 파악했고, 그에 대한 해답은 간단하기 때문에 룰루랄라 하면

서 고치고 있습니다^^;
신고
by danguria 2010.01.19 11:11


작년 2학기 디자인 패턴 관련된 수업을 들으면서 

설계에 대한 생각을 많이 하게 되었습니다.

그래서 지금까지도 그와 관련되서 관심이 많고, 또 공부도 해보고 싶은 생각입니다.

하지만 다른 것도 해야 하는 것이 많아서 GOF의 책을 보기에는 부담이 되더라구요.. 그리고 개략적인 

내용은 알고 있어서 시간이 아깝기도 했습니다.

그래서 무심고 얇고 쉽게 읽을 수 있을 것 같아 보여서 선택한 책이 이 책인데요...

굉장히 내용이 괜찮은 것 같습니다.

구체적인 예와  그에 따른 정리가 잘 되어 있어서 쉽게 이해 할 수 있는 것 같네요..

특히, 추상팩토리와 팩토리 패턴의 차이점을 알게 되었는 것이 참 좋았습니다.ㅋ

평소에 둘 간의 차이를 잘 몰랐었는데 이책의 예제가 그 둘의 차이점을 아는데 많은 도움이 되었습니다.



신고
by danguria 2010.01.11 22:04
어제 까지 시험이라서 설계만 하고 어제 저녁 부터 구현을 시작했습니다.

memento 패턴을 이용하여 설계하였고, 

추가로 UndoRedoManager를 두어 여러개의 memento를 관리하도록 했습니다.

구현을 어느정도 마친뒤에 테스트를 해보았습니다.

memento를 저장해야 하는 시점을 아직 확정하지 못해서 일단 심볼들이 캔버스에 생성되는 시점만 

정하고 제대로 동작하는지 디버깅 출력문을 두었습니다.

몇개의 오류를 잡았지만 생각 못한게 있었네요..

바로바로바로 memento에 들어가는 것들이 모두 referrence 타입이라는 것입니다.ㅋ

메멘토를 만들때 저장할 것들이 reference 타입이므로 그대로 대입하면 ( var = imRefType; )

 memento가 저장되는 것이 아니라 포인터만 늘어가게 되는 것이죠...

코드를 짜면서 생각해보았지만 혹시..하면서 일단 복사하지 않고 대입을 해보았는데(속도를 위해서..)

 안되더군요..

일단 학교를 가야 하므로 여기까지 해야 겠습니다.
신고
by danguria 2009.10.27 12:07
UndoRedo를 구현하기 위해서 Memento 패턴을 사용하고 있습니다.

Command패턴과 섞어서 쓰는 것이 맞는지 모르겠지만 일단 Memento만 이용하고 있습니다.

UndoRedo했을때 대상이 되는 상태를 심볼매니저에 있는 멤버변수들로 했습니다.

심볼매니저의 멤버변수에는 현재 캔버스에 그려진 심볼들, 사용자가 선택한 심볼들, 라인을 가질 후보 Figure

이 있습니다.

DSymbolManager가 Originator가 되고,

DMemento가 memento가 됩니다.

reodo undo를 하기 위해서 memento를 많이 갖고 있어야 하므로, 그것을 관리하는 UndoRedoManager를 만
들어 관리하도록 하였습니다.

클라이언트에 해당하는 painter클래스에 DSymbolManager와 UndoRedoManager를 가지고 redo undo를 

수행 하도록 했습니다.

내일 정보보호론 시험이 있는 관계로 설계만 하고 마쳐야 할 것 같습니다.


신고
by danguria 2009.10.25 12:04
| 1 |

티스토리 툴바