有过大量经验的开发者都知道的一个事实是,软件项目和架构极其容易腐化。在没有很好地管控下,无论采用 MVC 三层架构还是 DDD 的四层架构,代码的结构会在几个月内变得混乱不堪。
我曾经接手过一个项目,它的依赖关系非常混乱。比如之前的开发者常常将 DTO 中的 Request 等对象用于数据库、Redis 存储,为了偷懒,明显让架构的下层依赖了上层结构。我花费了大量的时间和精力进行了重构,并在每日 Codereview 强调包结构的重要性。另外,随着不熟悉项目的新人加入,也会造成一些代码的随意放置。
实际上可以让包结构检查作为自动化测试的一部分,从而节省技术 Leader 的管理精力。ArchUnit 是一个小型,简单,可扩展的开源Java测试库,用于验证预定义的应用程序体系结构和约束。
使用合适的包结构
在使用 ArchUnit 之前,我们需要讨论下一些常见的代码分包方式。鉴于微服务和单体下组织代码的背景不同,每种微服务的分包也不同,这里按照单体系统下的结构说明。
Java 应用项目中一般有两种组织代码的方式。一种是,按照 "大平层" 的风格,即将同一类代码放到一个包中,比如 Service、Repository;还有一种是按照业务模块划分,每个模块下有自己的 “大平层”。
另外,还有两种代码分层的方式。一种是