Ich habe so etwas wie die folgenden im HeaderDesign-Muster switch-Anweisung
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 { ... };
und wird verwendet als
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;
}
Dies scheint, wie die Art von Situation, Refactoring, die ziemlich häufig sein würde und gut geeignet zum Refactoring. Was wäre der beste Weg, Design-Patterns (oder ein grundlegendes C++ - Sprachen-Feature-Redesign) anzuwenden, um diesen Code umzuformen?
Ich habe gelesen, dass das Befehlsmuster häufig verwendet wird, um Schalteranweisungen zu refaktorieren, aber das scheint nur anwendbar, wenn man zwischen Algorithmen auswählt, um eine Aufgabe zu erledigen. Ist dies ein Ort, wo das Fabrik- oder abstrakte Fabrikmuster anwendbar ist (ich kenne mich auch nicht sehr gut aus)? Doppelter Versand?
Ich habe versucht, so viel belanglosen Kontext wie möglich wegzulassen, aber wenn ich etwas wichtiges verpasste, lass es mich wissen und ich werde es bearbeiten, um es aufzunehmen. Außerdem konnte ich nichts Ähnliches finden, aber wenn das ein Duplikat ist, leite mich einfach zu der entsprechenden SO Frage um.
Besucher Muster ist gut für den Austausch von Schaltern wie diesem. – neoneye
@neoneye: Das Besuchermuster implementiert Double-Dispatch basierend auf den dynamischen Typen von zwei vorhandenen Objekten. In diesem Fall müssen wir bestimmen, welcher Objekttyp erstellt werden soll. –