考虑以下示例:
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。我可以使用哪些词来命名这两个不同的类别?
答案 0 :(得分:1)
首先想到的问题是你想要区分名称中的操作。特别是因为这种分离意味着您正在向用户泄漏实现的细节并丢失封装。
例如,考虑在实际应用程序的分析过程中,您发现90%的时间调用者使用fullName()
并且不进行复制,那么您可能希望将类型修改为缓存< / em>结果并避免成本:
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
暗示与调用操作相关的成本。我所看到的命名约定中的这种更改特定于执行它的 cost 的操作很高。