Supponiamo di avere la seguente classe C ++:
class MyFastMessageEncoder
{
public:
MyFastMessageEncoder() :
m_fieldEncoder(ENCODING_STYLE_DEFAULT)
{
}
void set_encoding_style(const EncodingStyle encodingStyle)
{
m_fieldEncoder.set_encoding_style(encodingStyle);
}
EncodingStyle get_encoding_style() const
{
return m_fieldEncoder.get_encoding_style();
}
void encode(const UnencodedFieldList &unencodedFieldList, Message &message
{
for (UnencodedFieldList::const_iterator it = unencodedFieldList.begin(), end = unencodedFieldList.end(); it != end; ++it)
{
m_fieldEncoder.set_raw_data(*it);
message.add_field(m_fieldEncoder.encode());
}
}
private:
FieldEncoder m_fieldEncoder;
};
La classe MyFastMessageEncoder
deve essere estremamente efficiente (la codifica verrà eseguita su decine di migliaia di messaggi al secondo), il tempo necessario per creare un'istanza dell'oggetto FieldEncoder
è un costo non trascurabile, quindi per risolvere il problema problema, ho definito l'oggetto FieldEncoder
come membro della classe e l'ho inizializzato all'interno del costruttore solo una volta.
Il mio problema è che FieldEncoder::SetRawData()
è un metodo non const, il che significa che anche il metodo MyFastMessageEncoder::encode
deve essere non-const. Tuttavia , se dovessi rendere temporaneo l'oggetto FieldEncoder nel metodo, MyFastMessageEncoder::encode
potrebbe essere contrassegnato come const. Ciò significa che ogni oggetto che chiama MyFastMessageEncoder::encode
è anche non-const, che (per me) inizia a rovinare la correttezza del programma.
Ora capisco come funziona la parola chiave mutable
e come potrei usarlo per risolvere questo problema, ma la mia domanda è: Lo farebbe essere considerato una cattiva forma, dal momento che gli interni dell'oggetto sono tecnicamente in fase di modifica?
Altre considerazioni:
- La sicurezza del thread non è un problema, è garantito che venga eseguito solo in un singolo thread (sebbene
MyFastMessageEncoder
possa essere creato su più thread) - Il metodo
set_raw_data
non influisce sulla classeFieldEncoder
al di fuori del metodoMyFastMessageEncoder::encode
. Tutti i dati impostati vengono cancellati o sovrascritti la volta successiva che viene chiamato il metodoset_raw_data
.