동적 분기의 구현에 대해서.
글쓴이: shint / 작성시간: 목, 2008/05/22 - 12:54오후
데이터에 따라 if() 조건문을 동적으로 제어 할 수있을까요?
보통
#define PACKET1 10
#define PACKET2 120
#define PACKET3 140
#define PACKET_A 1
#define PACKET_B 2
if(PACKET1 == recv[0])
{
if(PACKET2 == recv[1])
{
if(PACKET_A == recv[2])
{
}
if(PACKET_B == recv[2])
{
}
}
}
보통 이런식으로 구현하는걸로 알고 있습니다.
정의된 PACKET을 데이터(or DB)에서 불러와서 동적인 분기를 하고 싶습니다.
어떻하면 가능할까요?
Forums:
function pointer를
function pointer를 사용해보세요.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
... 좀더 구체적이었으면 좋겠습니다. ㅠ_ㅠ
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
1. 메서드(함수) 추출:
1. 메서드(함수) 추출: if 절 밑의 처리들을 함수들로 만들어 밖으로 뺍니다.
2. 로직 저장: 조건에 따른 수행할 함수들의 리스트를 맵 같은 곳에 저장합니다. key=조건, value=실행할 함수 포인터(들).
사용은 대충 다음과 같은 pseudo code 같이....
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
문자열로 비교한다고 생각한다면 간단하게 이렇게 해 볼 수도 있을 것 같습니다.
처리할 수 있는 방법에는 제한이 있을 것이고 각 경우에 대해 label을 붙입니다.
그리고 DB나 별도의 Table로 packet이 달라지는 영역에 대한 signature와 label에 대한
map을 만듭니다. 그리고 signature 비교후 label 값에 대해 switch문으로 처리합니다.
구현해 보면 다음과 같은 형태가 되겠죠.
(가정을 간단하게 한 겁니다만.. 실제로는 따져야 할 것이 더 많을겁니다.)
데이터에 대한
동적인 조건 분기는 데이터 자체를 비교해야한다는 말이되네요.
한가지 걱정되는건. 저런 데이터 테이블이 크면 클수록. 비교시간이 늘어나서요.
한번에 해당하는 데이터 루틴으로 가게 하기위한 조건으로 동적인 분기를 스크립트로 구현하려고 생각했습니다.
생각보다 어렵네요.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
만약 테이블 비교가 부담된다면 hash의 도입도 한 방법입니다.
1단계에서 hash로 비교 대상의 수를 줄여둔 다음에 작은 테이블에서 최종 비교를 하는 방법도 생각해 볼 수 있습니다. 결론적으로 데이터의 특징을 보고 최적화를 하면 되겠습니다만 현재로서는 데이터에 대한 단서가 전혀 없으므로 일반적인 방법 밖에는 설명할 수가 없군요.
감사합니다.
해시를 사용해도 되겠네요.
해시 생성시에 비용도 만만찮겠어요 ㅋ_ㅋ
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
패킷에서 읽은
패킷에서 읽은 특정한 명령에 반응하는 분기라면, 콜백함수 즉 함수포인터를 사용하는것이 더 효율적일 수 있다에 한표던집니다.
그런식으로 잘 만들어논 코드는 ngIRCd라는 IRC Server에서 참조하실 수 있습니다.
時日也放聲大哭
時日也放聲大哭
댓글 달기