작년 8월부터 시작했던 프로젝트에서 목표했던 것이 있었다.

1. 코드에서 extern으로 선언되는 변수(이하 extern 변수)를 사용하지 않는다.
2. 주석이 필요 없는 코드를 작성한다.

1번은 C 프로그래밍에서 객체지향의 encapsulation을 흉내내 보고자 한 것이었다.
요약하면, 특정 state 변수를 사용할 때에

<AAA000.C>
extern int n4CurrPageNum = 0;

<BBB000.C>
extern int n4CurrPageNum ;

if(n4CurrPageNum ) { ... }

<CCC000.C>
extern int n4CurrPageNum ;

while( n4CurrPageNum == 0 )
{
   n4CurrPageNum = 1;
   ...
}
와 같이 extern 변수로 선언하여, 모든 파일에서 선언만 하면 해당 변수에 읽기/쓰기를 마음대로 하도록 하지 않고,

<AAA001.C>
int n4CurrPageNum  = 0;

extern void setCurrPageNum(int PageNum) {
  n4CurrPageNum = PageNum;
}

extern int getCurrPageNum(void) {
  return n4CurrPageNum;
}

<BBB001.C>
extern int getCurrPageNum(void);

if(getCurrPageNum()) { ... }

<CCC001.C>
extern int getCurrPageNum(void);
extern void setCurrPageNum(int PageNum);

while( getCurrPageNum() == 0 )
{
   setCurrPageNum(1);
   ...
}

와 같이 하려고 한 것이다.
(실제 코드에서는, 헤더 파일을 사용하여 중복 선언을 include로 처리하였지만...)

이와 같은 방법으로 코드를 짜면
읽기 전용 변수를 관리하기가 쉬우며, 디버깅 시에 특정 변수 값의 tracking을 쉽게 할 수 있고,
각각의 C 파일을 모듈(내지는 class)이라고 생각할 때, 모듈간의 인터페이스를 명시적으로 두는 효과를 줌으로써 모듈간의 독립성을 높일 수 있다고 생각하였다.

Local 변수를 어떤 C 파일에 두어야 할 지에 대해서도 약간의 고민이 필요하다.
각각의 C파일을 모듈이라고 하면 변수는 그 모듈의 상태변수(state variable)이라고 할 수 있는데, 어떤 모듈에 해당하는 상태인지를 파악하여야 하기 때문이다.

프로젝트 종료 후, 어느 정도의 extern 변수를 사용하였는지 알아 보기 위하여 코드를 'extern' 으로 검색하여 보았다.
유감스럽게도 8건이나 되었다.

프로젝트 당시를 회상해 보며, extern 변수를 사용한 이유를 생각해 보니
다음과 같은 이유였던 것 같다.

1. 기존의 코드에서 사용하고 있던 부분을 그대로 사용하였다.
: 타 부서에서 동일 프로젝트를 몇 주 일찍 시작하였고 그 부서에서 사용하던 코드를 참고하여 시작하였는데,
그 부서에서 몇몇 변수를 extern으로 선언한 것을 그대로 가져다 쓴 것이었다.

extern 변수를 사용하지 말자고 생각했던 것은 프로젝트가 시작된지 한 달 정도 후였고,
초기에는 기능 구현에만 목을 매었기 때문에
기존의 프로그램을 리팩토링 할 생각을 하지 못하고, extern 변수를 그냥 방치한 채로 프로젝트를 시작하였으며
한 달 정도 진행된 후에 해당 변수의 extern을 제거하려고 하였으나, 개발 일정의 압박 & 귀차니즘(수정해야 할 코드가 상당히 많았다)으로 인하여 내버려 두었다.

2. 개발 일정의 압박
: 회사의 코딩 표준에 따르면, extern을 사용하는 변수는 앞에 'g_' 를 붙여 주어야 한다.
그런데, 찾아낸 extern 변수 중에 다음과 같은 것이 있었다.

extern  unsigned char  l_pOpenFilePathFromCE[CE_MAX_FULL_PATH_LEN+1];

'프로그래밍 심리학' 책에 보면 '개발자가 만든 코드는 당시 상황을 반영한다' 라고 나와 있는데..
이 코드가 반영하는 상황은

'이 변수를 지역변수로 할까 extern 변수로 할까 망설이다가 지역변수로 선언하였는데,
이 변수를 건드려야 할 다른 C 파일이 생겨나 버렸고
개발 일정의 압박 속에서 머리가 스파게티가 되어 버린 상황에서 얘를 함수로 빼지 못하고
그냥 extern으로 선언해 버렸는데...
지금 다시 보니 하나의 C 파일에서만 사용하고 있더라...'

가 되어 버린 것이다 -_-;;

다음 프로젝트에서는 목표를 보다 일찍 잡고,
아무리 개발 일정에 쫓기더라도 코드 refactoring을 게을리 하지 않아서
깔끔하고 보기 쉬운 코드를 만들어 봐야겠다는 생각이 든다.

Trackback Address :: http://dreamjr.org/tt/trackback/97


◀ PREV : [1] : .. [22] : [23] : [24] : [25] : [26] : [27] : [28] : [29] : [30] : .. [96] : NEXT ▶