【问题标题】:Recommendations for migrating a legacy web app to a modern framework将旧版 Web 应用程序迁移到现代框架的建议
【发布时间】:2010-10-08 20:59:26
【问题描述】:

我目前正在为一家运行基于 Java Servlet 的遗留 Web 应用程序的公司做一些工作(该系统早于 JSP,尽管他们现在在构建新页面时使用它们)。代码库是一个大杂烩,因为它在一个过时的框架之上构建了大约 10 年。他们在代码库中几乎没有一致性(该应用程序多年来由不同的人开发,其中大部分不再在这里工作),没有 DRY 的概念(每个页面基本上都是从头开始创建的)很多不可读/神秘代码和一般来说非常不一致的基础设施。

由于我一直在这里工作,我一直在添加现代功能/尝试稍微清理代码库。我在我暴露的地方添加了一些 jQuery,通过输入验证引入了一些安全性,清理了一些模块以采用不显眼的 JavaScript 原则等。我在这里的工作是关于新模块,所以我不会接触到很多旧的模块逻辑。我试图在他们当前的基础架构下将最佳实践引入我的所有工作,但我不得不调用他们的许多旧代码以使我的东西保持一致。

他们已经到了考虑对系统进行大规模更新的地步。他们希望提高代码库的可维护性,并尝试转向某种现代框架/MVC 类型的应用程序。许多系统早于 XHTML,带有内联样式标记、javascript:function() 调用、无单元测试、早于 Hibernate 等。在 Servlet 中混合了 out.println html 生成和调用 jsp。

他们一直在研究的一些应用程序包括 Wicket、Struts、Tapestry 和可能的 Grails。问题是,迁移到其中任何一个都可能需要对已经在使用的系统进行大量重写,并且他们无法重新开始。

我的问题是:在保留现有业务逻辑的同时将诸如此类的遗留代码库迁移到更现代的框架的最佳方法是什么(重写已经过测试和工作的东西没有意义)。

正在考虑的一些想法包括:

  • 编写一个内部模板系统,可以与他们当前的基础设施一起工作(以一致的方式生成页面)

  • 将代码移植到 Tapestry 等框架(重用大量旧代码)

  • 使用现代框架从头开始重写系统,但从旧系统复制逻辑(如果可能)

  • 保持旧系统不变,只需更新前端页面以使其具有更现代的外观(可能最好考虑时间/金钱等)

在保持逻辑完整的同时,将遗留 Java Servlet 代码更新为现代框架(使用现代实践以方便维护、单元测试、DRY)的最佳方式是什么?

欢迎任何见解。

【问题讨论】:

    标签: java web-applications servlets migration


    【解决方案1】:

    这只是我的意见,因为我认为这个问题是人们支付昂贵的顾问来解决的问题(通常最终只是浪费钱!请参阅 thedailywtf.com 示例)。

    我认为它不值得完全重写,因为在重写过程中,您可能还必须维护原始应用程序*,因此重写将有一个移动的目标。更好的方法是在重构时还清代码债务——也就是说,实现一个简单的功能需要 2 倍、3 倍甚至 10 倍的努力,仅仅是因为以一种好的方式实现它涉及到重构堆。但是这种努力是必要的,因为这个应用程序所欠的债务很高,最终必须以某种方式偿还。

    可能会痛,但良药会痛。

    • 如果您有大量时间进行重写,即原始应用程序被冻结且未维护(甚至没有修复错误),那么它可能会完全重写到您认为合适的任何框架中。但我非常怀疑任何机构都会出现这种情况。

    【讨论】:

      【解决方案2】:

      几个月前我问了一个非常相似的问题,一些答案可能对你有用:

      What is the best way to migrate an existing messy webapp to elegant MVC?

      【讨论】:

        【解决方案3】:

        这类问题没有明确的答案,但我的主要建议是首先阅读该主题。阅读了解他们所谈论内容的人的书籍。

        例如,Code Complete (Steve McConnell), ch. 24 重构。

        • 保存开头的代码

        • 尽量减少重构

        • 一次重构一个

        • 在添加例程、类、修复缺陷时进行重构

        • 定义干净和丑陋代码之间的接口

        • ...

        您可以使用许多其他资源,包括印刷的和在线的。之后,如果您有更具体的问题,可以使用 SO 之类的网站获得比这个更有用的答案。

        【讨论】:

          【解决方案4】:

          彻底重构它,朝着一致的设计风格努力,作为将其移植到在精神上最接近最终风格的框架的初步准备。

          我所说的“重构”是指 - 在战略位置、单元和功能中引入测试,并依靠这些测试疯狂地工作以减少重复。

          【讨论】:

            【解决方案5】:

            最好的方法:使用现有的应用程序作为功能规范并从头开始构建新的应用程序(在有意义的情况下进行一些可能的剪切-粘贴重用或实际的类重用)。

            根据我的经验,尝试将编写不佳的遗留应用硬塞到新框架中,或尝试用优质代码“包装”垃圾代码只会导致从长远来看更难以维护且成本更高的东西。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-08
              相关资源
              最近更新 更多