Во-первых, позвольте мне еще раз повторить: самая большая проблема заключается не в продолжительности жизни, а в инкапсуляции.
Инкапсуляция означает не только то, что никто не может изменить внутреннее устройство без вашего ведома, инкапсуляция означает, что никто не знает, как что-то реализовано в вашем классе, так что вы можете изменять внутреннее устройство класса по своему желанию, пока вы сохраняете интерфейс идентичным.
Теперь не имеет значения, является ли ссылка, которую вы возвращаете, const
или нет: вы случайно раскрываете тот факт, что у вас есть объект Mother
внутри вашего класса Family
, и теперь вы просто не можете избавиться от него (даже если у вас есть лучшее представление) потому что все ваши клиенты могут зависеть от него и должны будут изменить свой код...
Самое простое решение - вернуть по значению:
class Family {
public:
Mother mother() { return _mother; }
void mother(Mother m) { _mother = m; }
private:
Mother _mother;
};
Потому что на следующей итерации я могу удалить _mother
, не нарушая интерфейс:
class Family {
public:
Mother mother() { return Mother(_motherName, _motherBirthDate); }
void mother(Mother m) {
_motherName = m.name();
_motherBirthDate = m.birthDate();
}
private:
Name _motherName;
BirthDate _motherBirthDate;
};
Видите, как мне удалось полностью переделать внутренности, ни на йоту не изменив интерфейс? Очень просто.
Примечание: очевидно, что это преобразование предназначено только для эффекта...
Очевидно, что эта инкапсуляция достигается за счет некоторой производительности, здесь есть напряжение, вам решать, следует ли предпочесть инкапсуляцию или производительность каждый раз, когда вы пишете геттер.
person
Matthieu M.
schedule
01.11.2012
std::shared_ptr<Mother>
? - person juanchopanza   schedule 01.11.2012Mother
на классMotherImpl
(более легкий) в какой-то момент вFamily
реализация ? Как вы теперь выполняете контрактGetMother
? - person Matthieu M.   schedule 01.11.2012shared_ptr
, это, безусловно, намного сложнее, чем просто возврат по копии ;) - person Matthieu M.   schedule 01.11.2012