개발자, 엔지니어, 리더



  관리자(2005-10-19 16:18:08, Hit : 1491, Vote : 428
 모듈의 독립성과 CallBack 함수

객체지향적이며 모듈간의 독립성을 유지하기 위한 필요불가결의 기술이
콜백함수(Callback Function)을 사용하는 것이다.

다른 모듈을 호출하기 위하여 혹은 자신의 함수를 다른 모듈에게 서비스
하기 위해서 직접적으로 함수호출을 하는 방법이 가장 많이 사용되고 있다.

하지만 이 경우, 호출하고 호출당하는 모듈들끼리는 상호의존적으로 된다.

이런 방식은 계층 간의 모듈들 사이에서 좀 더 상위의 계층에 있는 모듈이
하위에 있는 모듈의 동작시에 특정 시점에서 혹은 이벤트 상황에서 상위의
모듈이 알고 싶어하는 경우에 주로 사용된다.

예를 들어서, 상단의 모듈의 어떤 어플리케이션이 있고, 하단의 모듈로써
네트워크 드라이버가 있다고 했을 때, 상단 어플리케이션은 네트워크 단에서의
이벤트(네트워크 연결이 성립되었다던가 아니면 네트워크 연결이 끊겼다든가)에
대해서 알고 싶어한다.
이럴때 세가지 방법이 존재할 수 있다.

첫번째로 서로 약속하는 것이다. 원하는 이벤트가 발생했을 때, 하단 모듈인
네트워크 드라이버가 상단 모듈인 어플리케이션의 어떤 지정된 함수를 호출하는
것이다.
이런 경우는 양 모듈이 tight하게 연결되어 있어서 모듈의 독립성이 거의 없다고
보면 된다.

두번째로는 하단의 모듈이 필요한 콜백함수를 미리 내용이 없는 함수로
만들어 놓는 것이다.
예를 들어서 미리 아래와 같은 함수를 만든다.

void NetworkConnected( void )
{
}

위의 함수들을 모아서 콜백함수로 만들어서 하나의 파일로 모아둔 후에
상단 모듈인 어플리케이션에게 제공하면 어플리케이션 엔지니어가 필요한
콜백함수의 내용을 채우는 것이다.
그리고 하단 모듈에서는 자기가 이미 만들어놓은 함수를 알고
있으므로 상단 모듈에서 사용하든 안 하든 상관하지 않고 무조건 해당 함수를
호출해주면 된다.
이 방법은 상단의 모듈이 하나일 때 의미가 있다.
하단 모듈에 관심있는 상단 모듈이 두 개 이상일 경우에는 해당 함수를
두명의 엔지니어가 서로 합의해서 작성해야 하는 문제점이 있다.

마지막 방법은 콜백함수의 프로토타입을 정의해 놓는 방법이다.
이런 방법은 모듈간의 독립성을 100% 보장하는 방법으로써 상단 모듈이 몇개이든
관계가 없다. 즉 상단모듈은 해당 콜백함수의 프로토타입과 같은 양식으로
함수를 만든 후, 하단 모듈에게 등록시켜 놓으면 하단 모듈에서 필요할 때마다
등록된 모듈 콜백함수를 호출해주는 방식이다.

예를 들어서 하단 모듈은 다음과 같은 콜백함수 프로토타입을 정의한 헤더파일을
만들어 상단 모듈들에게 제공한다.

typedef void (*NETCONN_FN)(void);

void RegisterNetConnFn( NETCONN_FN fn );

하단 모듈로부터 서비스받기를 원하는 상단 모듈에서 해당 콜백함수를 같은
프로토타입으로 구현한 후, 하단 콜백함수에게 등록시켜 주는 것이다.

void NetConnected( void )
{
  ...
}

RegisterNetConnFn( NetConnected );

그러면 하단 모듈에서 필요할 때마다 관심있어하는 상단 모듈의 콜백함수를
호출해주면 된다.

#define MAX_CALLBACK_NUM  5

NETCONN_FN NetConnFn[MAX_CALLBACK_NUM ] = { 0, };

for ( i=0; i<MAX_CALLBACK_NUM ; i++ )
    if ( NetConnFn[i] != 0 )
        (*NetConnFn)();

개발자의 기술이 늘어나면서 첫번째 방식에서 두번째 그리고 세번째 방식으로
진화해간다. 물론 코드의 가독성이 그 반대이다.





공지   한 마디 [6]  관리자  2004/04/23 1315 508
34   고객지원을 하면서 느끼는 기쁨은...  관리자 2007/03/16 1625 507
33   프로젝트 리더로써 기쁨을 맛 보았을때.  관리자 2007/03/16 1621 494
32   이것만 해결하면 될 것 같은 마약  관리자 2006/10/01 1560 486
31   안정적이지 못한 조직에서는  관리자 2006/08/06 1203 473
30   "비굴클럽"을 읽고  관리자 2006/03/03 1102 369
29   혹시 IEToy에서 스마트로그인 기능이 안되면  관리자 2005/12/20 1952 491
28   코칭기법 : 하소연들어주기.  관리자 2005/11/26 1186 428
27   갑 또는 을  관리자 2005/11/26 1159 418
  모듈의 독립성과 CallBack 함수  관리자 2005/10/19 1491 428
25   될때까지~~ 정신  관리자 2005/09/26 1204 458
24   자기 입맛에 꼭 맞는 리더를 기대해서는 안된다.  관리자 2005/09/08 1181 432
23   디버깅할 때 최적화 옵션과 어셈블러코드  관리자 2005/08/24 1223 409
22   소스코드가 나의 제어하에 있다고 느낄 때  관리자 2005/08/17 1273 465
21   팀장의 역할  관리자 2005/07/25 1495 436
20   코딩 중에 드는 개선사항 기록하기  관리자 2005/06/17 1286 428
19   사람 봐가면서 작동하는 보드  관리자 2005/06/08 1229 404
18   05' ETC Korea 전시회에 다녀와서  관리자 2005/05/20 1176 366
17   Embedded Target Board 자동 테스트하기  관리자 2005/05/02 1398 386
16   "조엘 온 소프트웨어"를 읽고  관리자 2005/04/26 1314 303

1 [2]
 

Copyright 1999-2017 Zeroboard / skin by zero