我目前正在重新设计一个用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的书籍以及关于重构和重新设计的大量文章。但我真的很感激一些指导。
答案 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)
感谢所有花时间通过回答上述问题来支持我的人。我知道这有点晚了,但我相信我需要解释一下这个过程和路径。
目前我们正处于数据库细分过程中,我们仍然有更多的服务需要创建和清理,但到目前为止,情况有了很大改善。如果有人需要更多关于我们的架构决策,设计考虑因素或我们面临的挑战的信息,请给我发邮件,我会提供我能提供的任何信息。
答案 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页面,以确定其尝试完成的业务规则并创建自己的代码。不要将旧代码移到行上,因为它可能不完整/经过深思熟虑。