重构/重新设计大型系统

时间:2013-12-31 08:06:36

标签: java architecture refactoring

我目前正在重新设计一个用struts 1.3 / PostgreSQL和Hibernate编写的系统。

该系统是作为MVC系统构建的,其中JSP / Actions中的表示逻辑具有View Logic,EJB具有业务逻辑。

他们使用Hibernate作为映射层,但是有些区域仍然使用JDBC函数,这些函数在其中编写了大量业务逻辑

系统有大约800k行代码。

虽然最初的想法是在动作类和JSP中只有基于视图的逻辑,但在Actions和JSP中也存在大量的业务逻辑。

数据库列的每个要求都有不明确和重复的列,刚刚添加了列。这在选择数据时对应用程序产生了令人讨厌的影响,两个不同报告中的相同数据项可能会显示不同的值。

没有JUnit测试用例,文档也适中。

在某些领域,我设法从JSP的/ Action层中删除业务逻辑,并将它们带到EJB层。

然而,我的问题是在哪里开始重构的理想位置,

首先在JSP的/ Actions中重构代码然后转移到EJB来重新设计逻辑并最终转移到DB?

或者是从数据库开始,重构数据库然后进入堆栈?

从企业业务逻辑层开始并重构业务逻辑吗?

我应该从哪里开始,我的方法应该是什么。我现在正在阅读Martin Fowler的书籍以及关于重构和重新设计的大量文章。但我真的很感激一些指导。

5 个答案:

答案 0 :(得分:2)

我首先要添加单元测试。我会使用这些来确保在重构​​之后仍然有效。这将允许您进行更重要的更改。

我还会关注你打算工作的区域。在您处理这些代码时,提高可测试性和设计。即使这部分功能要求。

答案 1 :(得分:1)

首先 - 祝你好运。

应用程序大小(800KLOC)非常重要,因此您需要提出一种分区方法。

第一个问题是“重构的目的是什么?”。您是否已达到应用程序的可维护性难以管理的程度,修复一个错误只会暴露其他3个错误?你想扩展应用程序,你发现它太贵了吗?应用程序性能是否受损?

我问这个问题是因为有了这么大的项目,确保你的方法能够解决你面临的实际问题非常重要。例如,如果您决定开始为整个应用程序编写单元测试,那么在很久以后它可能无法帮助您解决性能问题。如果将业务逻辑移出视图层,则添加新功能可能会有所帮助。

一旦你知道目标是什么,定义客观,理想可衡量的标准,告诉你已经实现了目标。例如,“单元测试覆盖率> 80%”; “没有超过7的圈复杂度的方法”,“代码审查覆盖率> 80%”。使用自动代码分析工具(如Namal Dinesh Ubhayawa建议,Sonar非常好),代码审查工具(我们使用Crucible)和任务跟踪解决方案(我们使用Jira) - 将这些粘合在一起你可以看到项目是否朝着正确的方向发展。我是information radiators的忠实粉丝,一眼就能看出发生了什么。

您需要为您的重新设计项目制定分支/合并策略 - 您也可以将其作为重新设计完成后用于发展项目的策略。当你在这里时,我会投资Continous Delivery - 你从构建,部署和测试应用程序中获得的即时反馈非常有价值。

接下来的问题是“应用程序是否存在逻辑结构,无论是在技术解决方案还是业务领域?”。你有一个MVC架构的水平分区 - 是否有垂直分区?再次,正如Namal Dinesh Ubhayawa建议的那样,选择一个可管理的,自包含的应用程序子集,并从上到下完成该模块,将很快显示您是否在正确的轨道上。

一旦您同意了要开展工作的模块,请创建一个发布计划。为自己设定一个目标,并使用你为此目标开展的任何开发过程。尽可能使目标具体:

  

该团队将于2月15日前发布新版本的产品信息模块。该版本将符合我们的0 P1缺陷的质量标准,< 5个P2缺陷,< 15个低优先级缺陷。单元测试覆盖率为x,代码审查覆盖率为y。没有方法会具有圈复杂度> ž。视图层中没有业务逻辑,数据模型将标准化为第3范式“。

根据您的目标跟踪您的进度 - 考虑到您的应用程序的大小,您将需要多个版本,并了解在给定时间段内您可以完成多少工作将帮助您进行规划。

最后 - 问问自己应用程序如何进入它所处的状态。根本原因是什么?考虑使用5 whys protocol。很多时候,我发现糟糕的应用程序设计和实现是非技术压力的副作用。如果企业说“我们不关心质量,只需完成它”,那么无论开发人员有多好,你都会得到糟糕的代码。如果您没有消除这种压力,您的重构/再造项目可能会失败。

答案 2 :(得分:1)

感谢所有花时间通过回答上述问题来支持我的人。我知道这有点晚了,但我相信我需要解释一下这个过程和路径。

  • 确定系统的关键操作/功能区域
  • 确保我使用Selenium测试套件进行自动功能测试
  • 确保可以使用Jenkins自动部署系统
  • 根据可以使用Jenkins测试/构建和发布每个子系统的操作区域,打破系统是宏级子系统
  • 开始将宏子系统打破为微服务(使用Spring Cloud / Spring Boot / Eureka Service Registry / Zuul / SideCar等)。
  • 开始删除他的EJB
  • 在我们中断服务时升级每项服务中的技术堆栈
  • 开始使用PostgreSQL本身对数据库进行分段

目前我们正处于数据库细分过程中,我们仍然有更多的服务需要创建和清理,但到目前为止,情况有了很大改善。如果有人需要更多关于我们的架构决策,设计考虑因素或我们面临的挑战的信息,请给我发邮件,我会提供我能提供的任何信息。

答案 3 :(得分:0)

我建议明智地划分你的应用程序功能/模块并重新分配模块。例如     用户注册模块     搜索模块     报告模块     安全等 在开始重构之前,您应该清楚地了解当前的实现业务逻辑和大局。如果可以的话,它也会让你的工作轻松自如 1.使用Jprofiler或您的工具包来分析您的应用程序。这是跟踪调用路径,识别长时间运行的方法 2.将当前代码库与Sonar集成以查找代码级问题。 http://www.sonarqube.org/

答案 4 :(得分:0)

我建议您考虑使用最新版本的Struts / JSP从头开始重新编写它,而不是尝试清理现有代码。

1:我首先决定是否要先使用PostgreSQL或其他数据库。要问的示例问题是:如果您的公司已经拥有支付和维护的Oracle等数据库,您可能需要切换到它。

2:接下来,让DBA尽可能正确地使用规范化,索引,外键约束,视图,存储过程等从头开始重写数据库。他不必一次重写整个模式。他可以从项目开始时需要的主要表开始,并在进入下一个编码任务时添加更多表。此任务适用于精通数据库设计而非Java开发人员的人员。您的数据库是在您的Web应用程序及时更换或变形为其他内容后很长时间内保持不变的基础。它需要是正确的。

3:将部分或大部分数据从旧数据库迁移到新数据库,而不会违反新数据库中添加的约束。将迁移脚本存储在某处,以便可以定期重新运行。

4:使用Hibernate编写数据库层。有些实用程序会分析数据库模式并为您编写Hibernate而不是手动编写。禁止任何人使用原始JDBC。 Hibernate使用缓存/延迟加载。 JDBC会干扰(脏读等问题)。

5:分析业务逻辑/ JSP页面,以确定其尝试完成的业务规则并创建自己的代码。不要将旧代码移到行上,因为它可能不完整/经过深思熟虑。