728x90
반응형
데이터를 처리할 때 보통 Switch case문을 사용한다. 하지만 데이터의 종류가 많아지게 되면 case가 수백 개가 넘어가는 경우가 생긴다.
이 경우 함수 포인터를 통해 Swich문을 제거해 줄 수 있다.
- Switch문을 이용해 Packet을 처리하는 방식은 case가 많아질수록 성능이 저하될 수 있음.
- 관리도 어려워지고 가독성도 떨어짐.
- Switch문을 함수 포인터로 관리할 수 있도록 함.
예를 들어, 아래와 같이 Swich case문을 함수 포인터 형태로 바꿔보자.
void Model::ProcessMessage(const int idx, const char* data)
{
switch(idx)
{
case 0:
ProcessA(data);
break;
case 1:
ProcessB(data);
break;
case 2:
ProcessC(data);
break;
case 3:
ProcessD(data);
break;
/* ... */
case 500:
ProcessE(data);
break;
}
}
함수 포인터를 배열로 선언한다. 배열의 인덱스가 case 값이고, 배열에 들어가는 값이 함수의 주소값을 넣어준다.
typedef enum
{
kIndex0= 0,
kIndex1,
kIndex2,
kIndex3,
kIndex4,
/* ... */
kIndexMax = 500
} IndexType;
void (Model::* excute_func_[kIndexMax])(const char *);
Model::Model()
{
excute_func_[kIndex0] = &Model::ProcessA;
excute_func_[kIndex1] = &Model::ProcessB;
excute_func_[kIndex2] = &Model::ProcessC;
excute_func_[kIndex3] = &Model::ProcessD;
/* ... */
excute_func_[kIndex500] = &Model::ProcessE;
}
함수 포인터 배열을 호출해줌으로써 Switch case문을 대체할 수 있다.
void Model::ProcessMessage(const int idx, const char* data)
{
if (excute_func_[idx] != nullptr)
{
(this->*excute_func_[idx])(data);
}
}
728x90
반응형