我有一个与一般 OOP 相关的问题,而不是特定于语言的问题。我正在尝试一个简单的应用程序(在 java 中),并且我试图将它建模为一个真实世界的场景。在重构时,我意识到我想出了一个简单的对象,它只有一个成员和一个覆盖的等号和哈希码。
我的问题是....拥有这样的对象是一种不好的做法吗(欢迎引用博客等)
我有一个与一般 OOP 相关的问题,而不是特定于语言的问题。我正在尝试一个简单的应用程序(在 java 中),并且我试图将它建模为一个真实世界的场景。在重构时,我意识到我想出了一个简单的对象,它只有一个成员和一个覆盖的等号和哈希码。
我的问题是....拥有这样的对象是一种不好的做法吗(欢迎引用博客等)
对于这种情况,不,因为这是在 Java 的散列数据结构中重新定义对象行为的唯一方法。
对于其他情况,根据它们是否有意义,可能会有更好和更差的处理方法,例如,如果我想更改队列中对象的顺序,我更愿意实现自定义Comparator
而不是继承和覆盖compareTo
方法,特别是如果我的新比较例程对于对象来说不是“自然”的。
每个设计模式都有一些适合的情况和不适合的情况。
简短的回答:
拥有这样的对象是一种不好的做法吗
不一定,但这取决于上下文。
更长的答案:
我有一个与一般 OOP 相关的问题,而不是特定于语言的问题。我正在尝试一个简单的应用程序(在 java 中),并且我试图将它建模为一个真实世界的场景。
确实没有任何规则说明您应该这样做。事实上,我知道有不少人不赞成这种说法,鲍勃·马丁叔叔就是其中之一。它更多的是对业务流程进行建模,而不是对“现实世界场景”进行建模。我过去曾尝试过,发现严格地尝试对现实世界中的所有事物进行建模并没有或几乎没有任何好处。如果有的话,我认为它会使您的应用程序更复杂,并且软件变得越复杂,维护起来就越困难。
在重构时,我意识到我想出了一个简单的对象,它只有一个成员和一个覆盖的等号和哈希码。
可能没问题,正如@Arseny 已经说过的那样,ValueObject 是一种众所周知的工作方式,尽管我在编写代码时通常不会得到很多。如果您的多个对象没有任何行为,这可能是所谓的贫血域模型的指示,您必须小心(更复杂但没有明显的好处)。
你可以找出你是否“做错了”(当然,变量值是“错误”):看看合作者对你的 ValueObject 做了什么,看看那里是否有任何类似于实际属于的计算到对象本身。
但是,如果这是少数不包含任何行为的对象之一:嗯,是的,这种情况发生了,您可能不必担心它。不过,我们必须看到一些代码才能在我们的回答中得出结论。
通常,拥有一个没有行为的物体会被认为是一种气味。原因是如果它没有任何行为,那么它就不是一个对象。在设计班级时,您应该问诸如“班级负责什么?”之类的问题。如果它没有任何行为,那么这是一个很难回答的问题。
罕见的例外是空对象模式。
http://en.wikipedia.org/wiki/Null_Object_pattern
我可能是您班级的成员实际上应该是另一个班级的成员。也可能是你的类有一些你还没有发现的功能。也可能是您在使用原始类型时过于重视概念。
设计 OO 系统有多种技术,这里是其中一种原始技术: http ://en.wikipedia.org/wiki/Class-responsibility-collaboration_card