У меня есть что-то вроде следующего в заголовке
class MsgBase
{
public:
unsigned int getMsgType() const { return type_; }
...
private:
enum Types { MSG_DERIVED_1, MSG_DERIVED_2, ... MSG_DERIVED_N };
unsigned int type_;
...
};
class MsgDerived1 : public MsgBase { ... };
class MsgDerived2 : public MsgBase { ... };
...
class MsgDerivedN : public MsgBase { ... };
и используется как
MsgBase msgHeader;
// peeks into the input stream to grab the
// base class that has the derived message type
// non-destructively
inputStream.deserializePeek( msgHeader );
unsigned int msgType = msgHeader.getMsgType();
MsgDerived1 msgDerived1;
MsgDerived2 msgDerived2;
...
MsgDerivedN msgDerivedN;
switch( msgType )
{
case MSG_DERIVED_1:
// fills out msgDerived1 from the inputStream
// destructively
inputStream.deserialize( msgDerived1 );
/* do MsgDerived1 processing */
break;
case MSG_DERIVED_2:
inputStream.deserialize( msgDerived2 );
/* do MsgDerived1 processing */
break;
...
case MSG_DERIVED_N:
inputStream.deserialize( msgDerivedN );
/* do MsgDerived1 processing */
break;
}
Это похоже на тип ситуации, который был бы довольно распространенным и хорошо подходит длярефакторинг.Каков наилучший способ применения шаблонов проектирования (или редизайна базовых функций языка C ++) для рефакторинга этого кода?
Я читал, что шаблон Command обычно используется для рефакторинга операторов switch, но это применимо только при выборемежду алгоритмами, чтобы сделать задачу.Это место, где применяется фабричный или абстрактный фабричный шаблон (я тоже не очень знаком с ним)?Двойная рассылка?
Я пытался исключить как можно больше несущественного контекста, но если я пропустил что-то важное, просто дайте мне знать, и я внесу изменения, чтобы включить его.Кроме того, я не смог найти ничего похожего, но если это дубликат, просто перенаправьте меня на соответствующий вопрос SO.