5. version 0.9


고쳐야 할 것…

1. Table 크기 조정 – 완료
2. ObjectStream 으로 바꾸기 – 완료
3. save 메뉴 구현 – 구현중
4. 시간 계산 에러 수정 – 완료
5. 작업 시간을 “시 분 초”로 보여주기 추가 – 완료
6. Table에 시간 컬럼 계속 생기는 에러 수정 – 완료

4. 화면과 모델 통합에서의 갈등

미쳐 생각하지 못했던 문제들이 슬슬 Clocking을 풀고 있습니다.

1. 저장을 어떤 형태로 할 것인가? 저는 text 파일로 저장 읽어 오기를 구현해 뒀습니다. 하지만 List를 저장하기엔..ObjectStream이 좋을 것 같네요. text로 읽어와서 파싱하는 노가다를 하기 싫어요~ ㅠ.ㅠ… 그렇다면 text 파일로 리포트를 만들어 주는 기능을 나중에 만들고 일단 저장하기와 불러오기는 ObejctStream으로 변경 할까요? 네!
사용자 삽입 이미지
2. 이런 이런 스크롤이 마우스 휠을 움직여도 움직이지 않아요. 마우스 휠로 스크롤을 움직이게 하든지..하니면 ExpendBar를 열거나 닫을 때마다 화면 크기를 딱 맞게 변하게 스크롤이 생기지 않도록 합시다. 방법은? 모르는데요. 으흐흐흐… 그렇다면 알고 나면 고칩니다. 일단 그냥 구현 합시다. 넹~

3. ToDo List 에서는 하나의 작업 만 선택하도록 합시다. 왜요? 여러 작업을 동시에 START 시킬 순 없자나요. 아아.. OK. 뭐 그럽시다. 사실은 코딩하기 귀찮아서 그런거죠? 에이.. 설마..

4. 처음 프로그램을 실행 했을 때를 생각해 봅시다.
4.1. 일단 Current Work에 Work가 없기 때문에 PAUSE 와 END 버튼은 disable 상태여야 합니다.
4.2. ToDo List 역시 아무것도 없기 때문에 START와 DELETE 역시 disable 상태여야 합니다. ADD만 그냥 두면 되겠군요.
4.3. 작업 하나를 입력 합니다. 그럼 START와 DELETE 버튼이 이용 가능해 지겠군요.
4.4. 작업 하나를 선택해서 START 시킵니다. 그럼 PAUSE 와 END 버튼이 이용 가능해 지겠군요. 대신에 START 버튼은 불이 꺼집니다.
4.5. PAUSE 버튼을 클릭하면 PAUSE 버튼의 title이 RESTART 로 바뀝니다. 그리고 START에는 다시 불이 들어옵니다.
4.6. PAUSE 버튼을 클릭한 상태에서 ToDo에서 작업을 선택하고 START를 클릭하면… 음.. 그렇게 되겠군요.
4.7. END 버튼을 클릭하면 PAUSE 버튼은 불이 꺼지고 Completed Work List에 완료된 작업이 추가 됩니다.

3. 작업 분류 2

3.6. 작업 분류별 리스트를 가져옵니다.

    @Test public void workTypeList(){
        Work work1 = new Work(“work1”);
        workList.add(work1);
        assertEquals(work1, workList.getToDoList().get(1));

        work1.start();
        assertEquals(work1, workList.getCurrentWork());
        assertEquals(0, workList.getToDoList().size());

        work1.pause();
        assertEquals(work1, workList.getPausedWorks().get(1));
        assertEquals(null, workList.getCurrentWork());

        work1.end();
        assertEquals(work1, workList.getEndWorks().get(1));
        assertEquals(0, workList.getPausedWorks().size());
    }

Work가 List에 있는 것만 확인하면 되는데 특정 위치를 가리켜서 확인하는 건 그닥 맘에 들지 않습니다. 그래서 contain()을 추가합니다.

    @Test public void workTypeList(){
        Work work1 = new Work(“work1”);
        workList.add(work1);
        assertTrue(workList.getToDoList().contains(work1));

        work1.start();
        assertEquals(work1, workList.getCurrentWork());
        assertEquals(0, workList.getToDoList().size());

        work1.pause();
        assertTrue(workList.getPausedWorks().contains(work1));
        assertEquals(null, workList.getCurrentWork());

        work1.end();
        assertTrue(workList.getEndWorks().contains(work1));
        assertEquals(0, workList.getPausedWorks().size());
    }

3.7. 하나의 작업이 실행 중일 땐 다른 작업을 실행 할 수 없습니다.

이걸 조금 구현 해보니깐..Work에서 WorkList를 가지고 있어야 합니다. 그렇게 되면 굉장히 복잡해지고 커플링이 심해집니다. UI 상에서 이런 시도를 막을 수 있을 것 같습니다. UI를 구현하는 코드가 복잡해지겠지만.. 일단 한번 해본 뒤에 생각해 봐야겠습니다.

3. 작업 분류

3.1. 새로 추가된 작업은 “해야할 작업” 목록에 추가 됩니다.

    @Test public void newWorkType(){
        Work work = new Work(“work1”);
        workList.add(work);
        assertEquals(WorkType.TODO, work.getType());
    }

음.. 화면을 먼저 만들걸.. 하는 생각이 계속 들면서 작업을 방해하기 시작하는데 메모를 해둬야 겠습니다.

– 일시 정지 클릭하고 ToDo List에서 다른 작업의 시작 버튼을 클릭하면 일시 정지 된 작업은 TODO 리스트로 옮겨지고 Current Work에는 방금 선택한 작업이 올라옵니다.

3.2. “작업 시작” 버튼을 클릭한 작업은 “진행 중인 작업” 목록에 추가 됩니다.

    @Test public void startWorkType(){
        Work work = new Work(“work1”);
        workList.add(work);
        work.start();
        assertEquals(WorkType.CURRENT, work.getType());
    }

3.3. “작업 완료” 버튼을 클릭한 작업은 “완료된 작업” 목록에 추가 됩니다.

– “PAUSE” 버튼과 “RESTART” 버튼을 눌렀을 때 상태 변화를 생각 못했었군요. 테스트에 추가해야겠습니다.

그 전에 일단 3.3. 부터 마무리 하구요.

    @Test public void endWorkType(){
        Work work = new Work(“work1”);
        workList.add(work);
        work.start();
        work.end();
        assertEquals(WorkType.END, work.getType());
    }

=> 어라.. 여기까지 하다보니 테스트 코드에 엄청난 중복이 생겼습니다. test 메소드 하나로 위에 있는 세개를 전부 합치겠습니다.

    @Test public void workType(){
        Work work = new Work(“work1”);
        workList.add(work);
        assertEquals(WorkType.TODO, work.getType());
        work.start();
        assertEquals(WorkType.CURRENT, work.getType());
        work.end();
        assertEquals(WorkType.END, work.getType());
    }

그럼 이제 위에 있는 세개는 지워도 되겠군요. 책 읽은게 도움이 됐습니다. 흐흐 쌩큐 Beck!

3.4. 선택한 분류의 작업만 보여주기.

이건 SWT에 있는 EnpendBar로 구현을 했기 때문에.. 코드로 처리하지 않아도 될 것 같습니다.

3.5. “PAUSE” 버튼을 클릭하면 pause 상태로 바꿔줍니다. 위에 있는 테스트 코드를 수정해서 시나리오를 만듭니다.

    @Test public void workType(){
        Work work = new Work(“work1”);
        workList.add(work);
        assertEquals(WorkType.TODO, work.getType());
        work.start();
        assertEquals(WorkType.CURRENT, work.getType());
        work.pause();
        assertEquals(WorkType.PAUSE, work.getType());
        Work work2 = new Work(“work2”);
        workList.add(work2);
        work2.start();
        assertEquals(WorkType.CURRENT, work2.getType());
        work.end();
        assertEquals(WorkType.END, work.getType());
    }

– 하나의 작업이 실행 중일 때 다른 작업을 실행하지 못하게 합니다.

SWT에서 실행 버튼을 disable 하게 해두는 걸로 하면.. 되겠죠? 훔