6

我有一个包含许多具有读/写访问权限的内置类型成员的类。我应该将它们设为公共成员并为每个成员提供 get/set 方法吗?结构呢?

4

5 回答 5

20

拥有访问器(getter)和修改器(setter)的全部原因是为自己提供额外的间接级别。

这种额外的间接级别允许您向公共接口提供变量的只读视图,同时不允许更改数据成员。您仍然可以使用私有或受保护的设置器。

设置器允许您在设置值时进行特殊的错误检查、验证和更正。例如 setDirectory(const std::string &strPath),如果用户没有指定,你可以确保有一个终止斜线。这可确保您的类状态始终有效。

Getter 还可以保护您的成员不让它们暴露以允许指向它们的指针。通过不允许从外部指向它们的指针,您可以确保如果您的对象超出范围,它不会导致崩溃。

getter/setter 的额外间接级别还允许您更改它们封装的数据成员。

使用 getter,您还可以获得数据的不同视图,例如:getMinutes,当您的数据成员实际上以秒为单位存储时。

这不是使用它们的原因,但是使用 getter 和 setter 的一个很好的副作用是您可以在修饰符中设置一个断点,例如准确地查看它何时更改。

您是否应该使用它们是基于您的需要的判断电话。如果您有这么多成员,以至于提供 getter 和设置是一个巨大的痛苦,您可以考虑将数据成员存储在一个结构中,并在您的类中使用该结构。您甚至可以一次为整个结构的对象提供 getter/setter。

于 2009-03-22T13:13:39.460 回答
15

如果您需要保留不变量,那么可以。否则,不要打扰。

于 2009-03-22T13:22:39.470 回答
4

首先,如果你的班级有很多数据成员,那么它可能设计得不好。您可能需要考虑将其拆分为多个类或将数据存储在地图等结构中。

关于提供访问器,问题是您是否想要修改访问权限,可能会阻止它。如果答案是肯定的,那么您需要访问功能。另一方面,如果你的类真的只是一堆比特,没有任何行为,那么就让它成为一个结构。

于 2009-03-22T12:58:34.193 回答
1

您应该只使用公共数据成员

  • 在结构中,您不会向客户端代码公开(例如,绑定样式函子) - 保护外部任何人都无法获得的结构是没有用的
  • 如果它们的类型封装了设置/获取它们的逻辑(例如,如果你创建了一个 ObservableAttribute 类)
  • 如果它们是不可变结构中的 const 成员(如果它们是不可变的,除了读取它们之外,你无能为力)

如果您创建一个公共数据成员,您必须确保它的值与该类的其他成员完全正交。例如,您禁用了未来的可能性

  • 观察成员的变化
  • 使成员在类的不变量中扮演任何角色
  • 禁止访问该成员
  • 如果性能需要,更改成员的实现(例如,计算、缓存和存储)
于 2009-03-22T13:19:22.690 回答
0

对私有/受保护的数据成员使用 get/set 方法是一个糟糕的设计。

它会导致客户端代码依赖于您的类的实现细节。

类中的更改会导致客户端代码的更改。

但是,可以使用公共成员的 get/set 方法。但避免它们总是好的。

于 2009-03-22T13:02:28.083 回答