代码之家  ›  专栏  ›  技术社区  ›  sblundy

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

  •  7
  • sblundy  · 技术社区  · 17 年前

    该应用程序由一个服务器WAR和几个分布在JAR中的富客户端组成。麻烦的是,它都在一个大的、毛茸茸的代码库中,一个>2k档案战争。每个JAR都有一个带有 main

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

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

    6 回复  |  直到 12 年前
        1
  •  8
  •   sblundy    17 年前

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

        2
  •  6
  •   Daniel Hiller    17 年前

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

    • 使用 用于分离项目(不要让其他任务干扰分离,因为您将需要整个sprint时间)
    • 使用 版本控制
    • 编写单元测试 之前
    • 使用 连续集成系统 (不管是自制的还是现成的)
    • 尽量减少当前更改集中的文件数(当必须撤消某些更改时,您将节省大量工作)
    • 始终使用依赖性分析工具 搬家班(我们在这方面有很好的经验 DependencyFinder
    • 花时间将包重组为合理的每个项目包集
    • 不要害怕更改接口,而是在工作区中拥有所有依赖的项目,以便获得所有编译错误
        3
  •  2
  •   Itay Maman    17 年前

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

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

        4
  •  1
  •   sblundy    17 年前

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

    COleDateTime const char*

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

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

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

        5
  •  1
  •   Yuval F    17 年前

    为了继续Itay的回答,我建议阅读 Michael Feathers' "Working Effectively With Legacy Code"(pdf) . 他还建议每一步都要经过测试。还有 A book-length version .

        6
  •  1
  •   Spencer Kormos    17 年前

    话虽如此,您肯定需要记录您的任务,每个较小的项目将完成什么,然后(正如这里多次提到的)测试、测试、测试。您需要在整个项目中进行测试,然后对项目的各个部分进行测试,这些部分将作为子项目结束。