반응형
리펙토링에 대한 예기를 꺼내는데 먼저 Clear case같은 형상관리 툴에 대한 예기를 먼저 꺼내게 되었는데, 
S/W관리 및 유지보수를 위해 매우 중요한 일이기 때문이다, 더군다나 refactoring 시에도 매우 중요하게 적용되는 사항이기 때문에 먼저 예기하고자 한다.



[형상관리툴의 check-in]

형상관리시에 check in의 범위에 대해 다음과 같은 scope 에서 처리되어야 한다.

1 각각의 버젼은 단위 작업 내용이어야 한다.
    - 이전 코드와 이후 코드를 비교할때, 단위 작업이 아니라 이것 저것 수정한 경우에는 코드 비교시 많은 시간이 소비된다.
    - 2008.7.3일 퇴근 버젼!! <- 이런건 정말 난해한 버젼이 된다.
    - bug fix: ... 수정한 사항.   - refactoring: 코드 뭐 수정.... 이런식으로 버젼이 표시되어야 한다.

    이렇게 진행하는 이유는 코드 수정의 목적이 명확하고 ,수정 내역이 정확하여야 각 노드별 비교 분석이 가능해 지기 때문이다.
    우리가 흔히 하는 실수는 채크인 하는 목적과 실제 체크인 되는 내용이 다를때가 있다.
    코드 채크인 하는 이유는 bug fix인데,   실제 체크인 된내용은 맘에 안들던 함수 이름도 바뀌고, 변수도 수정하고, 다른 버그도 수정된 사항이 포함된다.
    그래서 형상관리상에 어떤 버그가 수정되었는지에 대한 기록이 없게 된다.

그러면 Refactoring 시 형상관리툴의 check-in은 왜 중요한 사항일까?
답은 간단하다.
Refactoring의 목적을 이해하면 왜 중요한 사항인지 파악하기가 쉽다.
Refactoring의 목적은 원래의 기능을 유지하면서 code를 여러가지 목적으로 수정하는 것을 의미한다.
        - 기존의 코드를 읽기 쉽도록( Readablity) 하여,
        - 유지 보수성(maintainability)을 높이는 것을 의미한다.
즉, 기존의 버그 수정이나 구조적 개선이 목적이 아니라 , 현제의 구조 및 기능에서 코드의 개선을 의미하는 것이다.
따라서, 이전 버전과 현재 수정된 버젼에서 무엇이 바뀌었는가? 이 코드 변경으로 인해 기능상의 변화가 있는가 등을 검토해보기 위해서는
이전 코드와 현재 코드를 비교하는 것은 꼭 필요하다.
이때문에 위와 같은 형상관리 툴의 check - in 정책은 꼭 필요한것이다.
또, 단순히 Refactoring을 위한 것 뿐만아니라 버그수정시에도 이와 같은 법칙은 적용된다고 봐야 한다.



[Refactoring]

목적
1.원래의 기능을 유지
2.이해하기 쉽고 수정하기 쉽도록 수정하는 것

리팩토링중 흔히 하는 실수중에 가장 조심해야 할것은,
   리팩토링 중에는 code 개선 작업만 해야하지 리팩토링중 발견된 버그를 수정해서는 안된다.
   *** 버그 수정으로 인한 코드 수정이 리팩토링이 올바르게 되었는지를 판단할수 없게 만들수도 있다.
          때로는 버그 수정으로 이로인해 비정상 동작이 나올수도 있는데, 이것이 리팩토링때문에 발생된 결과인지 
          버그 수정때문에 발생된 결과인지 판단하기 불분명해 지기 때문이다.
   리팩토링시 발견된 버그는 리팩토링 후에 따로 bug 리포팅후 fix 하는 시간을 따로 가져야 한다.
        

테스트 자동화 구현
원래 기능이 유지되는지 수정시 꼭 테스트 해야한다.
이를 위해 매번 수동 테스트를 하는 것보다 테스트 자동화를 구현하는 것이 편리하다.
기능 자동화 테스트가 없다고 한다면 Refactoring 결과를 매번 수동으로 확인해야 하고, 또 이러다보면 반드시 결과를 확인하지 않는 상황도 만들어지게 된다.



함수이름 변경
상당히 많은 내용을 내포하고 있다.

1.의미 있는 함수 이름으로 변경



2. OnceAndOnlyOnce
   : 함수 하나는 한가지 일만 하도록 작성 되어야 한다.
    동사 하나와 목적어 하나로 요약 할수 없다면.... 

    바람직하지 않은 구조--> 리팩토링 필요.

 바람직한 함수이름은   - 동사 하나 + 목적어 하나
 잘못된 이름의 예 ) MeasureRectAndDrawBorder....    -> MeasureRect 와 DrawBorder 를 나눌 필요가 있다.

The philosophy that information on how a piece of software operates - be it an algorithm, a set of constants, human-readable documentation, or something else - should exist in only one place. The practice of this is not always easy; in most languages (CommonLisp advocates claim that practicing OAOO is significantly easier for them), there are many types of situations where there is no obvious way to follow OnceAndOnlyOnce, or where following it requires more effort than simple duplication. The essence of it, however, is: Write everything once and only once - locate and fold together any duplication you find while adding the current feature. 

3. 함수이름이 적절하다면, 개발자입장에서는 그 함수에 대해 따로 문서가 필요 없다.
(문서화가 필요없다는 예기가 아니라, 개발자 입장에서 문서없이도 개발할 수 있을만한 함수라는 것이다. )

공유 자료구조에 대한 접근
전역변수, 공유자료에 대한 직접 접근을 피해야 한다.
 - 코드 중복 발생
 - 기타 예기치 못한 많은 문제들을 발생.
 - 절대 피해야함.
** standard lib에서 제공되는 기능이라면 이를 사용하라!!!
   이미 standard lib에서 테스트와 옵티마이즈가 끝난 함수들이기 때문에 믿을 수 있다.

전역변수->지역변수
 변수의 life cycle이 짧으면 짧을 수록 버그의 발생 요인을 줄일 수 있다.
 global>static>파일>함수>블럭 순으로 버그를 발생시킬 영역이 줄어든다.


expression 추출

반복된 문장 패턴이나 반복되는 expression 을 추출 대상으로 놓는다.

대표적인 예로, 영역 검사 루틴들이다.

if(( x>0&& x<maxw && y>0 && y<maxh) && pszText == NULL) ...
                    :
if(( x>0&& x<maxw && y>0 && y<maxh && winH<= MAX_HEIGHT)) ...
                    :
if(bEnter && ( x>0&& x<maxw && y>0 && y<maxh )) ...


이런식의 코드는 다음과 같이 수정
if( x>0&& x<maxw && y>0 && y<maxh)... -> if( PtInRc(x,y,&rcMax))




2개의 함수를 합칠때
**2개의 함수를 합치려 할때
    2개의 함수에서 공통으로 사용하는 변수는 서로 다른 이름으로 바꾼다.
    1. 사용되어지는 함수(put_stone) 에서 입력 parameter  x,y --> xx,yy 로 변경
    2. 만약 , xx,yy가 변경되지 않고 참조를 위해 읽기만 하는 경우라면 process_key 내에서 제거 가능하다.

Process_key()
{
   : 
  x = 10;
  y = 15;
  if( 어쩌고 저쩌고)
  {
    x = getUserX();
    y = getUserY();
  }
  put_stone(x,y);
}

bool  put_stone(int x,int y)
{
  :
  GameSysSetX(x);
  GameSysSetY(y);
 return 0;
}

    2개의 함수에서 공통으로 사용하는 변수는 서로 다른 이름으로 바꾼다.
    1. 사용되어지는 함수(put_stone) 에서 입력 parameter  x,y --> xx,yy 로 변경


Process_key()
{
   : 
  x = 10;
  y = 15;
  if( 어쩌고 저쩌고)
  {
    x = getUserX();
    y = getUserY();
  }
  put_stone(x,y);
}

bool  put_stone(int xx,int yy)
{
  :
  GameSysSetX(xx);  
  GameSysSetY(yy);
 return 0;
}
    2. 만약 , xx,yy가 변경되지 않고 참조를 위해 읽기만 하는 경우라면 process_key 내에서 제거 가능하다.
Process_key()
{
   : 
  x = 10;
  y = 15;
  if( 어쩌고 저쩌고)
  {
    x = getUserX();
    y = getUserY();
  }
    :
    GameSysSetX(
xx);  
    GameSysSetY(
yy);

}

    3. 알다 시피 xx,yy -> 해당 변수로 바꾸는 작업을 한다.





이와 같이 refactoring 전략은 보면 다들 머리속으로는 알고 있는 내용입니다.
딱 봐도 '당연한거 아냐' 라는 생각이 들 정도이죠.

허나 중요한것은 알고 있냐 가 아니라, 이렇게 하고 있는가 가 중요한것이겠죠.
처음부터 이러한 코딩을 해왔더라면, 따로 리팩토링이란걸 할 필요도 없는거죠.
다시 한번 강조하지만 리펙토링은 기존의 코드를 일기 쉽고 관리하기 편하도록 제 정리하는 작업이라고 
생각해야 합니다.

계층화

계층화는 리펙토링에서 사실 고난이도의 작업인데요. 리펙토링보다는 리스트럭쳐링에 가깝다고 보는 것이 옳습니다.( 리펙토링에도 리스트럭쳐링까지는 아니지만 계층화를 요구하는 경우가 있기 때문에 포함한 내용)

전체로직 계층
- 어플리케이션의 전체 로직의 흐름이 구현된 층
- 먼저 무엇을 하고, 그다음에 무엇을 하고...
-전체 작업의 흐름이 보인다.

단위작업 계층
- 단위 작업을 수행
- 세부 작업이 구현됨

유틸리티 계층
- 범용함수


Platform 화 할때:
  유틸리티 계층은 잘 만들어서 포함시키는 것이 맞고,
  단위작업 계층의 경우는 단번에 Pltform으로 이동은 힘들기 때문에 선행작업이 단위작업별로 잘 정리를 하는 것이 우선이다.
  그 후 단위 작업 계층이 많이 쌓이게 되면 그 후에 플렛폼으로 포함할수 있는 부분들만 포함시킨다.(물론 가공해서 platform에 맞게 정리함)
반응형


Mr.Blog...

일어나기 어려운 아침에 시끄러운 알람 대신 좋아하는 음악이나 사람의 목소리로 깨면 훨씬 좋을 것 같아요. 여러분의 기분 좋은 모닝콜은 어떤 것인가요?
 
사실 드라마나 영화에서 여친이 감미로운 목소리로 아침에 출근시간에 맞춰 모닝콜을 해준다거나.
아침을 알리는 노랫소리가 들리는 알람을 들으면서 일어난다는거...

이런거 실재로는 진짜 짜증납니다.

 

 

발로 차주는거!!!!

 

발로 차서 깜짝 놀래주는게 최고!!!!

짜증 날 겨를도 없이 "놀람"만 남을 뿐~~

 

아주 깔끔한 방법입니다. ~~ 하지만 이것도 자주 반복되면 짜증이~~~..

반응형

The melody, Mika, 휘성

 

사실 더 멜로디 라는 그룹의 음악때문에

집에 있는 스피커도 바꿨지만 정작 출퇴근 할때 이어폰으로 듣는거 외에 집에서는 거의 들을시간이 없어서 아쉬움이 많다.

 

Mika는 회사 후배가 추천해줬는데, 음악에 경쾌함이 묻어나는 것 같아서 좋다.

   Big girl~~ you are beautiful~~~

 

 

휘성 엘범은 내가 가지고 있는 것이 좀 된 엘범인데,

만져주기 - 이노래 좋다... 근데 앞부분에 사회적인 뉴스같은 나레이션은 좀 없었으면 좋겠건만...

         제목도 좀 맘에 안들지만.. (스킨쉽을 연상케 해서.).... 어쩌겠나.. 가수랑 작곡가가 이리 이름을 붙여놨으니.. 내가 뭐라 할 만한

 

이 3 엘범이 나에게 아침을 열어주고 기분을 좋게 만들어 준다.!

 

 

반응형

가끔 회사의 가치는 어떻게 먹여지나.. 하는 생각들을 해봤는데..

 

요즘은 과연 내가 하는 업무가 회사의 가치를 얼마나 상승 시켜주는가를 상상 해본다.

 

정말 내가 밤세워 열씸히 일을 하면 회사의 가치는 내가 밤을 샌 만큼 오르는 것일까?

 

비록 당장은 아니지만, 결과적으로 회사의 가치를 올리는데 일조 한것일까?

 

만약 그렇다면, 나는 우리 회사 주식을 많이 사놓고 , 내가 열씸히 밤새워 일한다면

 

주식을 당연히 오를것이고 그렇게 되면 나의 수익도 그만큼 상승하는것이 아닌가

 

음.....

 

그럼 내일 당장에라도 회사 주식을 사고,, 열씸히 일해서 ^^a 월급보다 더 많은 수익을 챙겨야징~ 풋!!!

 

요런 누가 들으면 발끈할만한 상상들을 해본다.!!!

반응형

오늘에 할일!!!! 쩝..

 

List에 대해서 알아보기..
하도 오래전에 써보고 최근에 써본적이 없는 내용이라 ... 기억이 가물가물해서
다시한번 여기저기 찾아보고 기록해 봐야지!!!.!!

 

요 페이지가 몇일만에 업데이트 될까낭?



-2008/11/17



-진짜로 업뎃이 안되네 ㅎㅎㅎ

- 2009/10/12
 좀 지난 사안이었지만, STL Open source 쪽에서 솔루션을 찾아서 써보기로 결정했다.



반응형



아...

요즘 나에게 떨어지는 개발 업무가 코딩 보다는 생각을 해야 하는 일이 점점 더 많아지는듯해!!

 

어떻게 개발해나가야 할까 Control과 View를 분리 해야지!!

근데 요렇게 요렇게..

 

좋아 분리는 다 했으니 밑에 있는 똘똘이한테 시켜야지..

 

근데.. 요렇게 하는게 앞으로 관리상 편의를 가져다줄까?

 

기존 코드들 이런 구조로 바꿀려면 다 뒤집힐텐데... 흠.. 반발은 없을라나....

 

.... 요런게 내 머리속에서 왔다리 갔다리..

 

점점더 뭔가를 결정내리기 어려워저가지!!!

 

코딩에만 전념하던때가 단순하고 편했던것 같아.~~



개발자 넉두리 같은 일기가 되어버렸네...


-2008/11/24

반응형

요즘 주 업무가 설계 및 리뷰. 그리고 현재 architecture 및 디팩 유형을 분석하여 아키텍쳐를 새로 정립하는 일이 주다.

 

아키텍쳐 라는게 정답이 없다보니, 이렇게 계획하면 다른쪽에 작업량이 많아지고, 너무 많은 부분을 새로 디자인 하면 S/W 전반적으로 흐름이 바뀌게 되고.. 고민거리가 늘어나네..

 

딱 맞아 떨어지는 일이 아니고 더군다나 팀원들의 업무와도 엮겨서 자주 흔들면 그만큼 눈총을 받으니 에휴~~.

 

하지만!!! 즐겁다!! ㅎㅎ... 새로운 영역에 들어선 기분이랄까...

 

코딩에서 아키텍팅으로 ... 더군다나 이전에 설계및 개발을 해봤던 시스템들은 상당히 규모가 작고 내부 개발용 시스템이었지만 지금 진행하는것은 open platform 이다 보니.. 더 두근두근 하다.



2008/12/03

'개발 Note > UI Framework 개발하기' 카테고리의 다른 글

STL : List  (0) 2009.01.04
Coding  (0) 2009.01.04
회사 일? 내 일? 그리고 블로그  (0) 2009.01.04
새로운 시작!!! framework  (0) 2008.12.29
오늘 읽은 "프레임워크 개발의 이해와 시작"  (0) 2008.12.19
반응형

S60 platform architecture

The following figure illustrates the high level of architecture of the S60 platform. The platform is based on Symbian OS but also provides additional features:

Figure 1: S60 platform architecture


As shown in the above figure, S60 platform is based on the Symbian OS, which evolves all the time. As such, S60 platform has different editions. S60 platform has experienced 1st Edition, 2nd Edition, and the latest 3rd Edition. In each of the edition, it also introduces different feature packs, which incorporate some of the advanced features on each release. Symbian OS is based on open standard, which makes the development on Symbian/S60 open for the developers. The Development for the S60 platform is backward compatible although there was a break between the 2nd Edition and the 3rd Edition, which was introduced by the platform security and new compiler used in the platform.

The releases and their respective operating systems are:


  • S60 1st Edition — Symbian OS v6.1.
  • S60 2nd Edition — Symbian OS v7.0s.
    • S60 2nd Edition, Feature Pack 1 — Symbian OS v7.0s.
    • S60 2nd Edition, Feature Pack 2 — Symbian OS v8.0a.
    • S60 2nd Edition, Feature Pack 3 — Symbian OS v8.1a.
  • S60 3rd Edition — Symbian OS v9.1.
    • S60 3rd Edition, Feature Pack 1 — Symbian OS v9.2.
    • S60 3rd Edition, Feature Pack 2 — Symbian OS v9.3.

+ Recent posts