我们最近进行了代码审核。我使用了其中一个类,以便我可以从/向方法返回/传递多种类型的数据。该类唯一的方法是getter / setter。团队的一名成员(我尊重他的意见)说,拥有这样的课程是不好的做法(而不是非常OOP)。那是为什么?
答案 0 :(得分:14)
有一种观点认为类应该是“数据结构”(即,专注于存储没有功能的数据)或“功能导向”(即,专注于在存储最小状态时执行某些动作)。如果你遵循那个论点(这是有道理的,但并不总是那么容易),那么就没有什么不妥。
事实上,人们会争辩说bean和实体bean本质上就是 - 带有getter和setter的数据容器。
我已经看到某些来源(例如,书籍“干净的代码”)认为应该避免使用具有多个参数的方法,而是将它们作为具有getter和setter的单个对象传递。这也更接近命名参数的“smalltalk模型”,其中顺序无关紧要。
所以我认为如果使用得当,你的设计才有意义。
答案 1 :(得分:4)
请注意,这里有两个不同的问题。
“结构式”类是否合情合理?
创建一个类来从合理的方法返回多个值吗?
类似结构的类
对象类应该 - 在大多数情况下 - 代表一类真实世界的对象。一个被动的,类似结构的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提供了一些见解。