C# getter和setter是糟糕的OO设计吗?

C# getter和setter是糟糕的OO设计吗?,c#,java,oop,encapsulation,C#,Java,Oop,Encapsulation,简单阅读上面的文章,我发现getter和setter是糟糕的OO设计,应该避免,因为它们不利于封装和数据隐藏。在这种情况下,如何在创建对象时避免这种情况,以及如何对对象进行建模以将其考虑在内 在需要getter或setter的情况下,可以使用哪些其他替代方案 谢谢。我建议您仔细阅读整篇文章,因为它提供了经过深思熟虑的论点和备选方案。这个问题本身太开放了,你在这里得到的答案将只是更多的意见。获取者或设定者本身都是不错的OO设计 不好的是编码实践,它自动为每个成员包含一个getter和一个sette

简单阅读上面的文章,我发现getter和setter是糟糕的OO设计,应该避免,因为它们不利于封装和数据隐藏。在这种情况下,如何在创建对象时避免这种情况,以及如何对对象进行建模以将其考虑在内

在需要getter或setter的情况下,可以使用哪些其他替代方案


谢谢。

我建议您仔细阅读整篇文章,因为它提供了经过深思熟虑的论点和备选方案。这个问题本身太开放了,你在这里得到的答案将只是更多的意见。

获取者或设定者本身都是不错的OO设计


不好的是编码实践,它自动为每个成员包含一个getter和一个setter,不管是否需要该getter/setter(再加上公开不应该公开的成员),因为这基本上将类的实现暴露给外部世界,违反了信息隐藏/抽象。有时这是由IDE自动完成的,这意味着这种做法比预期的要广泛得多。

您没有抓住要点。这篇文章的要点是:

不要问你需要的信息 做这项工作;询问对象 有信息做这项工作吗 你


Java风格的getter和setter的激增是忽视这一建议的症状。

根据我的理解,作者认为盲目地在字段周围放置getter和setter并不比将字段公开好


我相信作者认为getter和setter应该放在稀疏的地方,并且要小心,因为OO的思想是对象应该限制它们只暴露于需要的内容。

我认为只有当setter真正是类规范的一部分(即它与调用方的契约)时,才应该在API中包含它们

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

1) 如果内部表示是公开的,那么将来的设计变更问题会更大,也需要API变更

2) 使用setter/getter毫无顾忌地公开数据成员会让调用方很容易破坏类不变量。状态不一致的对象会导致很难分析的错误

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

本文:

存取器什么时候可以?首先,正如我所说 在前面讨论过,这对一个 方法返回对象,以表示 一个接口,用于创建对象 实现,因为该接口 将您与对的更改隔离开来 实现类。这种 方法(返回一个接口) 参考资料)并不是真正的“获取者” 这种方法的意义在于 提供对字段的访问。如果你 更改提供程序的内部 实现时,只需更改 将对象的定义返回给 适应变化。你还是 保护使用的外部代码 通过对象的接口创建对象


换句话说,在必要时使用getter和setter方法的接口,这样可以维护封装。一般来说,为返回类型或形式参数指定接口是一种很好的做法。

我将进一步说,只有值类型才应该有getter。每个值类型都应该是不可变的,并且带有一个可变的构建器和设置器

如果您的值类型具有setter,则它们应该在复制其他值后返回一个新实例

Url.setAnchor(…)

将返回复制主机端口等的新Url,但覆盖锚

您的服务类型类不需要setter(在ctor中设置它们),而且肯定需要getter。您的邮件程序应该在它的ctor中包含主机/端口/etc静态内容。如果我想发送一封电子邮件,那么我会将其命名为send(),我的代码没有理由需要知道、想要或需要主机和其他配置值。也就是说,创建如下MailServer类是有意义的 //值类型 MsilServer{ 字符串主机 内部端口 字符串用户名 串起密码//所有人都来了ruth getters } //工厂
Mailer create(MailServer)

还有其他文章说它们是很好的设计。 但答案是: getXXX和setXXX根据使用情况是好是坏。 这些方法确实使很多事情变得容易。因此,如果有文章说这是一个糟糕的设计,我认为;这只是想对这个想法施加太大的压力

这些方法的最大用途之一是在许多框架中使用,并用作反射机制

所以不要完全避免使用这些,而是。。。明智地使用它

谢谢 阿尤斯曼

getter和setter是糟糕的OO设计吗

只有在不用思考的情况下使用

如果您要创建一个值对象来传输数据,它们就可以了

如果你正在创建一个更重要的对象,那么它们就不应该在那里。例如,看看
ArrayList
接口*。您看不到
Object[]getElementData()
,因为这会破坏封装(有些人可能会修改底层数组)


*我指的是类的公共接口(类定义公开的方法)

getter/setter在正确的条件下非常合适。但是,mass Get/Set是错误的

然而,我有点困惑。您标记了Java,但材料并不是特别特定于Java(仅示例)。值得注意的是,在C++中(最好是在0x中完成),许多问题不存在。如果您想将接口从long更改为int,那么在decltype、templates和auto之间,这是很容易实现的,这就是为什么这样的构造很难实现。Typedef也能很好地工作。

getter和setter都是ju