Dire che ho una grande classe chiamata Root , che ha molti membri e amp; funzioni:
class Root {
public:
void func1(); // operates on a and b
void func2();
...
private:
A a;
B b;
C c;
...
};
La classe Root sta diventando un po 'grande quindi decido di scomporre alcune delle variabili membro e una funzione in un'altra classe:
class AB {
public:
void func1();
...
private:
A a;
B b;
};
Quindi, usando la composizione, posso rendere AB ab una variabile membro di Root . Root ora è un po 'più piccolo / più pulito / più gestibile. La domanda riguarda il livello di accesso di ab dopo questo refactoring.
Va bene in questo caso che ab sia un membro pubblico? Qualsiasi aspetto negativo? I membri pubblici sono generalmente considerati di cattivo design da ciò che ho letto. Ma qui l'incapsulamento / esposizione globale non è realmente cambiato ... gli oggetti a e b sono privati in AB quindi sono ancora nascosti dall'esterno.
(Sidenote: il motivo per cui vorrei rendere pubblico ab è che consente un più facile attraversamento della gerarchia di composizione di Root . Ad esempio in Root membro c Potrei voler chiamare func1 :
void C::foo(Root& root) {
//do some stuff
root.ab.func1();
}
Se ab era privato, dovrei definire una funzione pass-through in root .)