Par*_*idi 35 c++ oop encapsulation
在我脑海中,我是一个有很多人的新手,还有很多用C++体验过的东西!有些东西我觉得很混乱,而且是公共变量的使用,我见过这样的大量代码:
class Foo {
private:
int m_somePrivateVar;
public:
void setThatPrivateVar (int const & new_val) {
m_somePrivateVar = new_val;
}
int getThatPrivateVar (void) const {
return m_somePrivateVar;
}
};
Run Code Online (Sandbox Code Playgroud)
为什么有人会隐藏该变量并实现访问器和更改器,当它们没有完成任何操作时,只需要接收新值(没有范围检查等)或返回值而不是原样?好吧,我听说过一些原因,其中一些原因在某些情况下是令人信服的,但想象一下如此实现一个庞大的类,有很多变量,不需要任何检查和东西!我这样问你,你什么时候使用公共变量?你根本使用它吗?
Mar*_*k B 41
通过隐藏变量并立即添加方法,类设计器允许将来将任意代码插入到这些方法中,而不会破坏大量直接使用这些属性的代码.
另请注意,提供大量的访问器/增变器方法通常表明您的类设计需要另外寻找可能的改进.类方法应该实现实际逻辑,而不仅仅是提供对每个成员的访问.
我只在struct表单中使用公共变量.例如,我可能有一个表示字符串 - >值映射的数据库表,其中value是复合数据结构.我只是编写一个结构并用于举例std::map<std::string, MyStruct>来表示数据库表.我不需要实际处理数据,只需能够查找并在需要时使用它.
正如一些评论中所指出的那样,甚至structs通常也可以从司法使用方法中受益,例如,一些常见的构造函数可以保持成员的理智初始化,重用结构的明确功能等.
Dou*_* T. 23
IMO是引导者/吸气者最令人信服的理由是孤立变革.如果您需要添加范围检查,例如,如果您已经有一个setter,则可以在setter中轻松完成,而不会影响客户端代码.如果您还没有setter,那么需要更新所有客户端代码以使用getter/setter,这可能是一场噩梦.
Ton*_*ony 17
我部分同意其他关于使用getter和setter方法的答案以允许将来的更改,但仍然存在一个基本问题,即暴露对象的内部数据以供其他对象修改.
最好通过方法让对象对它所拥有的数据执行某些操作,而不是将对象视为值的集合.
这是一篇关于为什么Getter和Setter方法是邪恶的有趣文章,它是用Java编写的,但同样适用于C++.
任何公开的东西都成为该对象契约的一部分。如果您公开公开数据,那么当数据值更改时,它必须继续正常运行。对于 struct 类型对象,这可能是合适的。
拥有大量的 getter 和 setter 可能是一个警告信号,表明该对象确实是一个结构体,最好直接公开字段。但是,我已经实现了 struct 类型对象,以便允许字段具有多个名称。字段可以根据需要有多个 setter 或 getter,允许不同域之间的名称转换。真实字段具有描述性名称。其他 getter 和 setter 使用这些字段的域特定代码。
正如其他人所指出的,getter 和 setter 表示字段的存在。不要求存在这样的字段,只要求其行为存在。公开 getter 和 setter 意味着有理由让公众能够修改或读取该字段的值。仔细考虑目的,您可以更改方法名称或不公开它。