由参加领域驱动设计大会与自己所想的

简介: 2017首届领域驱动技术大会一直是我非常期望的,要非常感谢右军赠送的门票能够让我领略大会风采。 这届大会组织者非常用心,组织了非常多的话题可供探讨,确实大会的内容给我带来的感觉是震撼的,我之前对领域的了解也仅从《领域驱动设计》以及《实现领域驱动设计》这两本书中有过学习,以及在实现微服务生态体系的过程中有过一些接触。

2017首届领域驱动技术大会一直是我非常期望的,要非常感谢右军赠送的门票能够让我领略大会风采。

60f34648eb2292cdd505166c4192155fbbfc5259

这届大会组织者非常用心,组织了非常多的话题可供探讨,确实大会的内容给我带来的感觉是震撼的,我之前对领域的了解也仅从《领域驱动设计》以及《实现领域驱动设计》这两本书中有过学习,以及在实现微服务生态体系的过程中有过一些接触。

在大会的整个进程中,听了很多老师不同主题的演讲,让我印象极为深刻的还是:张逸老师的《Bounded Context的实践意义》、腾云老师的《DDD-没那么难》。下面我将分别结合这二个议题谈谈我自己的一些想法。

Bounded Context(限界上下文)的实践意义

478dc76210461e231957f50ef1333a1a4aa613ae

(因为光线和距离的原因照片可能不清晰,望大家见谅)


首先我们先来解释一下,什么是限界上下文。

《实现领域驱动设计》这本书中解释到:限界上下文是一个显式边界,领域模型便存在于边界之内。在边界内,通用语言中的所有术语和词组都有特定的含义,而模型需要准确地反映通用语言。

用一段更形象的语言来描述:我们每天都去上班,上班的时候会换乘地铁,我从8号线下车,换乘2号线,然后再去换乘10号线,这样最终到达某一个地点,结束上班这个过程。在这个过程中,8号线、2号线和10号线都可以理解为不同的限界上下文,我们中间换乘的动作可以理解为领域事件,而我们最终的目标是为了上班,这个就是关键事件,我们上班就是在不同的上下文中切换。

我们还可以把上下文理解为一个模块,一个系统、一个应用或者一个服务。在我看来,限界上下文的存在对微服务的划分是有重大意义的,但是限界上下文不是新的概念,早在SOA时代就已经存在,只是当时在企业应用的时候并没有将SOA和DDD过多的联系在一起,不知道还有多少同学知道板桥里人(彭晨阳)的,早在2008年的时候在他的json网站中就已经对SOA和DDD的关系做过一些解释:

SOA服务是在松耦合组件分离后的再次打包,而Evans DDD则是一把切断组件关系的利刃。从这个方面看,DDD应该是更基础平台,万丈高楼平地起啊,而DDD是对象方法论集大成,集合分析模式和设计模式

通过当时的文章和解释我们不难看出实际上在SOA中更多的是使用DDD的OO来取代数据库分析设计,SOA是粗粒度的服务化打包,而DDD则是一把斩断粗粒度的利刃。正如这次大会张逸老师一句玩笑的话所说,正因为微服务拯救了DDD,通过这句话可以看出微服务的提出是真正的将DDD给与结合在了一起,而微服务的细粒度的服务与DDD本身的理念也是契合,从而达到了互相发展的境界。

张逸老师在这次演讲中深入探讨了几个关键词:康威定律,逻辑边界和物理边界,切断数据库的耦合、识别上下文的方法等等,能够明显的感觉出来,DDD也在发展也在和微服务和互联网领域不断的演进。

DDD-没那么难

b252888be251d2b9833d14d144dc52b29e41ef33

腾云老师的分享更多是在实践过程中的总结,首先谈了数据驱动与领域驱动的不同点,表格如下:

1d7416364fdd3356ab17ba5de4d03d83841b3205

我记得在2010年以前,研发人员和产品聊完需求后第一步就是要使用PowerDesigner画数据库表结构图,根据数据库表结构图倒推项目架构,后面DDD开始推广以来,慢慢的由UML图开始逐渐占用主导地位,现在表结构图已经成为架构设计的补充。

在DDD中常见二种设计模型,分别是贫血模型和充血模型。

  • 贫血模型

贫血模型是指领域对象里只有get和set方法,仅包含状态(属性),不包含行为(方法),采用这种设计时,需要分离出DB层,专门用于数据库操作。

cc8455545221bc8e90d35763152de59d2411bbf9

从图中可以看出领域层的职责很弱,领域对象只是用来充当数据存储的对象。

但是这种模型整体架构清晰,自上而下单向连接。

远程访问接口 -> Facade接口 -> Service服务 -> 领域层 -> DAO -> 数据库

  • 充血模型

充血模型是贫血模型的相对定义,在这个模型中领域层的作用较大,不再是get和set方法的集合,而是将部分业务逻辑以及持久化的操作集成在内,如下图所示:

bf907cb136a0338646573f019781849cebc6a56e


这种模型的调用关系则变成了:

应用层 -> Facade接口 -> 领域层 -> 基础设施层

其实这样的好处就是与领域对象相当的业务逻辑封装在对象内部,biz或者service层只需要调用对象进行简单的业务组装即可,不像贫血模型那样所有业务都集中在biz层或者service层中造成非常沉重难以拆分,但充血模型比较难以设计,需要有一定经验的设计师前期规划好,后期工作才能事半功倍,不然则会造成项目混乱。

在分享中腾云老师还做了实体和值对象的讲解,下面我将这二者的区别以表格的方式列出来供参考:

5f2d09dd385b0ed235e496cce7028ee69f29b56d

看到这里让我突然想起一个故事来:

有一对双胞胎,他们出生的时候,长得一模一样,以至于爸妈都分不清,不得已他们在双胞胎的脖子上系个项链来标记:谁是老大?谁是老二?其实这个“标记”就可以看作是实体的标识,只不过是用项链来标识的。

有一天小镇要统计双胞胎的分布情况,然后调查人员来到他们家,问他们爸妈:“你们家里有没有双胞胎?几对双胞胎?龙凤胎?还是。。。”,然后他们爸妈就报上:“一对双胞胎-两个小子”,然后调查人员就做了笔记走了。在这个过程中,他们丝毫没有提及双胞胎脖子上的“项链”。

这也就是实体和值对象的根本区别:实体不仅需要知道它是什么?而且还需要知道它是哪个?而值对象只需要知道它是什么就可以了。

小结

夜已深,文章写到这里,我想也应该可以结束了,大会的内容非常丰富,在这里只是把我看到的、听到的,结合我自己的一些想法看法总结出来,文章难免有些地方比较偏面还望大家海涵。


原文发布时间为:2017-12-13

本文作者:小程故事多@简书

本文来自云栖社区合作伙伴“中生代技术”,了解相关信息可以关注“中生代技术”微信公众号

相关文章
|
3月前
|
人工智能 自然语言处理 安全
多AI聚合的五个常见误区:你以为的“交叉验证”可能只是“重复犯错”
本文剖析多AI聚合系统五大常见误区:盲目追求数量、迷信“少数服从多数”、误信数据天然独立、将分歧视为缺陷、幻想彻底消除幻觉。强调模型独立性、分歧价值与用户主动判别才是发挥聚合效能的关键。
342 5
|
3月前
|
存储 人工智能 Java
【Spring全家桶】Spring AI核心原理、大模型集成、Prompt工程、RAG实现、AI Agent开发(附《思维导图》+《面试高频考点清单》)
Spring AI是Spring生态面向生成式AI的官方框架,以“抽象即自由”为核心,提供统一API、多厂商模型支持(OpenAI/Anthropic/Ollama等)、RAG、Agent及向量存储集成,让Java开发者零门槛构建生产级AI应用。
|
3月前
|
SQL 人工智能 数据可视化
AI编程工具性能实测:口语驱动编码迭代表现对比
本文实测对比Claude Code与TRAE SOLO在口语驱动编码(vibe coding)中的性能表现,聚焦SQLAlchemy建模与原生SQL查询两大真实场景。结果显示:TRAE初版代码质量更高、迭代轮数更少(1–2轮 vs 2–3轮)、中文需求理解更准、可视化回退容错更强,且基础版永久免费,综合适配国内Python/数据库开发高频迭代需求。(239字)
362 0
|
4月前
|
缓存 监控 安全
CC攻击技术特征解析及防护措施
在互联网高速迭代背景下,CC攻击作为应用层DDoS变种,以高隐蔽性、低成本、强针对性持续消耗服务器资源,导致服务瘫痪。本文深入解析其原理、特征及“网络层过滤+应用层识别(如SCDN、验证码)+业务层优化+实时监控”四维防护体系,助力精准防御。(239字)
|
机器学习/深度学习 数据采集 自然语言处理
深度学习实践技巧:提升模型性能的详尽指南
深度学习模型在图像分类、自然语言处理、时间序列分析等多个领域都表现出了卓越的性能,但在实际应用中,为了使模型达到最佳效果,常规的标准流程往往不足。本文提供了多种深度学习实践技巧,包括数据预处理、模型设计优化、训练策略和评价与调参等方面的详细操作和代码示例,希望能够为应用实战提供有效的指导和支持。
1097 0
|
Rust 前端开发 JavaScript
用 Rust 打包网页生成很小的桌面 App
Pake 支持 Mac / Windows / Linux 系统,常用包下载、命令行一键打包、定制开发。
1203 0
|
机器学习/深度学习 算法 搜索推荐
Featurewiz-Polars:基于XGBoost的高性能特征选择框架,一行代码搞定特征选择
Featurewiz是一个强大的特征选择库,提供高度自动化的特征选择、全面的特征工程功能,并实现了高效的mRMR算法。它已成为许多数据科学家的首选工具,拥有140多篇Google Scholar引用。最新版Featurewiz-Polars通过集成Polars引擎,在处理速度和大规模数据集处理能力上显著提升。
500 2
Featurewiz-Polars:基于XGBoost的高性能特征选择框架,一行代码搞定特征选择
|
人工智能 Prometheus 监控
容器化AI模型的监控与治理:确保模型持续稳定运行
在前几篇文章中,我们探讨了AI模型的容器化部署及构建容器化机器学习流水线。然而,将模型部署到生产环境只是第一步,更重要的是确保其持续稳定运行并保持性能。为此,必须关注容器化AI模型的监控与治理。 监控和治理至关重要,因为AI模型在生产环境中面临数据漂移、概念漂移、模型退化和安全风险等挑战。全面的监控涵盖模型性能、数据质量、解释性、安全性和版本管理等方面。使用Prometheus和Grafana可有效监控性能指标,而遵循模型治理最佳实践(如建立治理框架、定期评估、持续改进和加强安全)则能进一步提升模型的可信度和可靠性。总之,容器化AI模型的监控与治理是确保其长期稳定运行的关键。
|
数据采集 域名解析 安全
溯源反制技战法
溯源反制技战法
|
小程序 前端开发 定位技术
微信小程序-常用的视图容器类组件
该内容是关于微信小程序组件的分类和部分具体组件的介绍。主要分为9大类:视图容器、基础内容、表单组件、导航组件、媒体组件、地图组件、画布组件、开放能力和无障碍访问。其中详细讲解了`view`、`scroll-view`、`swiper`及`swiper-item`等组件的用途和示例。`view`用于构建页面布局,`scroll-view`支持滚动效果,`swiper`则用于创建轮播图。此外,还提到了`root-portal`、`page-container`等其他特殊用途的组件。
602 0