简单浏览上述文章后,我发现Getter和Setter是不良的面向对象设计,应该避免使用,因为它们违反了封装和数据隐藏。既然如此,在创建对象时如何避免这种情况,如何对对象进行建模以考虑这一点。
在需要getter或setter的情况下,还有哪些其他替代方案可以使用?
谢谢。
简单浏览上述文章后,我发现Getter和Setter是不良的面向对象设计,应该避免使用,因为它们违反了封装和数据隐藏。既然如此,在创建对象时如何避免这种情况,如何对对象进行建模以考虑这一点。
在需要getter或setter的情况下,还有哪些其他替代方案可以使用?
谢谢。
你没有理解重点。那篇文章中有效而重要的部分是:
不要请求获取需要完成工作的信息;相反,向拥有信息的对象请求为您完成该工作。
Java 风格的getter和setter泛滥是忽略这一建议的症状。
获取器或设置器本身并不是不好的面向对象设计。
不好的编码实践包括自动为每个成员提供getter和setter,无论是否需要(以及使本应该不公开的成员公开),因为这基本上将类的实现暴露给外部世界,违反了信息隐藏/抽象原则。有时这是由IDE自动完成的,这意味着这种做法比希望的要普遍得多。
是的,在面向对象编程中,getter和setter是一种反模式:http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html。简而言之,它们不适用于面向对象范例,因为它们鼓励您将对象视为数据结构,这是一个重大误解。
你可以在我的书《优雅的对象》中找到更多细节。
Getter和Setter本身并不是不好的。不好的是将任何字段都设为私有,无论如何都提供getter/setter的做法。
从这篇文章中可以看出:
何时使用访问器?首先,正如我之前所讨论的那样,如果一个方法返回一个实现了接口的对象,那么使用访问器是可以的,因为接口将你与实现类的变化隔离开来。这种返回接口引用的方法并不是真正意义上的“getter”,它只是提供对字段的访问。如果你改变了提供者的内部实现,只需修改返回对象的定义以适应这些变化。通过接口,你仍然保护了使用该对象的外部代码。
换句话说,当需要时,无论是getter还是setter方法,都应该使用接口来维护封装性。通常情况下,为返回类型或形式参数指定一个接口是一种良好的实践。