通过引用与getter通过复制获得两个不同的单词
考虑下面的例子:
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。 我可以用什么词来命名这两个不同的类别?
想到的第一个问题就是为什么要区分名称中的操作。 特别是因为这种分离意味着你正在泄漏你的实现细节给用户并丢失封装。
例如,考虑在实际应用程序的分析过程中,您发现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
暗示有一个与调用操作相关的成本。 在我看到的这种命名约定中的这种变化,特别针对执行成本高昂的操作。
上一篇: Two different words for getters by reference vs getters by copy