Diciamo che abbiamo una classe Car
che contiene oggetti di tipo Wheel
class Wheel {
public:
void SetFriction(double f) {
friction = f;
}
private:
double friction;
};
class Car {
private:
std::array<Wheel, 4> _wheels;
}
Ora voglio offrire al proprietario di un'automobile l'accesso all'attrito delle ruote. Ci sono principalmente due modi in cui posso pensare di fare questo:
-
Dare accesso alle ruote:
class Car { Wheel& GetWheel(int id) { return _wheels[id]; } private: std::array<Wheel, 4> _wheels; } Car beetle; beetle.GetWheel(1).SetFriction(0.4);
-
Dare accesso direttamente all'attrito:
class Car { void SetWheelFriction(int id, double friction) { _wheels[id].SetFriction(friction); } private: std::array<Wheel, 4> _wheels; } Car beetle; beetle.SetWheelFriction(1, 0.4);
Il problema con la prima versione è che dà accesso a un membro privato, potenzialmente rompendo l'incapsulamento. Forse una funzione viene aggiunta alla ruota (ad esempio "SetManufacturer") che non deve essere esposta al proprietario di un auto.
Dall'altro lato, la seconda versione porta a definire molte funzioni in Car che non sono di sua diretta responsabilità, violando così il principio di responsabilità singola.
class Car {
void SetWheelFriction(int id, double friction) {
_wheels[id].SetFriction(friction);
}
double GetEngineWeight() {
return _engine.GetWeight();
}
double SetWindowsColor(Color& c) {
for(auto& w : _windows){
w.SetColor(c);
}
}
// And so on...
Sono strongmente incline alla prima opzione, ma mi piacerebbe sentire l'opinione di qualcun altro.
Forse in qualche modo correlato: link