요즘의 삽질 #1 글에서의 트랙백입니다.
결국 메시지 처리를 하되 switch~case를 없앨 수 있는 방법을 찾는 거군요. @_@
Ocaml은 안 봐서 모르겠지만..
Ocaml은 어떻게 처리하나요.
저 같은 경우는..
map을 통해서 각각 키와 함수포인터를 연결했지요.
그리고 함수포인터를 찾아가서 실행해주는 함수를 만듭니다.
예를들면 이런겁니다.
이걸 그냥 쓰면 좀 귀찮으니..
define 떡칠로 아래와 같은 형식이 나오도록 바꿨습니다.
이런식으로 말이죠
각각의 define 내용은 지금 당장 구현했던 소스를 구할 수가 없어서
나중에 얻으면 적어두도록 하죠.
어쨋든 저 구문은
저야 이걸 콘솔 명령어에 이용하긴 했는데..
이용하기에 따라서 여러 응용이 가능하겠죠.
이걸 짜놓고 혼자서 꽤 흐뭇해했던 기억이..
저렇게 하면 함수 명명에 제약이 있을 수 있기 때문에
또 각각을 namespace로 묶었습니다.
큰 단위는 쪼개서 말이죠.
각각이 헤더파일이라 따로 컴파일은 안 되지만..
나름 직관적인(?) 구조가 나옵니다.
define이 없는 Java에서는 어떤 모습이 나올진 잘 모르겠군요. ㅋ.
어쩃든 흥미있는 주제라
제가 사용했던 방법을 올립니다.
결국 메시지 처리를 하되 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();
}
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
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 |