DDD下的代码文档生成

一、背景

目前低代码生成领域非常火爆,而且市场价值在逐步上升,很多巨头都在重金投入。低代码的出现意味着程序员可以从大量重复低效的劳动中脱离出来,同时可以更好更快的支持业务解决实际问题,极大的提高了交付价值的效率。那么在DDD中实际上也有一些人尝试使用低代码的方式进行建模,意图将建模过程程序化,自动化,通过模板或者预设脚本得到建模结果。本章内容则重点讨论DDD下的代码文档生成的意义,以及这种思路将带给我们什么启示。

二、观点

2.1 观点1–手动构建

很多研究DDD的人都会遇到这个问题–是否使用低代码来降低建模成本。有些资深大佬已经在这个问题上做了一些探索,但是效果并不好,另外一方面在进行建模的时候如果已经通过有效的方式进行建模的话那么手动构建则是最优选项。
究其原因则是DDD在建模过程中是动态调整的,建模产物也不是一成不变的。建模出来的衍生物(模型,数据库表,接口文档)也只是在某一阶段能表达业务语义。在长时间的迭代过程中通过程序化构建的产物则显得有点鸡肋。主要表现为模型陈旧,api固化导致的改动成本增加。
最后的自动化构建问题来自于对服务,工程的挑战,由于实体模型的不断变化,领域在业务迭代的变化导致工程包,模块,接口等都处于动态迭代中。最直接的表现就是重构会随时发生,那么代码生成很快会跟不上这种节奏。强行根据数据库模型或者实体模型进行自动化构建所得到的产物对当前需求来说可能并不能像第一次构建那样高效,同时这也慢慢偏离了DDD文档构建的初心。所以很多大佬比较支持手动构建模型,在这个过程中领域专家,产品,程序员都可以从中获得业务更深层次的信息。

2.2 观点2–借助代码生成

在低代码领域很多人都有过一些尝试,包括我,而且还因此得过季度奖金。但是在DDD领域进行低代码尝试对于大多数开发者来还是很有挑战的,毕竟重复的劳动需要工程化。借助低代码平台融合DDD的理论其实也不是很难。针对DDD的核心概念进行领域,子领域,上下文等的构建解决了上手DDD的难度。
在DDD代码生成这里有个大佬已经身体力行的做了一些事情,就是Martin Fowler大神的著作《领域特定语言》。这本书从领域出发来阐述如何做一个基于DDD和通用语言的代码生成工具。比较现实的是实现成本还是很高的。大多数情况下我们达不到大佬的水准。
当然,这不意味着DDD的代码文档生成就解决不了,ContextMapper的整个解决方案基于Java 工具类和插件模式来做代码生成,核心策略就是基于上下文图模式做领域模型,实体模型的构建。另外还有很多其他大牛在探索基于DDD的代码文档生成,但是目前看来还有很长一段路走才能更加成熟。

三、代码生成产品

3.1 UBML

https://gitee.com/ubml/ubml-impl

3.2 ContextMapper

https://developer.aliyun.com/article/771374?utm_content=g_1000251254

3.3 携程契约系统

https://mp.weixin.qq.com/s/4suazm8Z3dheq9jO9g0bjQ

3.4 COLA

这里简单介绍一下COLA 代码生成是基于整个项目骨架的,只生成DDD相关的包结构,至于建模还是需要其他方式。

四、DDD下的低代码意味着什么

这里我通过携程的契约系统作为引子来阐述DDD下的低代码可以为我们带来什么,这种低代码与一般的低代码产出的内容是不一样的,这里产出的是领域模型,领域文档,相关领域图,从业务角度出发而沉淀出的内容。

4.1 工程提效

通过DDD的低代码产出的模型可以复用共享,同时更高维度的领域上下文,子领域,上下文图也都非常清晰。在开发业务前端系统,中后台系统都可以对领域对象中的字段,模型,数据流进行追溯。新需求在融合已有系统中会更加便捷,当我们面临与领域,模型相关的需求变更时我们可以更容易也更快地做一些调整。这些都基于我们已经将不同业务线的业务领域和通用的业务领域都摸清了,有沉淀的文档,领域模型,而且是可视化的,可追溯的。
很多时候模型复用并不代表领域服务可以复用,如果一个领域内有很多微服务在支持,同时这些微服务都有自己的数据库。而在业务发展,服务迭代的过程中很多服务慢慢都变得僵化,没有流量。如果没有建立服务画像的话这些服务依然是一种比较鸡肋的存在。从领域的角度来说这是不是意味着我们的领域不够精简,我们的服务是不是只能拆分不能合并,是不是无法形成领域内的服务能力。
这里再回头看携程的契约系统,这个系统从模型的角度出发很明显的在DDD下的代码文档生成走出了第一步,而且有了一些原始业务模型数据的积累。

4.2 资产构建

上面说了DDD下的低代码可以对工程提效,那从更长远和更深层次的角度考虑一下,当我们有了这些领域模型,领域上下文关系,我们是不是可以对数据库模型进行梳理,是不是可以建立大数据的元数据积累,基于这些模型我们可以很快地建立起数据中心的能力,同时基于数据资产做数据分析更好的辅助业务发展。

4.3 业务扩展

在业务扩展方面,这里主要说明的是我们在DDD下的低代码可以帮助业务发展过程中一直站在领域的角度去考虑问题。在已有领域模型和文档的情况下业务扩展和调整都有理可依。在迭代开发的时候我们可能会遇到一些下面的问题:

  1. 上游加个字段对下游是否有影响,需要下游支持怎么办
  2. 上游多个客户端要接入下游存在模型冲突怎么办
  3. 新需求进来是单拉一个库还是单拉一个服务
  4. 在团队合作开发的时候这个功能点,模块在你这边实现合适还是我这边实现合适
  5. 领域内的模型需要扩展支持更多业务功能需要怎么兼容当前业务

这些都是经常遇到的问题,更直接的解决方法就是我不管什么领域,什么模型,来个需求我就评估下改动点,工作量,上下游接口。但是我们大多数的时候并没有从领域层面去关注这些细节带来的改变,从而不能有计划有针对性的去梳理整个业务流程,领域服务和模型。

4.4 总结

关于DDD下的低代码探索实际上可能不是那么有趣,但是我们依然可以得到很多经验。

我这边今年已经完成了DDD整个概念和实战体系相关的内容,如果想要了解更多请关注公众号:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DDD设计是一种以领域(Domain)为核心进行软件开发的方法论,它强调将业务逻辑与技术实现分离,将复杂的业务领域进行划分,提高代码可维护性和可扩展性。对于代码目录结构来说,它应该贴近领域,分层清晰明确,具有可读性和可维护性。以下是一个典型的DDD设计代码目录结构: 1. Application层:作为上层代码,包含应用程序的核心逻辑和业务流程。它与领域模型紧密耦合,负责传递外部请求给领域层进行处理。 2. Domain层:包含业务领域模型,它是整个系统的核心,负责处理业务逻辑和持久化数据。该层包含实体(Entity)、值对象(Value Object)、聚合(Aggregate)、工厂(Factory)、仓储(Repository)等领域模型元素。 3. Infrastructure层:为领域层提供支持和依赖,负责与外部基础设施(如数据库、缓存、日志、消息队列等)进行交互。该层使用一些开源框架和库实现技术实现。 4. Interface层:为外部应用提供服务的接口,它包含Web API、消息MQ、命令行CLI等。该层只负责接收请求和返回响应,没有具体业务逻辑和数据操作。 另外,对于DDD设计来说,最重要的是领域模型,设计好领域模型代码目录结构的基础,其次是业务逻辑分层清晰,职责分明,分离关注点,降低代码复杂性。代码目录结构应该根据实际需求进行调整,可以遵循DDD的规范,也可以自定义一些目录结构。最终目标是使代码的维护成本更低,提高代码质量和开发效率。 ### 回答2: DDD领域驱动设计)是一种软件开发设计思想,它注重领域模型的设计以及实现,能够有效地减少软件开发过程中的复杂性和不确定性。在DDD中,代码目录结构应该与实现的模型和领域架构相匹配,以确保模型的可维护性和代码的可读性。最常见的代码目录结构如下: 1.应用程序:应用程序处理业务逻辑,是与用户交互的入口。在应用程序中,通常有控制器、命令或事件处理程序等。这些应该按照模块或功能对其进行结构化组织。 2.领域层:实现领域模型,是相对独立的。在实现领域模型时,可以将其分组到例如聚合根、实体、值对象、仓库、服务等目录下。 3.基础设施:这一层包含与基础设施相关的实现,比如说持久性、第三方库、工具等。基础设施应该像一个插件那样工作,不应该改变领域层或应用程序设计。 4.界面层:显示用户界面以及处理用户输入,连接应用程序与实际用户。界面层通常有几个子目录,例如视图、控制器、资源等。 总的来说,DDD的目录结构应该先设计好领域模型,在此基础上组织代码和目录。这可以确保代码的复用性、可扩展性,并且使得代码更具有可读性、协同性等。 ### 回答3: DDD设计(领域驱动设计)是一种软件开发的方法论,主要强调对领域进行高度抽象与模型化。在进行软件开发时,良好的代码目录结构能够更好地组织和管理代码,提高代码的可读性和可维护性。 DDD代码目录结构一般可以分为三层:应用层、领域层和基础设施层。 应用层:主要负责应用程序的生命周期和交互,包括用户界面、任务调度、服务间通信等。应用层应该只是一些简单的委托工作,具体的业务逻辑应该放在领域层。 领域层:这一层是DDD设计最核心的部分,需要对领域的核心问题进行建模,提供相关的领域服务和领域模型。重点在于对业务逻辑和领域模型的设计和实现,需要进行充分的领域建模和领域分析。 基础设施层:基础设施层主要提供对第三方库和框架的封装,以及对数据库、缓存、日志等底层服务的提供和管理。这一层不应该直接与领域相关。 总之,DDD代码目录结构应该从领域建模和业务逻辑的设计出发,充分实现领域驱动设计的思想,同时兼顾代码的可维护性和可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值