Это может быть быстрее (хотя и ненамного).Однако оба примера неверны в том смысле, что они нарушают инкапсуляцию и нарушают закон Деметры .Они требуют, чтобы либо класс Switch
, либо любой, кто его создает, имел доступ как к самому Room
, так и к Lamp
внутри него.Конечно, мы также предполагаем, что в каждой комнате есть Лампа, и что Лампа может существовать только в пределах комнаты ... что означает, что если эти условия когда-либо изменятся, нужно изменить два класса вместо одного.
Первый пример лучше записать как
class Room {
public:
Room() : sw(*this) { }
void TurnOn() { lamp.TurnOn(); }
private:
Lamp lamp;
Switch sw;
};
class Switch {
public:
Switch(Room& room) : room(room) { }
void TurnOn() { room.TurnOn(); }
private:
Room& room;
};
, так как тогда Room
отвечает за то, что включается.Может быть лампа, может быть радио.Switch
больше не нужно заботиться.Это, скорее всего, будет медленнее, но это более удобно для обслуживания.
Если вы хотите, чтобы Switch
включал только Lamp
, тогда
class Room {
public:
Room() : sw(lamp) { }
void TurnOn() { lamp.TurnOn(); } // (semantics: who "turns on" a room?)
private:
Lamp lamp;
Switch sw;
};
class Switch {
public:
Switch(Lamp& lamp) : lamp(lamp) { }
void TurnOn() { lamp.TurnOn(); }
private:
Lamp& lamp;
};
Это должно быть простотак быстро, не требуя, чтобы мы нарушили инкапсуляцию.