最近我越来越对在项目代码库中出现的问题感到沮丧。
我正在开发一个有超过100万行代码的大型Java项目。接口和类结构设计得非常好,编写代码的工程师也非常熟练。问题是,在试图使代码更清晰的情况下,人们每当需要重用某些功能时就会编写Utility类,导致随着项目的不断增长,越来越多的Utility方法会出现。然而,当下一个工程师遇到相同的功能需求时,他无法知道某人已经在代码中的某个地方实现了Utility类(或方法),并在不同的类中实现另一个副本的功能。结果就是代码冗余和过多的具有重叠功能的Utility类。
是否有任何工具或任何设计原则,我们作为团队可以实施以防止Utility类的重复和低可见性?
示例:工程师A有3个地方需要将XML转换为String,因此他编写了一个名为XMLUtil的Utility类,并将一个静态的toString(Document)
方法放入其中。工程师B有几个地方需要将Document序列化为各种格式,包括String,因此他编写了一个名为SerializationUtil的Utility类,并有一个名为serialize(Document)
的静态方法返回一个String。
请注意,这不仅仅是代码重复,因为上面示例中的2种实现可能不同(比如一种使用转换器API,另一种使用Xerces2-J),因此这也可以看作是一个“最佳实践”问题...
更新:我想我最好描述一下我们目前的开发环境。 我们使用Hudson进行CI,Clover进行代码覆盖率检查,Checkstyle进行静态代码分析。 我们采用敏捷开发,包括每日会议和(可能不足的)代码审查。 我们将所有的Utility类定义在.util中,由于其大小现在已经有13个子包,在根(.util)类下大约有60个类。我们还使用第三方库,比如大多数apache commons jar和一些组成Guava的jar。
我相信如果我们让某人负责重构整个软件包,我们可以将公用程序的数量减少一半。我想知道是否有任何工具可以使这项任务更加节省成本,以及是否有任何方法可以尽可能地延迟问题再次发生。