Architecture 重建遗留应用程序的策略

Architecture 重建遗留应用程序的策略,architecture,com,legacy,legacy-code,Architecture,Com,Legacy,Legacy Code,我不久将有一项新任务,我将在.NETWPF中重新构建一些遗留的COM应用程序。如果可能,我需要重新使用功能或现有代码,但我怀疑这方面的范围是有限的 我需要复制现有功能,但需要使用现代的可扩展体系结构来实现它 有人对这类项目有什么一般性建议吗?这方面有什么好的资源吗 是否有任何经过试验和测试的技术或常见问题 最重要的是自动验证(也称为单元/功能测试)。请看。因为很多建议都是相似的 我的意思不是为新系统编写测试,我的意思是编写通过旧系统并将贯穿新系统的测试。这将是您验证是否已重新创建原始功能的方式。

我不久将有一项新任务,我将在.NETWPF中重新构建一些遗留的COM应用程序。如果可能,我需要重新使用功能或现有代码,但我怀疑这方面的范围是有限的

我需要复制现有功能,但需要使用现代的可扩展体系结构来实现它

有人对这类项目有什么一般性建议吗?这方面有什么好的资源吗


是否有任何经过试验和测试的技术或常见问题

最重要的是自动验证(也称为单元/功能测试)。请看。因为很多建议都是相似的


我的意思不是为新系统编写测试,我的意思是编写通过旧系统并将贯穿新系统的测试。这将是您验证是否已重新创建原始功能的方式。我认为,在一个已经存在的系统中,你可以很容易(尽管很乏味)以这种方式创建。

我认为一个常见的陷阱是试图修复未被破坏的东西。考虑一下如何在不重新发明的情况下重新使用现有软件。如果它已经存在很长一段时间,可能是因为它工作得非常好。您将面临一项艰巨的任务,即在不引入新bug的情况下匹配功能


再说一次,这可能是因为您的公司发展超过了这个遗留系统。想一想为什么要重新设计这个系统,以及旧的东西有哪些限制需要解决。

请记住,在部署新重新设计的系统时,您很可能需要将整个数据堆从旧的转换或移植到新的。考虑一下这一点,因为如果你不做的话,那份工作可能会变得和你的改写一样大。如果转换得不好、不可靠或不高效,从第一天起就可能毁掉你的新系统,即使功能已经到位。

Michael Feathers:介绍了一些使用和替换遗留代码的技术。我觉得它很可读;有些方法(以及许多黑客)对我来说是新的。

仔细考虑你的目标。你只是对替换COM基础感兴趣吗?您是否也要更改数据库实现(例如,从索引到SQL?)屏幕(从GUI到Web?)

如果这是一个非常小的应用程序,那么完全可以手工重写它。如果它的大小适中,则可以修改现有的应用程序(可能是用其他等效方案替换COM设施)。如果这是中到大型的,您实际上将无法在合理的时间范围内可靠地重写或修改它

对于这种大规模的更改,您可能需要考虑自动化更改。可在此处找到用于实现此类更改的工具:。使用DMS,为一个具有800 K SLC C++代码的客户, 我们实现了大部分C++到C语言的翻译,用等价的C语言工具替换了COM接口(通过一个鸟笼管理来拖动该项目的3/4的方式,尽管其接近完整性使译者产生了兴趣)。
当你这样做的时候要考虑一件事:关注应用程序的现代化而不改变功能。通常,管理层无法抵御范围蔓延(“好吧,既然我们在这里,就让我们改变应用程序吧…”),这是通往灾难的道路。请记住,做出所有导致当前更改的更改都花费了数年时间。

我目前正在做几乎完全相同的事情

我能给出的最重要的建议是重新规范系统。如果对你将要交付的东西没有一套新的期望,你将被束缚在旧系统的标准之下。这些标准不可能很好,否则你就不会重写它

从使用当前系统的人员中确定他们实际想要实现的目标,并构建该目标,而不是直接的端口。从长远来看,所有参与的人都会过得更好


除此之外,在此过程中不要尝试添加功能。在重新构建应用程序之后,您将有机会获得此机会。做端口时,没有什么比接受与现有功能相矛盾的新需求更糟糕的了。

作者是Michael Feathers——否则我同意这本书很好,但它专门涉及测试遗留代码,而不是从头开始重写它的技术,完成了-我参与了从“规范”重写一百万行代码程序(4GL和C的混合):既不便宜也不快,结果令人怀疑(需要再次重写才能获得理想的结果)。此外:移植遗留代码并不总是完成的,因为系统不符合当前的要求,作为改变/改进的前奏。有时进行移植是因为以下平台已过时且维护成本高昂,但您的软件系统仍然具有很大的价值。IT行业依赖的验证过程完全是动态的、非常不完整的、没有充分依据的(即通常进行测试的方式)对其产品质量来说是灾难性的。BDD有利于验证(来自Wikipedia:“我们是否在尝试做正确的事情?”,即产品是否符合用户真正的要求?),但在验证方面却很弱(“我们是否制作了我们试图制作的东西?”,即产品是否符合规范?)。我知道,流行的方法鄙视规范,但我认为他们误解了规范是什么。我同意规范是非常有效的,但它们是活生生的东西。到目前为止,我遇到的大多数非当前规格都是在IT中,相当于石碑。随着更合适的工具的出现,用与软件本身相同的代码对它们进行编码的当前方式将消失。