Два разных слова для геттеров по ссылке против геттеров по копии
Рассмотрим следующий пример:
class MyClass
{
// Getters by copy ?
public:
inline std::string fullName() const {return _firstName+_lastName;}
// Getters by reference ?
public:
inline const std::string& firstName() const {return _firstName;}
inline const std::string& lastName() const {return _lastName;}
// Data members
protected:
std::string _firstName;
std:::string _lastName;
}
В документации моего кода я хотел бы различать геттеры по ссылке (прямой доступ к членам данных класса) и геттеры по копии (доступ к данным, построенным на членах данных класса). Какие слова я могу использовать, чтобы назвать эти две разные категории?
1 ответ
Первый вопрос, который приходит на ум, - почему вы хотите различать операции в названии. Тем более что это разделение подразумевает, что вы пропускаете детали своей реализации пользователям и теряете инкапсуляцию.
Рассмотрим, например, что во время профилирования реального приложения вы обнаруживаете, что 90% времени абоненты используют fullName()
и не делайте копии, тогда вы можете изменить свой тип, чтобы кэшировать результат и избежать затрат:
class MyClass {
// ...
std::string _fullName;
public:
const std::string& fullName() const {
return _fullName;
}
// One of the options for caching: update on set
// Could use other, like update on first request...
void setName( std::string firstName ) {
_firstName = std::move(firstName);
_fullName = _firstName + _lastName;
}
};
Если ваше соглашение о присвоении имен различает оба типа функций, то вам придется либо искать все варианты использования функции в вашем проекте и заменять их для изменения реализации, либо ваша функция будет ложной, поскольку наименование подразумевает копию, но реализация не делает.
При этом, я видел, как это делалось в прошлом, когда аксессоры, которые просто возвращают ссылку на член, были названы либо nember, либо getMember
и операции, которые создают новые объекты, были названы как предложение с глаголом, который подразумевал конструкцию: composeFullName
подразумевать, что есть вызов, связанный с вызовом операции. Это изменение в соглашениях об именах, где я видел это, было характерно для операций, где стоимость выполнения была высокой.