我将为您提供重构LedgerSMB的经验。我们决定尽早做一些不同的事情,并且仍然按照您描述的方式做,但是没有很多胶合方法(顺便说一下,我们有一些胶合方法,只是没有很多)。
两个代码库的生活
LedgerSMB依靠两个代码库生存了大约5年,在淘汰旧代码库之前,还有更多的时间。原来的代码库真是恐怖。错误的数据库设计,Perl的构造像IS->some_func(\%$some_object);
和代码一样,确切地说明了为什么有时使用意大利细面条的隐喻(执行路径在模块之间,后面和语言之间蜿蜒,没有韵律或原因)。新的代码库通过将数据库查询移入存储过程,具有用于请求处理的更简洁的框架等来避免这种情况。
我们决定要做的第一件事是尝试逐模块重构模块。这意味着将特定区域中的所有功能移到新模块中,然后将旧代码挂接到新模块中。如果新的API是干净的,那没什么大不了的。如果不是新的API,那么事情就变得麻烦了,这就是在新API上加倍努力的邀请。
第二件事是,很多时候新代码必须访问旧代码中的逻辑。应尽可能避免这种情况,因为它会导致丑陋的胶合方法,但不能总是避免。在这种情况下,应尽量减少涂胶方法,并尽可能避免使用,但在必要时使用。
为了完成这项工作,您必须承诺重写特定区域中的所有功能。例如,如果您可以一次重写所有客户信息跟踪代码,则意味着从旧代码调用此代码的代码不难处理,并且可以最大程度地减少从新代码向旧代码的分发。
第二件事是,如果您拥有适当的抽象,则应该能够选择要调用的API级别以及如何保持该级别的清洁。但是,您应该考虑重写正在调用API的部分,以使它们也更加干净。
商业工具的许多领域都是不可简化的。您无法摆脱所有复杂性。但是,您可以通过专注于专门用于执行所需工作的干净API以及可建设性地利用该API的模块来进行管理。只有在考虑重写其余调用代码可能会更快之后,才应该使用Glue。