프로그램을 설계할 때는 이벤트와 의미적 행위(메소드)를 분리해야 한다. 또한 이벤트와 이벤트 사이에는 항상 상태가 존재한다. 자세한 내용은 밑에 첨부한 State Machine 그림으로 보겠다.
네모난 박스 3개는 상태를 가리킨다. 패널 내에 private 필드로 선언 후 관리하며 처음 시작(Initial)할 때는 항상 Idle 상태로 시작한다. 때문에 처음에 패널 생성자 내에서 Idle로 초기화를 시켜준다.
public DrawingPanel() {
this.eDrawingState = EDrawingState.eIdle;
}
이전 코드에는 패널 내의 그림 그리는 메소드(의미적 행위)에 상태 변경 코드가 들어있었기 때문에 이벤트와 메소드가 분리되지 않는 문제가 존재했다. 이러한 문제 때문에 이벤트 핸들러 내에만 상태 변경 코드가 들어가게끔 코드를 리팩토링했다. 정리하자면 상태가 바뀌는 경우는 이벤트가 발생했을 때이다!
다시 state machine 그림으로 돌아가보자.
polygon 그리기는 (클릭 → 무브)를 반복하면서 다각형의 점을 추가하다가 더블클릭을 사용하여 그리는 작업을 끝낸다. 첫 꼭짓점을 찍을 때 클릭을 하면 프레스 이벤트도 같이 발생하는 문제가 발생한다. polygon을 그릴 때 원하는 작업은 클릭 이벤트만 해당되기 때문에 [NPShapeSelected] 조건을 if문으로 넣어줘서 올바른 트랜잭션을 관리할 수 있도록 해주어야 한다. LButtonClicked, MouseMoved 이벤트는 NPDrawing 내에서만 발생한다. 더블클릭을 실행시키면 NPDrawing이 종료되고 Idle로 상태 변경을 해준다. (NPDrawing → Idle)
좋은 프로그램을 설계하기 위해서 이벤트와 메소드를 확실하게 분리해야 한다. 또한 이벤트 발생에 따른 상태 관리를 올바르게 처리함으로써, 여러개의 이벤트와 액션으로 구성되어 있는 트랜잭션이 보장될 수 있는 프로그램을 작성할 수 있어야겠다.