-1

考虑以下示例:

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;
}

在我的代码文档中,我想通过引用区分 getter(直接访问类数据成员)和通过复制获取 getter(访问在类数据成员上构造的数据)。我可以用什么词来命名这两个不同的类别?

4

1 回答 1

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暗示调用该操作会产生成本。我所看到的命名约定的这种变化是特定于执行成本很高的操作。

于 2012-09-09T14:16:58.547 回答