no image
UndoRedo를 구현 하고 있습니다3.
Deep Copy... 과연 많이 해도 좋을지 모르겠습니다. 오전까지의 구현에서 얕은 복사를 하고 있었기 때문에 Undo, Redo를 해도 제대로 동작 하지 않았습니다. 그래서 UndoRedoManager가 관리 하는 history에 SymbolManager가 만들어 낸 memento를 넣을때 SymbolManager가 갖고 있는 멤버변수를 모두 Deep copy해야 한다는 결론이 나왔습니다. 일단, SymbolManager가 갖고 있는 멤버 변수들은 모두 colloection들로 모두 레퍼런스 변수를 담고 있습니다. 이 레퍼런스 변수는 DSymbol이라는 놈들인데요..(실제로는 DSymbol을 상속받은 것들이겠죠) 그림에 드려질 도형들입니다. 문제는 이 DSymbol안에 있는 것들도 상당한 양의 레퍼런..
2009.10.27
UndoRedo를 구현 하고 있습니다.2
어제 까지 시험이라서 설계만 하고 어제 저녁 부터 구현을 시작했습니다. memento 패턴을 이용하여 설계하였고, 추가로 UndoRedoManager를 두어 여러개의 memento를 관리하도록 했습니다. 구현을 어느정도 마친뒤에 테스트를 해보았습니다. memento를 저장해야 하는 시점을 아직 확정하지 못해서 일단 심볼들이 캔버스에 생성되는 시점만 정하고 제대로 동작하는지 디버깅 출력문을 두었습니다. 몇개의 오류를 잡았지만 생각 못한게 있었네요.. 바로바로바로 memento에 들어가는 것들이 모두 referrence 타입이라는 것입니다.ㅋ 메멘토를 만들때 저장할 것들이 reference 타입이므로 그대로 대입하면 ( var = imRefType; ) memento가 저장되는 것이 아니라 포인터만 늘어가게..
2009.10.27
no image
UndoRedo를 구현 하고 있습니다.
UndoRedo를 구현하기 위해서 Memento 패턴을 사용하고 있습니다. Command패턴과 섞어서 쓰는 것이 맞는지 모르겠지만 일단 Memento만 이용하고 있습니다. UndoRedo했을때 대상이 되는 상태를 심볼매니저에 있는 멤버변수들로 했습니다. 심볼매니저의 멤버변수에는 현재 캔버스에 그려진 심볼들, 사용자가 선택한 심볼들, 라인을 가질 후보 Figure 이 있습니다. DSymbolManager가 Originator가 되고, DMemento가 memento가 됩니다. reodo undo를 하기 위해서 memento를 많이 갖고 있어야 하므로, 그것을 관리하는 UndoRedoManager를 만 들어 관리하도록 하였습니다. 클라이언트에 해당하는 painter클래스에 DSymbolManager와 Und..
2009.10.25
천방지축 나의 기분
요놈의 천방지축 기분은 좋았다가 나빴다가 합니다. 시험이 다 끝나가면서 이제 다시 해야 할 과제, 숙제를 생각해보니 "왜 미리 할 수 있는걸 안했을까?, 프로젝트를 좀더 신경써서 할껄.." 하는 생각이 듭니다. 이런 생각을 하니 기분이 나빠집니다. 나 스스로에게 화도 납니다. 나에게 혼내는것이 친구에게도 화를 냅니다. 잘 하고 있는 친구에게 똑바로 하라고 충고합니다. 집에와서 차분히 마음을 가라 앉히고 생각하니 부끄럽습니다. 다시 기분이 좋아 집니다. 모든것이 다 잘 풀립니다. 역시 긍정의 힘은 대단 합니다.
2009.10.24
typesafe enumeration 기반의 클래스를 하나 더 만들었습니다.
기존의 타입 안전 열거형 클래스는 각 심볼의 타입을 나타내기 위해서 만들었습니다. 각 심볼의 순서가 필요하지 않기 때문에 클래스에 타입정보만 들어 있었습니다. 이번에 만든 타입 안전 열거형 클래스는 심볼을 클릭하면 리사이즈 박스가 나오는데, 이때 8개의 리사이즈 박스를 나타내야 합니다. (LEFT, RIGHT, UP, DOWN, LEFTUP, LEFTDOWN, RIGHTUP, RIGHTDOWN) 8개의 리사이즈 박스 자체만으로는 순서가 필요없지만, 마우스가 어떤 리사이즈 박스를 클릭했는지 알려면 루프를 돌면서 확인을 해야 하고 그때의 딱 걸릴때의 루프 변수번째가 해당 박스라고 구현 되어 있으므로 순서를 정해 주어야 했습니다. 다음은 기존의 리사이즈 박스에 대한 Named constant을 쓰고 있는 코드..
2009.10.23
[Code Complete2] 소프트웨어 구현에 대한 실무서
학교에서 문제 해결기법 시간에 배우는 책입니다. 사실 앞의 몇장을 읽고는 너무 뜬 구름 잡는 다는 생각을 해서 읽지 않았는데 가면 갈 수록 확~~~ 와닿는 내용이 많아서 너무 좋습니다. 지금 시험기간이라 책의 예제를 보는데 너무 좋습니다. 더 좋은건 번역하신 분이 멤버십 출신이라는 것이 더 자랑 스럽습니다!!
2009.10.21
프로그래밍 언어에도 순위가 있다?
10개국어 배우기 프로젝트를 선언하고 하루가 지났습니다. 무엇을 배워야 할지 감이 안잡혀서 구글링을 하니 TIOBE software에서 (무슨 회사?인지는 잘 모르겠습니다.) 각 언어의 숙련된 프로그래머의 숫자를 가지고 순 순위를 매겼는 것을 보고 20위까지의 언어를 나름 다시 정리 해보았습니다. 참고 자료 : http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html Language OOP Procedural Functional Logical 동적 타입 Java O X C O X PHP O O O C++ O X (Visual)Basic O O C# O X Python O O Perl O O JavaScript O O O O Ruby O O Del..
2009.10.21
[CodeComplete CH15] 조건문 사용하기
1. If 문 - 일반적인 경우에 대한 코드를 먼저 작성한 다음 특별한 경우를 작성한다. - 동치에 대해서 정확하게 이동하도록 한다. - 정상적인 경우를 else가 아니라 if문 다음에 입력한다. 수많은 오류를 아무렇게나 처리하는 비주얼 베이직 예제 OpenFile( inputFile, status ) If (status = Status_Error) Then errorType = FileOpenError Else ReadFile( inputfile, fileData, status ) If( status = Status_Success ) Then SummarizeFileData( fileData, summaryData, status) If( status = Status_Error ) Then errorTy..
2009.10.21
[CodeComplete CH14]직선형 코드 구성하기
1. 순서가 중요한 명령문 명령문의 순서가 중요한 자바 예제 Data = ReadData(); Result = CalculateResultsFromData( date ); PrintResults( results ); 명령문의 순서가 중요하지만 덜 분명한 자바 예제 revenue.ComputeMonthly(); revenue.ComputeQuarterly(); revenue.ComputeAnnual(); 명령문의 순서가 중요한 자바 예제 Data = ReadData(); Result = CalculateResultsFromData( date ); PrintResults( results ); 명령문의 순서 의존성이 감추어져 있는 비주얼 베이직 예제 ComputeMarketingExpense ComputeSa..
2009.10.21