那么公共variables有什么好处呢?
我是一个总是新手,在我的脑海里有很多,还有很多与C ++的经验! 有一些我觉得很混乱,这是公共variables的使用,我已经看到了这样的吨代码:
class Foo { private: int m_somePrivateVar; public: void setThatPrivateVar (int const & new_val) { m_somePrivateVar = new_val; } int getThatPrivateVar (void) const { return m_somePrivateVar; } };
为什么有人隐藏这个variables,并且在没有做任何事情的时候隐藏这个variables并且实现访问器和增变器,而不是像刚才那样分配新的值(没有范围检查等等)或者返回值而不是像现在这样呢? 那么我听说过一些原因,其中一些在某些情况下是令人信服的,但是想象一下实现一个巨大的类以这样的方式有很多variables,不需要任何检查和东西! 让我问你这个问题,你什么时候使用公共variables? 你用这个吗?
提前致谢。
通过隐藏variables并添加方法,类devise器允许在将来将任意代码插入到这些方法中,而不会破坏大量直接使用属性的代码。
另外请注意,提供大量的访问器/增变器方法通常表明您的类devise需要另一个可能的改进。 类方法应该实现实际的逻辑,而不仅仅是提供访问每个成员。
我只使用struct
forms使用公共variables。 例如,我可能有一个表示string – >值映射的数据库表,其中value是一个复合数据结构。 我只是写一个结构,并使用例如std::map<std::string, MyStruct>
来表示数据库表。 我不需要真正做数据的工作,只需要查看它并在需要时使用它。
正如在一些评论中指出的那样,甚至struct
通常可以从方法的司法使用中受益,例如一些常用的构造函数来保持成员的正确初始化,重用结构的明确function等等。
海事组织最令人信服的原因是隔离变化 。 如果你需要添加范围检查,例如,如果你已经有一个setter,你可以很容易地在你的setter中做到这一点,而不会影响客户端代码。 如果你还没有setter,那么所有的客户端代码都需要更新,以便使用getters / setter,这可能是一场噩梦。
我同意部分与其他答案有关使用getter和setter方法,以允许将来的变化,但仍然存在一个根本性的问题,你暴露你的对象的内部数据修改其他对象。
最好是让对象通过一个方法对它所保存的数据执行一些操作,而不是把对象当作一个值的集合。
这里有一篇关于为什么Getter和Setter方法是邪恶的有趣的文章,它是用Java编写的,但同样适用于C ++。
一个参数运行如下:
如果所讨论类的外部代码直接依赖于特定成员,那么对该成员进行更改就意味着更改访问它的每一段代码。 如果它是由成员函数访问的,那么可以保持接口的这一部分相同,只需对该类进行更改以保持外部代码的正常工作。
使用“getters”和“setter”可以为你的对象的耦合提供一些灵活性。
任何暴露于公众的东西都成为该对象合同的一部分。 如果公开公开数据,那么当数据值更改时,它必须继续正常运行。 对于结构types的对象,这可能是合适的。
拥有大量的getter和setter可能是一个警告信号,该对象实际上是一个结构,它可能会更好直接暴露字段。 但是,我已经实现了结构types对象,以便允许字段具有多个名称。 字段可以根据需要具有多个设置者或获取者,允许在不同域之间进行名称转换 真正的领域有描述性的名字。 额外的getter和setter使用这些领域的特定领域的代码。
正如其他人所指出的那样,获得者和制定者是一个领域的存在的象征。 没有要求这样的领域存在,只是它的行为存在。 公开获取者和接受者意味着公众能够修改或阅读该领域的价值是有原因的。 考虑一下目的,你可以改变方法的名称或不公开。
这些被称为“getters”和“setters”。 使用它们的一个很好的理由是你可以在不改变接口的情况下添加额外的代码。 在你的例子中,它看起来并不像他们做的那么多,但是在更复杂的类中它们实际上是必不可less的。
好了,据我所知,你的问题是这样的:为什么让一个variables私人,然后做两个函数,只是检索值和设置值,没有任何检查? 如果有检查,你会明白,不是吗? 例如,如果您设置Time类的小时字段,那么检查hour <= 24
是个好主意。
但是,当没有应用检查时,这个想法是这样的:如果在某个时候你决定改变设置和获取函数,例如,在它们中执行一些检查,那么使用你的类的整个代码就不需要重新编译
另外,封装的一般目的是只通过接口与类进行通信,而不知道它是如何实现的。 你隐藏的内心信息越多越好。
你什么时候使用公共variables? 当你制作没有任何行为的物体时。 那些只是一个数据的集合。 例如,请参阅std::pair
。 一对只是一个结构,公共first
和second
。
一般来说,用什么方法不能给出严格的标准,但是你会自己感受一下,获得经验。
HTH
正如Scott Meyers在Effective C ++书中所说: 避免公共接口中的数据成员 。 为什么? 因为它更容易编码(一切都是成员函数),所以你对这个variables的访问有更多的控制,以及Doug T.和其他人对function抽象所说的话。
如果你不需要类(例如你的例子),你可以select使用一个结构…
看看斯科特写的这篇文章 ,如果你没有这本书:)
我不能同意公众成员是邪恶的这个观点。 C ++不是C#。 我总是会避免使用C ++进行编码时不需要的东西。 如果使用公共成员是完全没问题的
- 你的公共variables不能被设置为未定义,越界或以某种方式损坏的值
- 你知道没有人会试图破坏你的对象(这意味着使用它的模块知道如何处理它)
- 您不需要由get / set动作引起的任何其他检查或对象修改
- 你100%肯定你将来不需要任何提及的东西
尽pipe有人说,我相信访问公共variables导致一个更干净的代码比使用一些函数调用几乎相同。 这当然取决于它是什么样的项目,以及如何使用这个类,以及将来如何使用它。 写入getter和setter 以防万一是愚蠢的意见是无用的。
作为参考,阅读C ++指南(C.131)
这只是一个基本的做法。 你devise一个可以被调用者安全访问的类的公共接口。 如果他们只是方法,他们的内容可以稍后改变。 如果他们是公共数据成员,你就会永远与他们打成一片。 你不能改变公共variables的作用。
一些编程语言(OOP模型)为同一个想法使用属性 。 如果您的公共接口只包含代码,您可以随时更改内部工作,使接口(以及使用它的其他代码)保持不变。 如果您的公共接口包含数据,则会限制将来的开发工作。
我知道在Java中我们使用公共variables,事实上,
公共静态最终
variables作为在引入枚举之前指定常量的手段。
例如,
class Direction { public static final String NORTH = "north"; ... }
我一直在研究C ++,所以不确定是否有可用的枚举types。 如果枚举在C ++中不可用,则可以使用上面的类似代码
在大多数情况下,吸气剂和吸附剂确实是一种很好的做法。 但事实是,你现在的例子太简单了,因此不适合通过get / set()来防御私人成员的访问。
一个更有趣的趋势是汽车实施的属性。 所以不必编写getter和setter,而只需编写一个属性,编译器完成剩下的工作。 你仍然可以select编写getters和setter,但是你不必为所有的1行代码编写所有的代码。 如果您以后需要添加范围检查等,您可以用老式的方式创build属性,并保持与您class级的界面相同。
我已经在C#,Objective-C和VB的最新版本中看到了这一点,它可以是相当有帮助的。 VB的实现不像C#那么灵活,但我相信它会很快赶上。
我不太在乎编写无所事事的访问器。 这种态度有两个原因。
-
这样做的原因之一是代码稍后将被inheritance。 我发现这在实践中通常是不正确的。 通常会发生的是代码被重构或replace。 代码的使用寿命几乎总是很短。
-
你现在正在做一些额外的工作,以便将来可能或不可能发生的事情。 这是“ 过早优化 ”错误的一种变化。
有些地方是一个好主意,而不是地方。 在大多数情况下,我觉得答案是没用的。