.문서 초기화

파일 저장 기능이 작성되기 전에는 프로그램과 문서의 생명 주기가 일치한다. 프로그램을 한번 실행하면 종료할 때까지 처음 만들었던 문서만 가지고 놀아야 하는 것이다. 그래서 문서를 초기화하는 코드가 캔버스의 OnCreate 있고 해제 코드는 캔버스가 파괴될 때는 OnDestory 있었다. 그러나 파일 입출력 기능이 들어가면 실행 중간에도 파일을 새로 만들 있고 만들던 문서를 저장하거나 디스크의 파일을 불러 수도 있다. 그래서 캔버스를 초기화/해제하는 작업과 문서를 초기화/해제하는 작업의 시점이 분리된다. 문서와 관련된 초기화와 해제만 하는 별도의 함수를 다음과 같이 작성한다.

 

void InitDoc()

{

   arSize=100;

   arNum=0;

   arGrowBy=50;

   arObj=(DObject **)malloc(sizeof(DObject *)*arSize);

   NowSel=-1;

   ChangeCaption("이름없음");

   bModified=FALSE;

}

 

void FreeDoc()

{

   int idx;

 

   for (idx=0;idx<arNum;idx++) {

      if (arObj[idx]->Type >= DT_TEXT && arObj[idx]->Type <= DT_META) {

          free(arObj[idx]->Text);

      }

      free(arObj[idx]);

   }

   free(arObj);

}

 

캔버스에서 처리하던 문서 초기화 작업은 InitDoc으로 이동되는데 문서의 주요 자료 구조인 arObj 초기화하고 선택 상태와 문서 이름, 변경 여부 등도 초기화된다. FreeDoc에는 문서 편집에 사용하던 배열을 해제하는 코드가 작성되어 있다. 캔버스의 OnCreate, OnDestroy에서는 문서와 관련된 초기화/해제 코드를 삭제하고 대신 함수들을 호출한다.

 

LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   InitDoc();

   return 0;

}

 

LRESULT OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   FreeDoc();

   return 0;

}

 

OnCreate, OnDestroy 남은 코드는 문서와는 상관없는 캔버스 자신의 초기화/해제 코드 뿐이다. 여기까지 코드를 작성하면 실행 결과는 일단 동일하다. OnCreate 일부 코드를 InitDoc으로 나누어 주되 OnCreate 끝에서 함수를 호출하기 때문이다. 그러나 문서 초기화 부분만 별도의 함수로 분리했으므로 문서를 새로 만들 필요가 있을 때는 InitDoc 호출하면 된다.

어떤 함수가 수행하던 작업의 일부분만 따로 호출해야 경우가 있다면 위의 예처럼 필요한 부분을 별도의 함수로 분리하면 된다. 애초의 함수는 분리된 함수를 호출함으로써 원래 하던 일을 변함없이 계속 수행할 있고 프로그램의 다른 곳에서도 분리된 함수를 호출하여 원하는 작업만 수행할 있다. 프로그램을 확장하는 작업은 이런 식으로 함수를 계속 분리해 나가는 과정의 연속이다.