Два разных слова для геттеров по ссылке против геттеров по копии

Рассмотрим следующий пример:

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 подразумевать, что есть вызов, связанный с вызовом операции. Это изменение в соглашениях об именах, где я видел это, было характерно для операций, где стоимость выполнения была высокой.

Другие вопросы по тегам