. 다른 방식의 함수 집합

다음은 똑같은 함수의 집합을 다른 방식으로 작성한 코드이다. ApiEdit는 이 코드를 채용하지 않으므로 관심없으면 보지 않아도 좋지만 이런 식으로도 함수를 작성할 수 있다는 점을 알아 두도록 하자.

 

void CApiEdit::GetParaFromOff(int nPos, int &pr, int &pc)

{

     int r,c;

 

     GetRCFromOff(nPos,r,c);

     r=r-pLine[r].nLine;

 

     pr=pLine[r].nPara;

     pc=nPos-pLine[r].Start;

}

 

int CApiEdit::GetOffFromPara(int pr, int pc)

{

     int tLine;

 

     for (tLine=0;tLine<TotalLine-1;tLine++) {

          if (pLine[tLine].nPara == pr)

              break;

     }

     return pLine[tLine].Start+pc;

}

 

int CApiEdit::GetParaFirstLine(int nPara)

{

     int toff;

     int r,c;

 

     toff=GetOffFromPara(nPara,0);

     GetRCFromOff(toff,r,c);

     return r;

}

 

int CApiEdit::GetParaLastLine(int nPara)

{

     int r;

 

     r=GetParaFirstLine(nPara);

     if (r < TotalLine-1) {

          r++;

     }

     while (pLine[r].nLine != 0) {

          if (r == TotalLine-1)

              return r;

          r++;

     }

     return r-1;

}

 

앞에서 만든 함수 집합과 완전히 동일한 기능을 제공하는 함수 집합이되 이 집합에서는 GetOffFromPara 함수가 기본 기능을 제공하고 나머지 함수들은 이 함수가 구하는 값으로부터 원하는 정보를 얻는다. 즉 어떤 값이든지 일단 오프셋을 구하고 오프셋으로부터 문단이나 줄의 정보를 다시 구하는 방식이다. 상세한 분석은 해보지 않겠지만 코드를 한 번 읽어 보면 이 함수들이 어떤 식으로 정보를 구하는지 어렵지 않게 파악할 수 있을 것이다. 오프셋이라는 다루기 편한 값을 기준으로 하기 때문에 함수의 논리가 대단히 직선적이고 간단하다.

하지만 GetOffFromPara 함수는 순차 검색 방법을 사용하는데 왜냐하면 오프셋과 문단번호 사이에 직접적인 연관이 없기 때문이다. 그래서 코드의 길이는 앞서 작성한 함수 집합보다 훨씬 더 짧지만 성능은 별로 좋지 못하다. 논리의 단순함을 취한 대신 최적화된 속도를 희생했다고 볼 수 있다.

똑같은 기능을 제공하는 두 개의 함수 집합을 작성해보면서 우리는 많은 것을 생각해 볼 수 있다. 완전히 같은 기능을 구현하는데도 접근 방법에 따라 여러 방식이 있다는 것을 알 수 있으며 또한 이미 작성된 코드라도 방식을 바꾸면 훨씬 더 좋은 성능을 낼 수 있다는 점도 배울 수 있다. 사실 나는 두 번째 함수 집합을 먼저 만들어서 한참 동안 사용했었는데 도저히 너무 느려서 쓸 수가 없었다. 그래서 좀 더 효율적인 함수 구조를 생각하다가 첫 번째 함수 집합을 생각해 내었고 그 결과에 만족했다.

여기서 내가 하고 싶은 말은 이미 기능적으로 완벽하다고 생각되는 코드라도 한 번 더 살펴 보면 항상 개선할 점이 남아 있다는 점이다. 어느 누구라도 내 코드는 완벽하다. 여기서 더 이상 개선할 여지가 없다라고 자신있게 말할 수 없다. 만약 이렇게 얘기하는 사람이 있다면 return a+b; 같은 간단한 함수를 만들었거나 아니면 정말로 코딩을 모르는 사람이다. 완벽해보이는 코드라도 확신을 갖기 전에 각도를 조금 바꿔서 관찰해 볼 필요가 있다.

본질적으로 100% 완벽한 코드란 있을 수 없다. 아니 존재할 수는 있겠지만 최적의 코드임을 증명하는 것은 불가능하다. 코드는 문제를 해결하기 위한 명령의 집합인데 이 명령의 원천이란 결국은 사람의 두뇌이며 사람이 생각한 문제 해결 방법을 컴퓨터가 알아듣기 쉽도록 번역해놓은 것이 코드다. 사람이 불완전한데 코드가 어떻게 완벽할 수가 있겠는가? 그래서 개발자는 자신의 코드에 대해 또한 자기 자신에 대해 항상 겸손해야 한다.