【问题标题】:Why is using a class as a struct bad practice in Java?为什么在 Java 中使用类作为结构不好的做法?
【发布时间】:2010-09-23 16:33:31
【问题描述】:

我们最近进行了一次代码审查。使用了我的一个类,以便我可以从/向方法返回/传递不止一种类型的数据。该类唯一的方法是 getters/setters 。团队的一位成员(我尊重他的意见)说,开设这样的课程是不好的做法(而且不是很 OOP)。这是为什么呢?

【问题讨论】:

    标签: java oop class struct


    【解决方案1】:

    有一种观点认为类应该是“数据结构”(即专注于存储没有功能的数据)或“面向功能”(即专注于执行某些操作同时存储最小状态)。如果你遵循这个论点(这是有道理的,但并不总是那么容易做到),那么这并没有什么错。

    事实上,有人会争辩说 bean 和实体 bean 本质上就是这样 - 带有 getter 和 setter 的数据容器。

    我看到某些资料(例如,“干净代码”一书)认为应该避免使用具有多个参数的方法,而是将它们作为具有 getter 和 setter 的单个对象传递。这也更接近于顺序无关紧要的命名参数的“smalltalk 模型”。

    所以我认为如果使用得当,你的设计是有意义的。

    【讨论】:

    • 虽然我不一定不同意“状态”与“功能”类的划分,但我确实觉得有必要指出,这是将 OO 带出 OO。
    • 我认为这种分离背后的总体思路是避免重载具有非核心功能的对象,而是将这些“函子”也视为类。
    • 我只会在字段/属性不是引用类型时使用结构。通过这种方式将数据作为参数传递,被调用的方法将获取数据的副本而不是引用(如传递类的实例)并且不能更改原始数据。所以在多个调用中重用同一个结构实例不会相互影响。结构的好例子可能是这样的:Vector(这是一组呈现向量的浮点数)
    【解决方案2】:

    请注意,这里有两个单独的问题。

    1. “类结构”类合理吗?

    2. 创建一个从方法返回多个值的类是否合理?

    类结构类

    一个对象类应该——在大多数情况下——代表一个真实世界的对象类。一个被动的、类似结构的 java bean(所有 getter 和 setter)可能代表一个真实世界的事物。

    然而,大多数现实世界的事物都有规则、约束、行为和它们参与的基本动词。类似结构的类很少能很好地匹配现实世界的东西,它通常是一些技术性的东西。这使得它不是理想的 OO 设计。

    一个方法的多次返回

    虽然 Python 具有此功能,但 Java 却没有。多个返回值不是 OO 问题,本身。这是一个克服语言限制的问题。

    多个返回值可能意味着一个对象已经改变了状态。也许一种方法会改变状态,而某些 getter 组会返回源自这种状态变化的值。

    【讨论】:

    • Python 并没有真正允许多个返回值,它把它包装成一个单一的类型,元组,并允许在一个语句中将元组/列表分配给多个变量。
    • @he_the_great:虽然如此,但这种区别是如此微妙,以至于在这种情况下几乎没有任何价值。这里的问题是将 OO 设计和 Java 限制混为一谈。 Python 是面向对象的,但对某些事情采取了不同的方法。
    【解决方案3】:

    说实话,我觉得这听起来不错。审稿人建议了哪些替代方案?

    遵循 OOP“最佳实践”,一切都很好,但您必须务实并切实完成工作。

    在某些情况下,使用这样的值对象(OO 代表“结构”)是一种完全合法的方法。

    【讨论】:

      【解决方案4】:

      通常,您需要将操作类所需的知识隔离到类本身中。如果你有一个这样的类,要么它在多个地方使用,因此可以在这两个地方承担一些功能,或者它在一个地方,应该是一个内部类。如果它以多种方式使用,但以完全不同的方式使用,例如没有共享功能,将其作为单个类是误导性的,表明没有共享功能。

      但是,这些一般规则可能适用也可能不适用通常有特定的原因,因此这取决于您的班级应该代表什么。

      【讨论】:

        【解决方案5】:

        我认为他可能会混淆“不是很 OOP”的错误做法。我认为他希望您提供几种方法,每种方法都会返回所需的 1 个值(因为无论如何您都必须在新类中使用它们,这还不错)。

        请注意,在这种情况下,您可能不应该使用 getter/setter,只需公开数据即可。不,这“不是很 OOP”,但却是正确的做法。

        【讨论】:

          【解决方案6】:

          也许 Josh Bloch 对此here 提供了一些见解。

          【讨论】:

            猜你喜欢
            • 2013-01-19
            • 1970-01-01
            • 1970-01-01
            • 2010-11-04
            • 1970-01-01
            • 2013-08-23
            相关资源
            最近更新 更多