Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么谷歌在成员变量后命名访问器和变异器?_C++_Oop_Coding Style_Encapsulation_Google Style Guide - Fatal编程技术网

C++ 为什么谷歌在成员变量后命名访问器和变异器?

C++ 为什么谷歌在成员变量后命名访问器和变异器?,c++,oop,coding-style,encapsulation,google-style-guide,C++,Oop,Coding Style,Encapsulation,Google Style Guide,正则函数有混合情况;访问器和变异器与 变量名称:MyExcitingFunction(),MyExcitingMethod(), 我的成员变量(),设置我的成员变量() 对用户隐藏实现细节,这样他/她就不知道访问器/变异器方法是否返回/修改成员变量,这不是封装的全部要点吗?如果我更改变量名或更改它在对象中的存储方式,该怎么办 编辑: 如果我有一个实例变量intfoo\ucode>,它看起来很简单 int foo() const { return foo_; } 但是如果我添加了另一个返回foo

正则函数有混合情况;访问器和变异器与 变量名称:MyExcitingFunction(),MyExcitingMethod(), 我的成员变量(),设置我的成员变量()

对用户隐藏实现细节,这样他/她就不知道访问器/变异器方法是否返回/修改成员变量,这不是封装的全部要点吗?如果我更改变量名或更改它在对象中的存储方式,该怎么办

编辑:

如果我有一个实例变量
intfoo\ucode>,它看起来很简单

int foo() const { return foo_; }
但是如果我添加了另一个返回
foo+2
的方法,我应该命名if
bar
还是
GetBar

int bar() const { return foo_ + 2; }
int GetBar() const { return foo_ + 2; }

如果我选择
GetBar
,然后决定在另一个成员变量
bar\ucode>中缓存返回值,我是否必须将该方法重命名为
bar

,因为谷歌风格指南只供谷歌员工遵循。相反,这不是一个好的风格指南

int bar() const { return foo_ + 2; }
int GetBar() const { return foo_ + 2; }
举个例子——他们明确禁止通过非常量引用传递,因为这可能会“令人困惑”


所以你是对的,它违背了封装的目的。不要用它来指导自己。

实际上,封装的目的是隐藏类的内部工作,而不一定要隐藏事物的名称。成员变量的名称无关紧要;这是访问器或变异器提供的间接寻址级别

拥有一个访问器使您能够在不破坏类与外部世界的接口的情况下更改类的内部工作(包括成员变量的名称)。类的用户不需要关心实现细节,包括类内部的命名,而只需要关心从外部看类的行为


换句话说,类的用户不应该依赖Google的样式指南来确定他们是否在修改成员变量

我可能对常识的假设做得太过分了,但我非常确定,保留已发布的接口比遵循命名指南更重要

由于原始的
bar
/
GetBar
函数不是访问器,因此我认为它应该遵循常规的名称指南,并被称为
GetBar

如果以后引入
bar
,使函数在某种意义上成为访问器,我很确定您不应该删除
GetBar
。我想您也可以添加一个函数
bar()
,定义为做同样的事情,但我不认为我会将样式指南解释为需要这样做

我还非常确定,只要发布的接口包含您(和调用者)认为是“访问器”的函数,封装在某种程度上就不存在了,因为您谈论的是对象的状态,而不是其行为。函数在当前实现中返回成员变量的值并不意味着它必须作为访问器记录。但如果你坚持编写公开承认为访问器的函数,谷歌会告诉你如何命名它们。典型的例子是,一个足够愚蠢的数据记录对象可能有合理的访问器,因为整个类被公开定义为一组字段,可能有一点行为


我以前读过几次《风格指南》,但我从未为谷歌工作过,所以我不知道他们的代码评审在实践中是如何应用的。我认为,一个如此规模的组织不可能在每一个细节上都完全一致。所以你的猜测可能和我的一样好。

当考虑一个类时,它可能在概念上是可见的 状态,客户端可以访问该状态。这种状态如何 在类中表示是另一回事,这就是 访问器(getter和setter)隐藏。我自己的命名惯例 也有这样的区别:如果函数在概念上是 作为一个getter或setter,它具有属性的名称 通常是一个名词;否则,它是一个动词。及 我区分函数正在获取或 设置一些概念上不属于类的内容 (例如,部分取决于一个论点),其中 动词
get
set
在其名称中,以及 函数实际上是修改概念上的 属性,在这种情况下它们不会

对于其他人来说,就像大多数风格指南一样,并不是每个人都是一个整体 我同意这一点。我不确定我是否喜欢他们的名字 例如,公约。它们被称为命名约定 因为它们只是:武断的约定。唯一的 真正的硬规则是类型、宏和其他东西必须 而且名字不应该以字母开头或结尾 强调。(还有一些较软的规定:我会非常 怀疑一个以制造
局部变量比全局变量长。)

请原谅我的无知,但是一个人怎么会得到与通过引用传递相同的行为呢?你没有回答这个问题。。。这就像说“他们这样做是因为他们这样做了”@AndréPuel我想这意味着他们有这个规则是因为他们喜欢愚蠢的规则。在这种情况下,我不得不同意。@AndréPuel你是在问一个愚蠢规则的真正原因吗?你认为“引用混淆”是不使用引用的原因吗?如果是这样的话,那么对不起,我没有理由:)@LuchianGrigore:不过,公平一点,你歪曲了规则及其理由。谷歌的规则是不通过非常量引用传递输出参数,而在风格指南中,它被认为是混淆的确切含义(即,它被认为混淆的两个不同的东西)。我并不是说这是对的,我