Command based programming

명령 기반 프로그래밍은 내가 주관적으로 지은 이름이며 서버 개발을 하면서 분산된 컨텐츠 코드를 어떻게 합칠까 고민하다가 나온 해결책이다. 서버 프로그래밍은 기본적으로 멀티쓰레딩에 비동기 프로그래밍으로 개발한다.
아래를 보자.

  188 class Player

  189 {

  190     void Pickup(Item* item)

  191     {

  192         AsyncSaveItem(item);

  193     }

  194 

  195     void OnSavePick(Item *item)

  196     {

  197         CompletePickup(item);

  198     }

  199 };


가장 단순한 아이템 집기에도 명령을 받으면 일단 데이터베이스에 저장을 요청하고 응답이 오면 클라이언트에게 아이템 획득했다는 것을 알려주게 된다. 문제는 이러한 코드들이 하나의 클래스에(보통은 Player) 몽땅 다들어가기때문에 어떠한 코드가 같은 컨텐츠 코드인지 구분하기 어렵다는데 있다.


따라서 아래와 같은 방법을 추천한다.


  201 class CommandPickup : public ICommand

  202 {

  203 public:

  204     Time m_commandLife;

  205     Player *m_owner;

  206     Item *m_item;

  207     OdbcClient* access;

  208 

  209     void Entry()

  210     {

  211         access->Execute(L"SAVE", this, &CommandPickup::OnResult);

  212     }

  213 

  214     void OnResult(OdbcEventArg &e)

  215     {

  216         CompletePickup(m_item);

  217     }

  218 };


클라이언트가 무언가를 요청할 때마다 Command 객체가 생성되며 Commnd 에는 소유자와 생성시각등이 기록되어 시스템상에서 관리 된다. 객체 단위로 데이터베이스 처리나 네트워크간의 전송되어 필요한 작업을 하는 방식이다.

Command 객체의 멤버 변수가 계속 남아 있기때문에 임시 작업을 하기 편하고, 컨텐츠 구현코드가 하나의 클래스에 모아져 있기때문에 유지보수에도 도움이 된다.

by 지나가는행인 | 2012/01/17 01:44 | 게임 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶