我有一个与普通OOP相关的问题,而不是某种语言的问题。 我正在尝试一个简单的应用程序(在java中),我试图将其建模为现实世界的场景。 在重新分解时,我意识到我想出了一个简单的对象,它只有一个成员和一个被覆盖的等号和哈希码。
我的问题是......拥有这样的物体是不是很糟糕 (欢迎参考博客等)
答案 0 :(得分:1)
对于这种情况,不,因为这是在Java中重新定义散列数据结构中对象行为的唯一方法。
对于其他情况,可能有更好和更差的做法取决于它们是否有意义,例如,如果我想改变队列中对象的顺序,我宁愿实现自定义{{1而不是继承和覆盖Comparator
方法,特别是如果我的新比较例程对于对象不是“自然的”。
每种设计模式都有一些适合的案例和其他不适合的案例。
答案 1 :(得分:1)
简短回答:
拥有这样的对象是不好的做法
不一定,但这取决于具体情况。
更长的答案:
我有一个与普通OOP相关的问题,而不是某种语言的问题。我正在尝试一个简单的应用程序(在java中),我试图将其建模为现实世界的场景。
确实没有任何规则表明你应该这样做。事实上,我知道有不少人对这一陈述不以为然,Uncle Bob Martin就是一个人。它更多的是建模业务流程而不是模拟“真实场景”。我在过去尝试过这种方法,并且发现没有 - 或者几乎没有 - 从现实世界中严格地尝试对所有内容进行建模。如果有的话,我认为它会使你的应用程序变得更复杂,软件越复杂,维护就越难。
在重新分解时,我意识到我想出了一个简单的对象,它只有一个成员和一个被覆盖的等号和哈希码。
可能没问题,正如@Arseny已经说过的那样,ValueObject是一种众所周知的工作方式,尽管在编写代码时我通常不会得到很多。如果您的多个对象没有任何行为,这可能表示所谓的Anemic Domain Model,您必须小心(更复杂,没有明显的好处)。
你可以看出你是“做错了”(当然是变量值为“错误”):只看看协作者对你的ValueObject做了些什么,看看那里有什么类似于计算的东西它实际上属于对象本身。
但是,如果这是少数几个不包含任何行为的对象之一:嗯,是的,这种情况发生了,你可能不必担心它。我们必须看到一些代码在我们的答案中具有决定性。
答案 2 :(得分:0)
不,不错。广泛使用的Value Object模式和DTO模式也是如此。
答案 3 :(得分:0)
通常情况下,没有行为的对象会被视为气味。原因是如果它没有任何行为,那么它就不是一个对象。在为你的课程设计时,你应该问问题,"什么是课程负责?"。如果它没有任何行为,那么这是一个难以回答的问题。
这种情况很少见,就像Null Object模式一样。
http://en.wikipedia.org/wiki/Null_Object_pattern
我可能认为你班级的成员实际上应该是另一个班级的成员。 也可能是您的班级还有一些您尚未发现的功能。 当原始类型可以做的时候,你也可能过分重视这个概念。
有许多设计OO系统的技术,这里有一个原始的: http://en.wikipedia.org/wiki/Class-responsibility-collaboration_card