본문 바로가기

프로그래밍/C++

메시지 처리기

요즘의 삽질 #1 글에서의 트랙백입니다.

결국 메시지 처리를 하되 switch~case를 없앨 수 있는 방법을 찾는 거군요. @_@
Ocaml은 안 봐서 모르겠지만..
Ocaml은 어떻게 처리하나요.

저 같은 경우는..
map을 통해서 각각 키와 함수포인터를 연결했지요.
그리고 함수포인터를 찾아가서 실행해주는 함수를 만듭니다.

예를들면 이런겁니다.

struct FuncLine { string key; Func* pFunc; };
typedef map<string, FuncLine> FuncMap;
FuncMap funcMap;

void OnAction(istream& is) {...}
void OnState(istream& is) {...}

void Handler::Initialize()
{
    funcMap.push_back("action", &OnAction);
    funcMap.push_back("state", &OnState);
}

void Handler::Process(istream& is)
{
    string key;
    is >> key;
    FuncMap::iterator it = funcMap.find(key);
    if (it != funcMap.end())
        (*it->second)(is);
    else
        throw Exception();
}

이걸 그냥 쓰면 좀 귀찮으니..
define 떡칠로 아래와 같은 형식이 나오도록 바꿨습니다.

void OnAttackOneTarget(istream& is) {...}
void OnAttackRegion(istream& is) {...}
void OnActionDefend(istream& is) {...}

NODE(ActionAttack)
    LEAF(OneTarget, OnAttackOneTarget)
    LEAF(Region, OnAttackRegion)   
NODE_END

NODE(Action)
    BRANCH(ActionAttack)   
    LEAF(Defend, OnActionDefend)
NODE_END   

이런식으로 말이죠
각각의 define 내용은 지금 당장 구현했던 소스를 구할 수가 없어서
나중에 얻으면 적어두도록 하죠.

어쨋든 저 구문은
  • OnActionDefend()는 Action Defend라는 문자열이 왔을때,
  • OnAttackRegion()은 Action Attack Region이라는 문자열이 왔을때,
  • OnAttackOneTarget()은 Action Attack OneTarget이라는 문자열이 왔을때,
각각 불리게 됩니다.

저야 이걸 콘솔 명령어에 이용하긴 했는데..
이용하기에 따라서 여러 응용이 가능하겠죠.
이걸 짜놓고 혼자서 꽤 흐뭇해했던 기억이..

저렇게 하면 함수 명명에 제약이 있을 수 있기 때문에
또 각각을 namespace로 묶었습니다.
큰 단위는 쪼개서 말이죠.
각각이 헤더파일이라 따로 컴파일은 안 되지만..
나름 직관적인(?) 구조가 나옵니다.

define이 없는 Java에서는 어떤 모습이 나올진 잘 모르겠군요. ㅋ.
어쩃든 흥미있는 주제라
제가 사용했던 방법을 올립니다.

'프로그래밍 > C++' 카테고리의 다른 글

How to initialize a constant class array  (2) 2010.08.18
My C++ Tips  (4) 2009.02.18
STL에 대한 단상  (4) 2008.01.29
C++ 기본 문제 By Choo  (6) 2007.07.26
임시변수의 범위는 어디까지일까요  (2) 2007.07.13