为什么在Java中使用类作为结构不良实践?

时间:2008-11-23 18:14:20

标签: java oop class struct

我们最近进行了代码审核。我使用了其中一个类,以便我可以从/向方法返回/传递多种类型的数据。该类唯一的方法是getter / setter。团队的一名成员(我尊重他的意见)说,拥有这样的课程是不好的做法(而不是非常OOP)。那是为什么?

6 个答案:

答案 0 :(得分:14)

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

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

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

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

答案 1 :(得分:4)

请注意,这里有两个不同的问题。

  1. “结构式”类是否合情合理?

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

  3. 类似结构的类

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

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

    从方法中多次返回

    虽然Python有这个,但Java没有。多个返回值不是OO问题,本身。这是一个解决语言限制的问题。

    多个返回值可能意味着对象已更改状态。也许一种方法改变状态,一些吸气剂组返回源于这种状态变化的值。

答案 2 :(得分:3)

老实说,这对我来说听起来不错。评论员提出了哪些替代方案?

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

在某些情况下,使用像这样的值对象(OO代表'struct')是完全合法的方法。

答案 3 :(得分:1)

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

但是,这些一般规则可能适用或不适用的具体原因通常都有,因此这取决于您的课程应该代表什么。

答案 4 :(得分:0)

我认为他可能会因为不良行为而混淆“不是非常OOP”。我认为他希望你提供几种方法,每种方法都返回一个需要的值(因为你必须在你的新课程中使用它们,不管怎么说都不错)。

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

答案 5 :(得分:0)

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