Sto lavorando a un cambiamento di progettazione e implementazione a causa di un bug. La correzione di bug ci richiede di modificare un oggetto di classe in un metodo const. Penso che le due opzioni siano:
- Il metodo non-const ha lanciato
this
in const (e quindi chiama il metodo const)? - Il metodo const ha gettato via const-ness (e quindi chiama il metodo non-const)?
Nel caso di (1), dobbiamo dichiarare i membri dei dati come mutabili.
Nel caso di (2), possiamo eliminare i membri di dati mutabili.
La terza opzione - non entrare in questa situazione in primo luogo - non è più disponibile.
Qual è la migliore pratica per un metodo const e un metodo non const che funziona sui dati dei membri? O, per dirla in altro modo, come dovrebbe procedere la progettazione e l'implementazione?
Le rotazioni sono dovute a un bug fix e al nostro estremo desiderio che "le cose funzionino" con il codice esistente. Non vogliamo forzare gli utenti a riscrivere il loro codice, quindi facciamo qualcosa pigramente in un metodo const (gli utenti chiamano Foo
e non hanno mai chiamato Bar
fino alla correzione):
void Foo() const
{
// Added due to bug fix
if(!m_bar)
Bar();
}
void Bar() const
{
// m_1 and m_2 are mutable
m_1 = ...
m_2 = ...
// m_3 and m_4 are untouched...
m_bar = true;
}
Il problema in realtà va più in profondità nel design. Ad esempio, Bar
è dichiarato virtuale e non-const in una classe base. Quindi dobbiamo fare queste cose evitando di nascondere il nome.
Una domanda simile che prende un po 'dell'approccio mutevole: È una cattiva idea usare mutable per i temporari pre-assegnati?