2010-07-30 55 views
3

我刚读这篇文章在这里:http://hamletdarcy.blogspot.com/2008/04/10-best-idea-inspections-youre-not.html,特别是最后一点让我想起了我的代码,具体的建议:公共静态方法 - 一个坏迹象?

在世界上什么是公共方法,你的对象有做不依赖于对象内的任何字段?这当然是一种代码味道。问题在于检查的“自动修复”是应用静态关键字。真是没有。这不是你想要做的。不依赖于对象状态的公共方法不可能是具有明确表述的对象的一部分。它只是没有凝聚力,应该放在别的地方。所以:如果该方法是私人的,接受自动修复,但如果该方法是公开的,则不要。

有问题的代码本质上是一个对象变换器。它需要一个类型为A的对象并将其转换为不同的类型。

我的层次结构是这样的:

接口ObjectTransformer - > GenericObjectTransformer

,然后在下面这个,GenericObjectTransformer由ObjectTransformerA和ObjectTransformerB扩展现在

,由两个ObjectTransformerA和ObjectTransformerB需要的一些功能,但实际上并不依赖GenericObjectTransformer的任何实例变量,因此它是GenericObjectTransformer中的受保护静态方法。

这是否违反了上述规则?显然这是受到保护而不是公开的,但它仍然是一种与班级本身无关的班级以外的方法?

有什么想法?

+0

使用受保护的静态方法时,一定要将它们标记为最终。当人们认为自己是虚拟的时候,很容易混淆人们,当他们绝对不是。并始终限定(将超类名称首先)从你的子类调用它们。 – 2010-07-30 13:24:51

回答

5

我不同意你拉的节选。

不依赖对象状态的公共方法不可能是具有明确表示的一个对象的对象的一部分。它只是没有凝聚力,应该放在别的地方。所以:如果该方法是私人的,接受自动修复,但如果该方法是公开的,则不要。

只是因为一种方法是静态的,与状态无关,并不意味着它属于“低凝聚力”范畴。内聚力/功能性不是基于状态。

当您试图确定凝聚力时,请考虑整个类的作用,而不仅仅是实例变量。如果您正在查看的逻辑与通用概念(GenericObjectTransformer)相关,则将其留在那里。

如果是计算月球轨道或者海洋深度将其移至公用事业类别(本领域的另一个臭味区域)的例程。

0

它感觉有点不洁,但似乎优于我能想到的替代方案。

我认为原来的

公共无任何依赖性 在对象上状态的方法不可能是有一个明确规定 包租对象的一部分 。

你提到的太黑白了,你的情况更加灰暗。

通过使用受保护的方法,您可以很好地记录其旨在供派生类使用的方法。如果你没有把它放在基类中,那么很有可能它必须进入一些ObjectTransformUtility类。这是赢吗?更多的文物,更多的地方看。

一个想法:如果你的ObjectTransormer类经历了重大变化,那么你有多大可能需要改变这些效用方法。毕竟,如果他们的业务是再次运作物体的界面,那么实际上他们的凝聚力非常高。

相关问题