2010년 1월 28일 목요일

Flash Builder, Flex Builder에서 Task plugin 사용하기

google reader를 켰는데, 아니 이건 무슨 일이야? 얼마전에 적은 주석에 대한 글답변과도 같은 글이 올라와 있는 것이다.

 

내용은 Flex Builder, Flash Builder에서도 TODO, FIXME를 쓸 수 있는 플러그인이 있다는 것.

 

글은 Flex Builder 2 기준으로 쓰여있지만 Flash Builder에서도 된다.

 

1. Flex Builder 2 Task Plugin 1.0.0을 다운받고 압축을 푼다.

2. plugins 디렉토리를 Flash Builder plugins에 덮어씌운다.

3. Test.mxml 은 테스트 파일이니 필요없다.

4. Flash Builder 기준으로 다음을 실행한다.

 

메뉴 -> Window -> Other Views... -> General -> Tasks

2010년 1월 25일 월요일

주석 패턴

iPhone 개발을 위해 Xcode를 사용하던 무렵에는 이런 주석들을 많이 달았다.

 

// TODO:

// FIXME:

// ???:

// !!!:

 

개발툴인 Xcode에서 이렇게 달린 주석들은 따로 관리를 해주기 때문이다. 이클립스에서도 // TODO: 를 지원해주던 것으로 기억한다.

유닛테스트 코드 커버리지 수치 높이기

Coverage 20%에서 80% 올리기는 쉬웠는데 오늘 테스트 추가하고 전체 커버리지 확인하니까 83%다. ㅎ

2010년 1월 24일 일요일

혼자 일하면 준비해야 하는 것

1. FlexPMD

2. Flex Coverage

3. Flex mojos, maven, with hudson.

4. git

5. 연습장

6. -Bemga- 간식

7. 포맷, OS 자동 설치. 백업 & 리스토어 자동화.

 

트리 구조에서

트리 구조에서 고민이 생겼다.

 

 

 

1.

다음과 같은 구조를 만들었다.

(1)

H 밑에 Is,

Is 밑에 J,

J 밑에 Ks,

Ks 밑에 K

 

복수 데이타를 담고있는 콜렉션 층이 없어지면 좋지 않을까 생각했다. 다음처럼 생각했다.

(2)

H 밑에 I,

I 밑에 J,

J 밑에 K

 

그러나 생각해보니 (2) 구조를 사용하면 다음과 같은 상황에서 불편해진다.

(3)

A 밑에 Ks

 

(1)을 사용하면 Ks를 바로 사용하면 된다.

(2)의 경우 어떻게든 하려면 J를 써야하는데 J와 Ks의 의미가 다르다.

(3)의 경우가 생기지 않는다면 (2)가 더 좋을지 의문이 생기긴 하다.

 

 

 

2.

자식의 메소드를 대신 실행하는 헬퍼 메소드가 복잡해 보인다는 생각이 들어 고민을 했는데 이는 위 상황때문에 생기는 문제가 아니다. (2)의 경우라도 헬퍼 메소드를 넣으려면 필요하다.

tree.H
    .addI
    (
        I.createI().setID("1").setName("일")
    )
    .addI
    (
        I.createI().setID("1").setName("일")
    )

 

헬퍼 메소드는 별 것은 아니고 hibernate의 DML-style operations을 참고삼아 만든 것이다. add, get, remove 형태의 콜렉션 메소드들은 데이타를 생성하고 추가할 때 자식 오브젝트를 생성하고 추가를 해야한다. 코드 상에서 생각하면 추가 작업(add method)의 등장이 자식의 생성보다 늦게 나타난다. 복잡한 부모-자식 구조라면 코드를 읽는 시간을 늘린다(고 생각하는데 아닐 수도 있겠지만 나는 그렇다). 그래서 사용한 방법은 마지막으로 넣은 object가 자신을 return 하여 점(.)을 찍고 추가 연산을 가능하게 하는 방법이다. 이렇게 하면 부모가 더 위에 나타나고 자식은 밑에 나타난다. 들여쓰기까지 사용하면 더 구조적으로 보인다. 더러 쓰이는 방법으로 알고있다. 예전에 JAVA nio 쓸때도 이런 메소드들이 많았던 것으로 기억한다.

 

아무튼 이 방법은 어떤 컨텍스트에서 작업을 했느냐가 중요하다. 깊이 있는 자식 object를 다루다가 부모 오브젝트 쪽에서 추가 작업을 하고싶으면 다시 부모로 올라가는 쉬운 방법이 없어 보인다. 그래서 헬퍼 메소드는 트리 구조의 상단에서 편하게 메소드를 호출하는 구조도 있지만, DML-style operations 처럼(이 말을 써도 되는지 아직 잘 모르겠음)메소드 체이닝처럼 데이터를 생성해낼 때 return 타입을 달리 할 수 있어 편리하다.

 

 

 

3.

결론적으로 각 클래스는 자신이 어떤 위치에 속해있는지를 모르게 설계하는 편이 좋을 수 있다는 것.

2010년 1월 19일 화요일

FlexUnit 4 UI 테스트 방법

[Before(async, ui)]
public function setUp():void
{
 myView = new MyView();
 Async.proceedOnEvent(this, myView, FlexEvent.CREATION_COMPLETE);
 UIImpersonator.addChild(myView);
}
 
[After(async, ui)]
public function tearDown():void
{
 UIImpersonator.removeChild(myView);
 myView = null;
}

 

 

 

1. 위의 코드처럼 setUp과, tearDown을 구성한다.

2. UIImpersonator에 테스트 하려는 컴포넌트를 테스트 메소드 실행 전에 붙였다가 끝나고 지우는 구조.

 

 

 

[Test(async, ui, order=1)]
public function testDoWork():void
{
 Async.handleEvent(this,
  myView,
  MyView.WORK,
  onWorked,
  LONG_TIME);

 myView.doWork();
}

private function onWorked(event:Event, passThroughData:Object):void
{
 Assert.assertTrue(myView.isEverythingOkay());
}

 

 

 

3. 이벤트 등을 받아서 Assert 사용.

2010년 1월 15일 금요일

FlexUnit 4 비동기 테스트 방법

FlexUnit 4에서 비동기 테스트 방법

 

[Test(async, description="Async Example")]
public function testTimerLongWay():void
{
 var asyncHandler:Function = Async.asyncHandler(this, handleTimerComplete, 500, null, handleTimeout);
 timer.addEventListener(TimerEvent.TIMER_COMPLETE, asyncHandler, false, 0, true);
 timer.start();  
}

 

protected function handleTimerComplete(event:TimerEvent, passThroughData:Object):void
{

}

 

protected function handleTimeout(passThroughData:Object):void
{

}

 

1. Tag에 async를 준다.
2. Async.asyncHandler를 통해 비동기 핸들러를 만든다.
2.1. this - listener 클래스를 지정한다.
2.2. handleTimerComplete - timer에서 TIMER_COMPLETE 이벤트가 발생했을 때 처리 될 이벤트 핸들러.
2.3. 500 - 대기시간을 넣는다. 이 시간이 초과하면 handleTimerout 이벤트 핸들러가 실행, 테스트는 실패.
2.4. null -  대신 어떤 값을 넣으면 handlerTimerComplete의 두 번째 인자로 넘어온다.
2.5. handleTimeout - 앞서 설명한 것처럼 테스트 타임아웃 시에 호출되는 펑션.
3. timer.addEventListener에서 Async.asyncHandler를 통해 생성한 핸들러를 넣는다.

 

위처럼 하면 된다.

 

위의 예에서 이벤트가 발생하면 handleTimerComplete가 호출되고

 

Assert를 사용하여 테스트를 시작하면 된다.