有时我不明白为什么我们甚至将每个字段都设为私有字段,然后为它们创建受保护或公共的getter

Hao*_*est 0 oop

我认为我不是OOP的总菜鸟,但是你有时觉得我们在田地私有化方面走得太远吗?你是否有一个很好的经验法则,一个领域绝对必须是私人的,什么时候(也许)可以将其标记为受保护或公开?

有时这是让我感到明显的事情.

讨论

cHa*_*Hao 6

简单的规则:

界面应该是公开的.实施应该是私人的.

当您将字段设置为公共(甚至是受保护的)时,您实际上将其声明为接口的一部分.问题是,它是一个实现细节 - 几乎在所有情况下,该字段对您的代码意味着什么.任何想要设置它的人都可以,但你必须仔细解释它是如何设置的,以防止整个事情崩溃和燃烧.您甚至无法在设置时对其进行验证,因此您需要在使用它之前每隔一段时间对其进行验证,这可能会导致性能下降,具体取决于验证的执行方式.(即便如此,也不能保证场地会留下来 有效,因为你甚至无法强制执行对它的同步访问.)使用你的类的每个人都必须做同样的事情,因为$ DEITY只知道其他代码一直在使用该字段并且可能破坏它.

最重要的是,一旦它成为一个字段,人们就会编写期望使用该字段的代码.如果您发现以后需要进行任何验证,则不能在不破坏二进制兼容性的情况下将字段转换为getter/setter(意味着使用您的代码的任何人都必须重新编译使用该字段的所有内容让它再次工作).这样做太多次了,人们会害怕使用你的API - 阅读:你没有任何用户.

getter和setter将实现与接口分开.它们允许呼叫者返回绝对有效的内容,并让您确保进入的任何内容绝对有效.这使事情更可预测,更稳定.因此,如果您编写的代码将在您编写之后使用,那么非平凡的 getter和setter(验证值,可能是同步等等 - 即:不仅仅是盲目地获取和设置变量)是一个好主意.