Java反模式名称?包含对象的对象包含...等

时间:2012-11-05 08:46:14

标签: java refactoring anti-patterns

是否包含包含......等对象的对象的名称或特定规则。我正在使用一个复杂的系统,通常有5-10层深的物体。我听到为什么要这样做的一个原因是一次性将大量数据从服务器传递到客户端,有更好的方法吗?

编辑:它似乎是一些反模式的组合。应该清理域模型,并且下面的反模式是气味:火车残骸模式,Everything but the kitchen-sink map

4 个答案:

答案 0 :(得分:7)

我不知道这种对象树的名称。但是一个众所周知的反模式是 Train Wreck Pattern ,当代码使用过多的方法链时会发生这种模式。

objA.getChildB().getChildC().getChildD()....getChildZ().performSomeAction();

包装所有

是一个很好的经验法则
.getChildC().getChildD()....getChildZ().performSomeAction();

进入

的方法
objA.getChildB()

我们称这个方法为performSomeActionDeepDownTheObjectTree()

答案 1 :(得分:5)

这看起来像一个变坏的域模型(不是反模式名称,BTW :)它源于一种错觉,即有一个明确定义的域模型。实际上,问题域的一些方面可以优雅地建模,但在更精细的细节层面上,例外情况和特殊情况下的特殊情况都有例外情况,每个情况都特定于单一服务方法,这破坏了这种优雅。

许多嵌套对象的出现通常是将域模型“磨平”到更精细粒度的连续过程的结果,希望每个实例变量可以在不同的上下文中重用。有一个突破点,重用每个域属性的教条式命令只是停止有意义。

我的出路是停止尝试创建一个适合所有人的域模型,并使用专门为每个服务调用设计的对象。这些对象可能依赖于一些明确定义的域对象,但是以不干扰其他服务调用的方式单独添加任何特定信息。

答案 2 :(得分:3)

这个术语是“面向对象”,其中通过定义对象类来将大型复杂问题分解为更小的问题,每个对象都封装了问题的一小部分。对象交互的方式是通过消息传递,对象通过从包含它们的对象开始,找到传递消息的其他对象。

问题越大越复杂,您需要做的工作就越多,将其分解为可管理的部分,因此您获得的对象层数就越多。有时小的简单问题会被严重分解为大量的对象,但这并不会使对象本身成为一种反模式。


  

主要问题在于,数据对象通过嵌套变得过大,并且包括无关紧要的数据。示例:您正在对鸟类进行分类,而不是简单的鸟类对象,您会收到一只物体鸟,包含羽毛,喙,可能的寄生虫,空气,可能的栖息地,可能是食物类型,食物类型包含水果,昆虫,蠕虫,种子,种子包含橡树,榆树,蓟,可能的动物,天然种子等等 -

Everything but the kitchen-sink map反模式可能是最贴合的。

  

鉴于一个包含许多复杂规则的复杂过程,所有内容(业务逻辑,相关和不相关的过程等)都会被推入到地图中。

解决此问题的最佳方法是使用过滤操作,您可以在其中指定类似interface BirdList extends Iterable<Bird> {}的强类型接口,并且查询系统提供的实现由足够的数据支持,以支持该接口。

您的API可以提供许多不同的界面,例如BirdListBirdFeedingHabitMapBirdNestingHabitMap等。客户可以提供他们需要的界面列表,查询系统会分析它们,获取数据,并使用proxy classes组装一个以类型安全的方式公开查询结果的实现类。

答案 3 :(得分:2)

  

包含包含...等对象的对象

被称为列表,完全没问题;)

但是你是对的,方法调用的长序列完全没有问题,而且代码味道很干净,称为不恰当的亲密关系

不恰当的亲密关系可以increase coupling, decrease cohesion,违反law of demeter和规则tell, don't ask

参考文献:如果您查看这些条款,您会发现许多答案的幻想。特别好的是Cohesion and Coupling和书籍Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin