Getters and Setters是糟糕的OO设计?

Jul*_*lio 26 c# java oop encapsulation

Getters和Setters很糟糕

简单地阅读上面的文章我发现getter和setter是糟糕的OO设计,应该避免它们反对Encapsulation和Data Hiding.在这种情况下,如何在创建对象时避免它,以及如何将对象模型对象考虑在内.

如果需要吸气剂或固定剂,可以使用其他替代品吗?

谢谢.

Cor*_*sky 51

你错过了这一点.该文的有效,重要的一点是:

不要求您提供完成工作所需的信息; 询问有信息的对象为你做的工作.

Java风格的getter和setter扩散是忽略这个建议的症状.

  • 它们是*可能的*症状.问题也可能是问题根本无法以这种方式解决.或者它们可能是使用依赖注入的"症状". (4认同)

DVK*_*DVK 33

吸气剂或制定者本身也不错OO设计.

糟糕的是编码实践,其中包括一个getter和一个setter,用于自动成为每个成员,是否需要getter/setter(加上公共成员不应公开) - 因为这基本上暴露了类的实现到外部世界违反信息隐藏/抽象.有时这是由IDE自动完成的,这意味着这种做法比预期的要广泛得多.


Eya*_*der 5

我相信在API中包含setter只有它们真的是类规范的一部分(即它与调用者的合同).

应该隐藏与内部表示相关的任何其他数据成员,我至少看到两个主要原因:

1)如果暴露内部表示,设计变更将来会出现问题,并且还需要API更改.

2)使用setter/getter公开数据成员时不要小心,这使得调用者很容易破坏类不变量.状态不一致的对象可能会导致很难分析的错误.

不幸的是,有一些框架鼓励(有时需要)为所有内容添加setter/getter.


fas*_*ava 5

getter 和 setter 本身并不坏。不好的是将任何字段设为私有并无论如何都为所有字段提供 getter/setter 的做法。


yeg*_*256 5

是的,getter和setter是OOP中的反模式:http : //www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html。简而言之,它们不适合面向对象的范例,因为它们鼓励您将对象视为数据结构。这是一个主要的误解。