通过AOP或其他自动化手段重构令人讨厌的遗留系统?

时间:2009-10-09 03:49:51

标签: architecture refactoring aop legacy postsharp

我最近一直在玩PostSharp,它让我想起了几年前我遇到的一个问题:客户的开发人员已经制作了一个Web应用程序,但是他们并没有考虑如何管理状态信息 - 在IIS中的应用程序实例上存储它(不要问我原因)静态。不用说,该系统没有扩展,并且存在严重缺陷和不稳定性。但这是一个庞大而复杂的系统,因此重新开发它的成本令人望而却步。我当时的简要介绍是尝试重构代码库,以便在组件之间实现适当的解耦。

当时我尝试使用某种抽象机制来拦截对静态资源的所有调用,并将它们重定向到一个能够正确管理状态数据的组件。问题是大约有1000个复杂的引用被重定向(我没有太多时间去做)手动编码(即使使用R#)被证明太耗费时间 - 我们取消了代码库和正确地重写了它。重写需要一年多的时间。

我现在想知道的是 - 如果我可以访问程序集重写器和/或面向方面的编程系统(例如PostSharp),我可以轻松地自动执行查找直接引用的重构过程并将它们转换为接口引用可以自动重定向并由工厂提供。

有没有人使用PostSharp或类似的系统来恢复病态遗留系统?这些项目有多成功?你有没有发现这个努力是值得的?你会再做一次吗?

更新: 有关详细讨论,请参阅this博文。

1 个答案:

答案 0 :(得分:4)

你想要的不是AOP,而是program transformation系统,它推广了AOP。这允许人们定义一组对代码库的自动修改,并可靠地执行它们。你不要手工修改1000个复杂的引用;相反,你想方设法如何定义一个处理所有情况的转换,让工具可靠地为你应用它。

我不能代表您的网络应用程序,但我有两个具体的例子,我已成功应用它。

1)波音需要彻底重组多达6,000个组件,每个组件编码为一组协作的C ++类(通常总计3-10K SLOC),从传统的分布式架构到每个通信元件成为CORBA方面的功能的组件。用我公司的 DMS Software Reengineering Toolkit,一个能够准确转换C ++的程序转换系统,我们实现了一个工具来执行这些更改。该工具平均修改了一行三行,但可以在大约5分钟内转换一个组件。由此产生的转换完成了98%,并且需要一些适度的修饰,但是比估计的1个人月更有效地手动修改每个组件。 这最好被认为是工具实现的软件结构的大规模重新架构。 您可以在技术论文中阅读相关内容:

Akers,R.,Baxter,I.,Mehlich,M.,Ellis,B.,Luecke,K.,案例研究:通过自动程序转换重新设计C ++组件模型,信息&软件技术49(3):275-291 2007.可从出版商处获得。

2)美国空军拥有飞行的遗留系统。其中之一是B-2轰炸机,它充满了世界上最好的1975年微处理器。在这些代码中运行的代码是JOVIAL,这是空军在Ada成为受欢迎的语言之前所青睐的语言(在每个人都躲避之前,现在只有军队可以考虑使用可怕的语言进行软件工程)。代码运行飞机。 OTOH,他们需要摆脱JOVIAL,因为对微处理器的支持(例如,CPU的物理可用性,开发工具,甚至是愿意学习JOVIAL的人)都在迅速减少。我们使用相同的DMS为它们构建了一个JOVIAL-to-C转换器,并且完成了100%的转换,而无法看到原始代码(黑色程序......) 有关其他详细信息,请参阅B-2 bomber conversion。 B-2正在升级 我们说话时使用转换后的软件。

现在,两个案例都需要一些手动时间来配置转换。但与手工完成工作的估计成本相比,配置工作量很小。

所以,是的,如果您了解如何使用它们,这些工具非常,是的,我们绝对打算再次使用它们。