2012년 01월 17일
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)



