这段时间,基于Java及Spring Boot的领域驱动基础框架myddd-java已经完成阶段性重构,以全新的状态在2022重新启航。
myddd-java是怎么来的
我在以前的文章中也解释过myddd-java的来源,myddd-java是我在2020年整理的一个基于DDD领域驱动的基础框架,它其实是来源于杨宇老师的dddlib框架。我曾在以前的公司中有多年使用dddlib的经验。
•基于dddlib,对它进行整理与适配,适配最新的Spring Boot•将基于maven的项目管理,更改为gradle。我个人现在更偏好基于Kotlin DSL的gradle来进行项目管理
在删除了dddlib中大部分与支撑DDD理念无关的子模块后,抽取了最核心的几个支撑模块,适配与支持了Spring Boot,完成了myddd-java最初的版本。
这便是myddd-java的来源。基于当时的这个框架,我完成了一个系统后端 前端的所有功能。
这个系统仍在使用,到现在为止仍非常稳定与可靠。
为什么要重构
有几个原因使得我一直在思考要如何处理这个基础框架
•最重要的一个原因是:dddlib中一些对ddd的实现的理念我个人并不是非常认同•在迁移dddlib代码过程中,没有迁移单元测试。一方面当时是没有想过太多太远的事,另一方面dddlib的单元测试是基于JUnit4的,我在后端使用的早已经是JUnit5•由于没有迁移单元测试,理所当然的没有对它使用SonarQube进行质量管控,这导致我对它的质量状态处于一种不可知的状态。
2021年,我在基于自己对ddd的理解之上,孵化了基于Kotlin与Vert.x的响应式领域驱动基础框架myddd-vertx。事实上,与myddd-java相比起来,myddd-vertx对ddd的实现更符合我个人的想法。
本来我打算不再维护myddd-java,只维护myddd-vertx,毕竟一个是野生的,一个是亲生的。而我个人确实更偏好myddd-vertx。
但考虑到主流肯定还是Spring Boot,myddd-java被接受的程度更高,会有更多人愿意用Java。所以我一直也保持着它对Spring Boot版本更新的连带维护。
但如上述几个原因所示,最终在2021年借助一个项目的机会,我决定基于myddd-java的长远考虑,对它进行重构。
做了哪些改变?
主要是在以下几个方面做了变更
删除了dddlib中几个不符合我个人想法的一些实现
dddlib中有一些实现从我个人的角度不太喜欢,包括:
1.对JPA和Hibernate的抽象有点多余2.IOC的概念集中在领域层中3.有一个utils模块类,提供了一些工具类的功能
因此,在重构中,做了如下变更:
1.删除了JPA与Hibernate的抽象,而是直接在基础设施层使用JPA就可以了
代码语言:javascript复制@Named
public class UserRepositoryJPA extends AbstractRepositoryJPA implements UserRepository {
@Override
public User queryUserByUserId(String userId) {
return getEntityManager().createQuery("from User where userId = :userId",User.class)
.setParameter("userId",userId)
.getResultList().stream().findFirst().orElse(null);
}
}
重构后,以JPA直接取代dddlib中的数库层抽象。
2.将IOC功能抽象为独立的子模块
对依赖倒转的需求,应该任何模块都存在,并非只有领域层。所以将它独立出来更合适。
3.基本上移除了utils模块的所有实现
我个人认为,在工具类上,并无重复制造轮子的必要。这方面有太多优秀的类库了,你只需要确定一个你喜欢的就好了。
比如我在myddd-java中引入的是google guava,这个框架中提供了足够的工具类。日后还准备引入Java中非常优秀的vavr的函数式辅助框架做为补充。
添加了基于JUnit5的单元测试
本来是想迁移单元测试,但考虑到做了大量修改,和迁移过来再修改比起来,还没有自己重新编写单元测试更快。
因此,这段时间,对所有模块都添加了必要的单元测试。
这保证了未来的任何更新与维护,都有足够的保障。
在myddd-java中,单元测试使用的JUnit 5 Mocktio 4 的搭配
纳入了SonarQube质量管控
因为有了单元测试,这使得用SonarQube来管制它的质量变得容易起来。
SonarQube质量报告
在做了上述变更后,myddd-java的代码量减少了一半以上。整体也变得更为可控。
进入2.x
为了保留对dddlib的尊重,并区分这个重构后的版本与原来版本的不同,我将myddd-java的版本号升级到了2.x。
从2.x开始,它不再是dddlib的修改版,而是会沿着自己的路持续的前进。
我个人也会同时保持对myddd-java以及myddd-vertx两个实现的不断优化与持续维护。
如果你想了解更多关于myddd的资讯,访问myddd的官网: https://myddd.org