Ho una classe Message
che può contenere più tipi di payload (o talvolta nessun payload), ciascuno derivante da una comune classe Payload
. Tuttavia, questo diventa problematico perché la classe Message
vuole conoscere le sottoclassi Payload
per vari motivi come:
-
Verifica dell'uguaglianza
Message
if (message parts besides the payload are equal) { switch(type) { case Payload::Type::RESPONSE: return *static_cast<ResponsePayload*>(payload.get()) == *static_cast<ResponsePayload*>(o.payload.get()); break; case Payload::Type::SETUP: return *static_cast<SetupPayload*>(payload.get()) == *static_cast<SetupPayload*>(o.payload.get()); break; ... } }
-
Deserializzazione (poiché i metodi di deserializzazione sono statici perché i carichi utili sono immutabili)
switch(type) { case Payload::Type::RESPONSE: load = ResponsePayload::fromJSON(payloadValue); break; case Payload::Type::SETUP: load = SetupPayload::fromJSON(payloadValue); break; ... case Payload::Type::START: case Payload::Type::STOP: case ...: break; // Load stays null default: THROW(Exception, "Error in program logic: we forgot to parse some payload"); }
-
Assicurati che
Payload
sia collegato aMessage
durante la costruzione:switch(type) { case Payload::Type::RESPONSE: case Payload::Type::SETUP: case ...: ENFORCE(IOException, payload != nullptr, "For this message type, a payload is required."); break; case Payload::Type::START: case Payload::Type::STOP: case ...: ENFORCE(IOException, payload == nullptr, "For this message type, the payload should be null"); break; default: THROW(Exception, "Error in program logic: we forgot to handle some payload"); }
I campanelli d'allarme stanno andando nella mia testa - questo viola SOLID come se non ci fosse domani e ovviamente non si adatta bene poiché devo aggiungere case
dichiarazioni ogni volta che aggiungo un nuovo carico utile. C'è un approccio più pulito che potrei prendere?