java中如何聚合划分
java中如何聚合划分,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
关于聚合的概念,其中聚合中非根实体的判别,是依照其不能离开聚合根而单独存在,比如订单明细不能离开订单而存在,所以订单明细只属于订单聚合中的一个非根实体。
但我一直觉得还过于抽象,应该还有更严谨完善的判断方式。 所以,本文就一起来思考个案例:
案例背景
在一个资讯平台上,用户能登陆后发表文章,并阅读文章。所以,在一开始,两者的关系是这样的:
之后,来了一个新需求,说用户能够对文章发表评论,那么,评论这个实体,该如何设置呢?我们不妨思考一下:
评论必然是归属给一个文章的,至少目前需求来看是这样,所以评论离不开文章
评论必然也是一个用户发起的,评论也离不开用户
看起来有点棘手...不过总之评论肯定不能独立存在了。
如果按我之前文章中提到的,很有可能就会陷入上面的思考了,很有可能会认为评论应该是"文章的评论",所以评论应该是隶属于文章聚合的。
设计分析
但怎么看都觉得别扭啊!非常别扭!但按之前的规则来说,应该是这么回事呀,问题出在哪呢?
我们来思考:评论是如何创建的?产品流程如下:
用户在文章下方的评论框中输入评论,点击提交
那么代码上顺利成章应该就是这样:
Comment comment = commentFactory.create(newCommentRequest);
但如果要强行用文章聚合的设计方案,就会非常别扭了:
//既然聚合根是文章,那么肯定要先找到文章,再给文章加入评论 Blog blog = blogRepository.getById(newCommentRequest.getBlogId()); blog.addComment(newCommentRequest);
当然,"别扭"一词还不够严谨,换用一个更严谨的说法:
评论虽然与文章有关,但其创建过程并不是发生在文章的各项生命周期的操作中的,而是独立创建的,所以,它应该是一个新的独立的聚合
具体说来:文章有创建,编辑,审核,删除等等操作流程,但这个过程中,并不会产生评论,意味着,评论并不是文章生命周期中的直接衍生物,它虽然关联了文章,也关联了用户,但却是独立被创建,也有自己独立的生命周期(能被单独修改,单独删除)。
所以,关系图应该是
而相比之下,我们再看更常见的非根实体,比如用户登陆日志,订单变更日志,这些实体,其创建的过程,都是在用户登陆,订单各项操作的过程中被创建出来的,生命周期的一开始就和根实体强绑定。
所以,这次,我总结了以下几个原则,来判断一个实体,是否应该作为一个新的领域聚合的根存在,判断的优先程度由高到低是:
该实体的创建过程是否是完全独立的,而非依赖与其他某个实体的命令操作;
该实体是否能被单独进行删/该操作,而非比如伴随其他某个实体的命令操作而变动;
该实体是否有单独的列表视图,而非必须依赖其他某个实体的视图作为前置条件(比如订单日志必须要先找到订单);
其中,(2)(3)只是作为一个辅助参考,最关键的还是(1),如果(1)能遵守了,十之八九可以定义为一个独立的聚合了。
看完上述内容,你们掌握java中如何聚合划分的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!