Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将大型Java项目划分为更小的组件_Java_Refactoring - Fatal编程技术网

如何将大型Java项目划分为更小的组件

如何将大型Java项目划分为更小的组件,java,refactoring,Java,Refactoring,我们试图将一个大的代码库分离成逻辑模块。我想要一些关于工具的建议,以及你可能有过的关于这类事情的经验 该应用程序由一个服务器WAR和几个分布在JAR中的富客户端组成。麻烦的是,它都在一个大的、毛茸茸的代码库中,一个>2k文件的源代码树中。每个JAR都有一个带有main方法的专用类,但复杂的依赖关系很快就会陷入困境。并不是所有的事情都那么糟糕,良好的实践都得到了一致的遵循,并且有一些组件具有特定的任务。它只是需要一些改进,以帮助我们的团队在成长中扩大规模 每个模块都将在一个maven项目中,由父P

我们试图将一个大的代码库分离成逻辑模块。我想要一些关于工具的建议,以及你可能有过的关于这类事情的经验

该应用程序由一个服务器WAR和几个分布在JAR中的富客户端组成。麻烦的是,它都在一个大的、毛茸茸的代码库中,一个>2k文件的源代码树中。每个JAR都有一个带有
main
方法的专用类,但复杂的依赖关系很快就会陷入困境。并不是所有的事情都那么糟糕,良好的实践都得到了一致的遵循,并且有一些组件具有特定的任务。它只是需要一些改进,以帮助我们的团队在成长中扩大规模

每个模块都将在一个maven项目中,由父POM构建。这个过程已经开始将每个JAR/WAR移动到它自己的项目中,但很明显,这只会触及表面:每个应用程序JAR中有几个类,以及一个庞大的“遗留”项目和其他所有项目。此外,已经有一些单元和集成测试


不管怎样,我对工具、技术和一般建议很感兴趣,这些建议可以将过大且纠结的代码库分解成更易于管理的代码库。免费/开源是首选。

两条建议:您首先需要的是测试套件。第二个建议是分步工作

如果您已经有一个强大的测试套件,那么您就处于一个良好的位置。否则,我将进行一些好的高级测试(aka:系统测试)


高级别测试的主要优点是,相对少量的测试可以获得很大的覆盖率。它们不会帮助您锁定错误,但您不会真正需要它:如果您以小步方式工作,并且确保在每次更改后运行测试,您将能够快速检测(意外引入)bug:bug的根源在于代码的一小部分自上次运行测试以来发生了更改。

我将从您需要完成的各种任务开始

我最近面临着一个类似的任务,考虑到一个15年的代码库,这个代码库是由一系列彼此没有任何沟通的开发人员编写的(一个在项目中工作,离开,然后另一个被雇佣,等等,没有串扰)。结果是风格和质量完全不同

为了让它工作,我们必须隔离必要的功能,不同于装饰绒毛,以使其全部工作。例如,其中有很多不同的字符串类,一个人花了相当长的时间在
COleDateTime
constchar*
之间进行2k行转换,然后再转换回来;这是一段代码,用于解决与主要目标(将数据输入和输出数据库)相关的任务

我们最终要做的是确定这段代码实现的一个大目标,然后为此编写基本逻辑。当我们需要完成一项我们知道以前已经完成的任务时,我们找到了它并将其包装在库调用中,这样它就可以独立存在。例如,一个代码块激活USB设备驱动程序以创建图像;该代码不受当前项目的影响,但在必要时通过库调用进行调用。另一个代码块使用安全加密狗,还有一个查询远程服务器的数据。这些都是可以封装的必要代码。然而,绘图代码是在15年时间内完成的,这是一座疯狂的大厦,以至于在一个月的时间内在OpenGL中进行重写比试图找出其他人做了什么,然后如何添加到其中更好地利用了时间

我在这里有一点小小的想法,因为我们的项目是MFC C++到.NET C,但是基本原理适用:

  • 找到主要目标
  • 确定使主要目标成为可能的所有小目标
  • 隔离代码中已封装的部分(如果有),以用作库调用
  • 找出逻辑来把它拼凑起来

  • 我希望这有助于……

    看一看。它非常适合可视化依赖项,并显示依赖项,以便在构建更干净的结构的过程中打破依赖项。

    我们最近完成了一项类似的任务,即一个项目,由>1k个源文件组成,其中有两个必须拆分的主类。我们最终得到了四个独立的项目,一个用于基本实用程序类,一个用于客户端数据库,一个用于服务器(该项目是一个rmi服务器客户端应用程序),一个用于客户端gui。我们的项目必须分开,因为其他应用程序仅将客户机用作命令行,并且如果您意外使用任何gui类,则会遇到headless异常,只有在headless部署服务器上启动时才会发生

    根据我们的经验,需要记住以下几点:

    • 使用整个sprint来分离项目(不要让其他任务干扰分割,因为你需要整个sprint时间)
    • 使用版本控制
    • 在将任何功能移到其他地方之前编写单元测试
    • 使用连续集成系统(无论是自制的还是现成的)
    • 尽量减少当前更改集中的文件数(当必须撤消某些更改时,您将节省大量工作)
    • 在移动类之前,始终使用依赖性分析工具
    • 花时间将包重组为合理的每个项目包集
    • 不要害怕更改接口,而是在工作区中拥有所有依赖的项目,以便获得所有编译错误

      • 要继续Itay的回答,我建议阅读。他还建议每一步都要经过测试。还有。

        Maven允许您使用