首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构/重新设计大型系统

重构/重新设计大型系统
EN

Stack Overflow用户
提问于 2013-12-31 16:06:36
回答 5查看 461关注 0票数 0

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

系统采用MVC体系结构,JSP/ Actions中的表示逻辑具有视图逻辑,EJB具有业务逻辑。

他们已经使用Hibernate作为映射层,但一些领域仍然使用JDBC函数,其中包含大量的业务逻辑

该系统大约有80万行代码。

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

对于每个需求,数据库列都有不明确和重复的列,这些列是刚刚添加的。当挑选数据时,这对应用程序有一个糟糕的影响,在两个不同的报告中相同的数据项可能会显示不同的值。

没有JUnit测试用例,文档一般。

在某些方面,我已经设法将业务逻辑从JSP的/ Action层中移除,并将它们带到EJB层。

然而,我的问题是,从哪里开始重构才是最理想的,

它是不是首先重构JSP/ Actions中的代码,然后转移到EJB中重新设计逻辑,最后转移到DB?

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

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

我应该从哪里开始,我的方法应该是什么。我现在正在阅读Martin Fowler的书和许多关于重构和再工程的文章。但我真的很感激你能给我一些指导。

EN

回答 5

Stack Overflow用户

发布于 2013-12-31 16:19:26

我会从添加单元测试开始。我会用这些来确保在你重构之后,工作的东西仍然可以工作。这将允许您进行更重要的更改。

我也会把重点放在你无论如何都要努力的领域上。在处理这些代码段时,改进它们的可测试性和设计。也就是说,使这部分功能需求。

票数 2
EN

Stack Overflow用户

发布于 2013-12-31 20:27:43

首先,祝你好运。

800KLOC的应用程序大小不是微不足道的,因此您需要想出一种方法来对其进行分区。

第一个问题是“重构的目的是什么?”您是否已经到了应用程序的可维护性难以管理的地步,修复一个bug只会暴露出另外3个bug?你想要扩展应用程序吗?你是否发现它太贵了?应用程序性能是否受到影响?

我之所以这样问,是因为对于如此大的项目,确保您的方法解决了您面临的实际问题是很重要的。例如,如果您决定开始为整个应用程序编写单元测试,可能要到很久以后才能帮助您解决性能问题。如果将业务逻辑移出视图层,可能对添加新功能没有太大帮助。

一旦你知道目标是什么,定义目标,理想情况下可衡量的标准,来告诉你你已经实现了。例如,“单元测试覆盖率> 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。任何方法都不会有圈复杂度> z。视图层中将没有业务逻辑,数据模型将被规范化为第三范式。

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-08-29 07:28:35

感谢所有花时间通过回答上述问题来支持我的人。我知道现在有点晚了,但我认为我需要解释我所走的过程和道路。

  • 确定系统的关键操作/功能领域
  • 确保我使用Selenium测试套件进行了自动化功能测试
  • 确保系统可以使用Jenkins EJB自动化部署
  • Break系统是宏级子系统根据操作区域可以测试/构建和发布使用Jenkins
  • Started将宏子系统作为微服务(使用Spring Cloud / Spring Boot / Eureka Service Registry / Zuul /Eureka

移除EJB的代码<>H113升级了技术在每个服务中堆栈,因为我们中断了services

  • Started使用PostgreSQL本身

对数据库进行分段

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20854041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档