我有一个类,其中包含许多具有读/写访问权限的内置类型成员。我应该让他们成为公共成员并为每个成员提供获取/设置方法吗?结构怎么样?
答案 0 :(得分:19)
拥有访问器(getter)和修饰符(setter)的全部原因是为自己提供额外的间接级别。
这种额外的间接级别允许您向公共接口提供变量的只读视图,同时不允许更改数据成员。您仍然可以使用私有或受保护的setter。
Setters允许您在设置值时执行特殊错误检查,验证和更正。例如setDirectory(const std :: string& strPath),如果用户没有指定,则可以确保存在终止斜杠。这可确保您的班级状态始终有效。
Getters还可以保护您的成员不会暴露它们以允许指向它们。通过不允许从外部指向它们,您可以确保如果您的对象超出范围,它将不会导致崩溃。
getter / setter的额外间接级别还允许您更改它们封装的数据成员。
使用getter,您还可以获得不同的数据视图,例如:getMinutes,当您的数据成员实际存储在几秒钟内时。
这不是使用它们的原因,但使用getter和setter的一个很好的副作用是你可以在修饰符中设置一个断点,例如看看它何时被改变。
是否应该使用它们是根据您的需要进行的判断。如果您有这么多成员,那么提供getter和设置是一件非常痛苦的事情,您可以考虑将数据成员存储在结构中并在类中使用该结构。您甚至可以立即为整个结构的对象提供getter / setter。
答案 1 :(得分:13)
如果您需要保留invariants,那么是。否则,不要打扰。
答案 2 :(得分:4)
首先,如果你的班级有很多数据成员,那么可能没有很好的设计。您可能需要考虑将其拆分为多个类或将数据存储在诸如map之类的结构中。
关于提供访问者,问题是您是否希望修改访问权限,可能会阻止访问权限。如果答案是肯定的,那么您需要访问功能。另一方面,如果你的班级真的只是一大堆,没有任何行为,那么就把它变成一个结构。
答案 3 :(得分:1)
您应该只使用公共数据成员
如果您创建公共数据成员,则必须确保其值与该类的其他成员完全正交。例如,你禁用了
的未来可能性答案 4 :(得分:0)
对私有/受保护数据成员使用get / set方法是一个糟糕的设计。
它会导致客户端代码依赖于您的类的实现细节。
班级中的更改会导致客户端代码发生变化。
但是,可以使用公共成员的get / set方法。但避免它们总是好的。