Quando ho pensato alla testabilità e al codice modulare, ho pensato di recente se dovrei suddividere la parte di sincronizzazione di una classe dalla parte del comportamento reale.
Per esempio:
L'app "ha bisogno" di questo:
class Mogrifier { // Mogrifier accesses are thread safe
private:
unsigned int m_state;
mutex m_sync;
public:
Mogrifier()
: m_state(0)
{ }
unsigned int Mutate() {
lock_guard<mutex> lock(m_sync);
const unsigned int old = m_state;
m_state += 42;
return old;
}
:::
};
Sembra abbastanza semplice, tranne il blocco e le cose reali che la classe fa non sono realmente correlate.
Quindi penso che sia una buona idea dividerlo:
class Mogrifier { // Mogrifier is *not* synchronized
private:
unsigned int m_state;
public:
Mogrifier()
: m_state(0)
{ }
unsigned int Mutate() {
const unsigned int old = m_state;
m_state += 42;
return old;
}
:::
};
class SyncedMogrifer {
private:
mutex m_sync;
Mogrifier m_;
public:
unsigned int Mutate() {
lock_guard<mutex> lock(m_sync);
return m_.Mutate();
}
};
- Lo faresti?
- Aiuterà con il test delle unità?
- Sono pessimo con i nomi di Pattern ... come si chiama?
- C'è un modo semplice per "generare" un tale wrapper in C ++ per una chiamata arbitraria?