ÄÄÆ÷³ÍÆ®ÀÇ ÇöÀç »óÅ¿¡ ´ëÇÑ ´ÙÇü¼ºÀº ÁÖ·ù OO ¾ð¾î¿¡¼ State Pattern ±¸ÇöÇÏ´Â ¹æ¹ýÀÌ ¸¹ÀÌµé ³ª¿Í ÀÖÀ¸´Ï ±×°É ¾²¸é µÉ °Å°í, °¢ ¸Þ¼¼Áö¿¡ ´ëÇÑ Ã³¸® ¹æ¹ýÀÌ ¿©·¯ »óÅ¿¡ °ÉÃÄ Áߺ¹µÉ °Í °°À¸¸é if-then-else ·Î ¹Ù¸£´Â °Ô ³´°Ú°í¿ä.
Á÷·Äȶû ¸Þ¼¼ÁöÀÇ Á¾·ù¿¡ ´ëÇÑ ´ÙÇü¼ºÀÌ ¹®Á¦°Ú´Âµ¥
ȸ»ç¿¡¼´Â ÀÌ·¸°Ô ÇØ°áÇß¾ú½À´Ï´Ù.
(ÄÚµå ¾È º¸°í »õ·Î ÀÛ¼ºÇÏ´Â Áß :p)
SomeHandler.h:
class SomeHandler : public IHandler
{
public:
virtual void OnPacket( const RawPacket* p, int size );
protected:
template< typename P >
void OnPacket( const P& p );
};
{
public:
virtual void OnPacket( const RawPacket* p, int size );
protected:
template< typename P >
void OnPacket( const P& p );
};
SomeHandler.cpp:
// SomeHandler¿¡ ÇØ´çÇÏ´Â ÆÐŶ Çڵ鸵 ¸Ê¿¡ ´ëÇÑ Àü¿ª Á¢±Ù °æ·Î´Ù.
// DEFINE_HANDLER_FUNC¿¡¼ ¸Ê¿¡ µ¥ÀÌÅ͸¦ ä¿ö³Ö°í
// Dispatch¿¡¼ ¸Ê¿¡ ¹ÙÀÌÆ® ½ºÆ®¸²À» ´øÁ®³Ö°Ô µÇ´Âµ¥
// ¶óÀ̺귯¸®ÀÇ »ç¿ëÀÚ°¡ Á÷Á¢ °Çµå¸± ÀÏÀº ¾ø´Ù.
PACKET_HANDLER_MAP( SomeHandler );
void SomeHandler::OnPacket( const RawPacket* p, int size )
{
::Dispatch( this, p, size );
// Dispatch ¾È¿¡¼´Â pÀÇ Ã¹ µÎ ¹ÙÀÌÆ®¸¦ ±îº¸°í ±×°ÍÀ» ±âÁØÀ¸·Î ÆÐŶ Çڵ鸵 ¸ÊÀ» Á¶È¸ÇÑ´Ù.
// ÆÐŶ Çڵ鸵 ¸Ê¿¡´Â °¢ ÆÐŶ ŸÀÔÀ» ¿ªÁ÷·ÄÈÇØ¼ SomeHandler::OnPacket<...>() À¸·Î
// Àü´ÞÇÏ´Â °´Ã¼µéÀÌ ÁÖ··ÁÖ·· ´Þ·Á ÀÖ´Ù.
}
DEFINE_HANDLER_FUNC( SomeHandler, MeatPacket )
void SomeHandler::OnPacket( const MeatPacket& p )
{
// do meat with p
}
DEFINE_HANDLER_FUNC( SomeHandler, SpinPacket )
void SomeHandler::OnPacket( const SpinPacket& p )
{
// do spin with p
}
// DEFINE_HANDLER_FUNC¿¡¼ ¸Ê¿¡ µ¥ÀÌÅ͸¦ ä¿ö³Ö°í
// Dispatch¿¡¼ ¸Ê¿¡ ¹ÙÀÌÆ® ½ºÆ®¸²À» ´øÁ®³Ö°Ô µÇ´Âµ¥
// ¶óÀ̺귯¸®ÀÇ »ç¿ëÀÚ°¡ Á÷Á¢ °Çµå¸± ÀÏÀº ¾ø´Ù.
PACKET_HANDLER_MAP( SomeHandler );
void SomeHandler::OnPacket( const RawPacket* p, int size )
{
::Dispatch( this, p, size );
// Dispatch ¾È¿¡¼´Â pÀÇ Ã¹ µÎ ¹ÙÀÌÆ®¸¦ ±îº¸°í ±×°ÍÀ» ±âÁØÀ¸·Î ÆÐŶ Çڵ鸵 ¸ÊÀ» Á¶È¸ÇÑ´Ù.
// ÆÐŶ Çڵ鸵 ¸Ê¿¡´Â °¢ ÆÐŶ ŸÀÔÀ» ¿ªÁ÷·ÄÈÇØ¼ SomeHandler::OnPacket<...>() À¸·Î
// Àü´ÞÇÏ´Â °´Ã¼µéÀÌ ÁÖ··ÁÖ·· ´Þ·Á ÀÖ´Ù.
}
DEFINE_HANDLER_FUNC( SomeHandler, MeatPacket )
void SomeHandler::OnPacket( const MeatPacket& p )
{
// do meat with p
}
DEFINE_HANDLER_FUNC( SomeHandler, SpinPacket )
void SomeHandler::OnPacket( const SpinPacket& p )
{
// do spin with p
}
GamePackets.h:
BEGIN_PACKET_ENUM()
PACKET_ENUM( Meat )
PACKET_ENUM( Spin )
END_PACKET_ENUM()
PACKET0( Meat );
PACKET2( Spin,
MEMBER( int, right ),
MEMBER( string, round ) );
PACKET_ENUM( Meat )
PACKET_ENUM( Spin )
END_PACKET_ENUM()
PACKET0( Meat );
PACKET2( Spin,
MEMBER( int, right ),
MEMBER( string, round ) );
º¸³»´Â ÂÊ¿¡¼´Â:
user->SendPacket( SpinPacket().Set( 42, "you spin me" ) );
ÀÌ·¯¸é right¿¡ 42°¡ ´ã±â°í round¿¡ "you spin me" °¡ ´ã±ä SpinPacket ±¸Á¶Ã¼°¡ ³×Æ®¿öÅ©¸¦ °ÅÃļ~ ¸ñÀûÁö °´Ã¼¿¡ ÀÖ´Â Çڵ鷯 ÇÔ¼öÀÇ ÀÎÀÚ·Î ³Ñ¾î°©´Ï´Ù.½±ÁÒ?
ÅÛÇø´ ƯÈ, ¸â¹ö ÇÔ¼ö Æ÷ÀÎÅÍ, Àü󸮱⸦ ºý¼¼°Ô µ¿¿øÇؼ ¸¸µé¾ú½À´Ï´Ù. ½ºÆ®¸² ¶óÀ̺귯¸®µµ °°ÀÌ ºÙ¾î ÀÖ°í¿ä.
³»ºÎ ±¸ÇöÀº ÀÌ ºí·Î±×¿¡ ¿©¹éÀÌ ºÎÁ·ÇϹǷΠ»ý·«ÇÕ´Ï´Ù.
¼ÒÀ¯±Çµµ ȸ»ç¿¡ ÀÖ°í :p
Ŭ¶ó-¼¹ö ¸ðµÎ ÀÚ¹Ù ¾µ °Å¸é ÆÐŶ Ŭ·¡½ºµéÀ» implements Serializable ÇÏ°í ÆÐŶ °´Ã¼¸¦ ¹Ù·Î ¹ÙÀÌÆ® ½ºÆ®¸²À¸·Î ½á¹ö¸®¸é µÇÁÒ. ¹Þ´Â ÂÊÀÇ ¼ÒÄÏ ½ºÆ®¸²¿¡¼ °´Ã¼¸¦ ²¨³»¸é ŸÀÔ Á¤º¸°¡ ºÙ¾î ÀÖÀ¸´Ï±î, type À» ¸Þ¼¼Áö¸¶´Ù µû·Î ¼³Á¤Çϱ⺸´Ù´Â, RTTI ½á¼ if-else üÀÎÀ» ¸¸µé¸é µÇ°Ú³×¿ä.~
...ÀÌ·¸°Ô ¾²°í º¸´Ï ¿ÏÀü »ðÁúÇÑ °Í °°ÀݾÆ... ÀÚ¹Ù·Î ÇÏ¸é ¼³¸íµµ ¼¼ ÁÙÀÌ¸é ³¡³ª°í;;
·Î·¹º§ ¶óÀ̺귯¸® ±¸ÃàÇÏ´Â ³ë·ÂÀÌ ÀüÇô µéÁö ¾ÊÀ» µí... ¤Ì¤Ð
±×·¡µµ Ãʱ⿡ ÅõÀÚ¸¦ Àß ÇØ ³õÀ¸´Ï,
MMORPG Çϳª ¸¸µé¸é¼ ÆÐŶÀÌ °è¼Ó Ãß°¡µÇ°Å³ª º¯°æµÇ¾îµµ ÀüÇô ±«·ÓÁö ¾Ê¾Ò½À´Ï´Ù. (ÀÚ¶û)
Áß°£¿¡ »ó¼Ó±¸Á¶¸¦ µû¶ó Çڵ鷯 ¸ÊÀ» ã´Â ±â´ÉÀ̶û, ÆÐŶº°·Î ¶ó¿ìÆÃ ¸ñÀûÁö³ª ÇÊÅ͸µ Ư¡ °°Àº °Íµµ ¼¼úÇÒ ¼ö ÀÖ°Ô Ãß°¡ÇÏ´Â ÇÏ·çÀÌÆ²Â¥¸® ±â´ÉÃß°¡°¡ ¸î ¹ø ÀÖ¾ú³×¿ä.
¿©·¯ºÐÀÇ ÀÏÅÍ¿¡¼´Â ¾î¶² ½ºÅ¸ÀÏ·Î ÆÐŶ Á÷·ÄÈ/Çڵ鸵À» ÇÏ°í °è½Å°¡¿ä +_+)
