14

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

4

6 回答 6

14

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

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

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

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

于 2008-11-23T18:25:14.067 回答
4

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

  1. “类结构”类是否明智?

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

类结构类

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

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

一个方法的多次返回

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

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

于 2008-11-23T19:43:08.373 回答
3

老实说,这对我来说听起来不错。审稿人提出了什么替代方案?

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

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

于 2008-11-23T22:22:36.257 回答
1

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

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

于 2008-11-23T18:23:23.807 回答
0

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

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

于 2008-11-23T18:30:51.107 回答
0

也许 Josh Bloch在这里对此提供了一些见解。

于 2008-11-23T18:56:31.103 回答