3

我刚刚在这里阅读了这篇文章:http: //hamletdarcy.blogspot.com/2008/04/10-best-idea-inspections-youre-not.html,最后一点特别让我想到了我的代码,具体建议:

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

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

我的层次结构是这样的:

接口 ObjectTransformer -> GenericObjectTransformer

然后在此之下,GenericObjectTransformer 由 ObjectTransformerA 和 ObjectTransformerB 扩展

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

这是否违反了上述规则?显然这是受保护的而不是公共的,但它仍然是一个可以从类外部访问的方法,与类本身无关?

有什么想法吗?

4

2 回答 2

5

我不同意你摘录的摘录。

不依赖于对象状态的公共方法不可能成为具有明确规定的章程的对象的一部分。它只是没有凝聚力,应该放在其他地方。所以:如果方法是私有的,接受自动修复,但如果方法是公共的,那么不要。

仅仅因为方法是静态的并且与状态无关,并不意味着它属于“低内聚”类别。凝聚力/功能不基于状态。

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

如果计算月球轨道或海洋深度是例行程序,则将其移至实用程序类(我们领域的另一个臭味区域)。

于 2010-07-30T13:17:34.977 回答
0

感觉有点不干净,但似乎比我能想到的替代品更可取。

我认为原来的

不依赖于对象状态的公共方法不可能成为具有明确规定的章程的对象的一部分。

你的参考太黑白了,你的情况更灰暗。

通过使用受保护的方法,您可以很好地记录它旨在供派生类使用。如果你不把它放在基类中,那么大概它必须放在一些 ObjectTransformUtility 类中。那是胜利吗?更多文物,更多看点。

一个想法:如果您的 ObjectTransormer 类发生重大变化,那么您需要更改这些实用程序方法的可能性有多大。毕竟,如果他们的业务是针对对象的接口工作,那么实际上他们的凝聚力是相当高的。

于 2010-07-30T13:20:27.707 回答