张逸说

出口成张,逸派胡言

0%

在2018年第二届领域驱动设计中国峰会,我作为讲师做了一个领域驱动战略设计工作坊——再现具有实操价值的架构方案。在这个工作坊中,我将敏捷实践中的Inception与领域驱动战略设计结合起来,并引入Event Storming和用例场景分析等方法,带着大家一起糊了墙,玩风暴,算是满意地完成了战略设计的预期目标。在这次工作坊的参与者中,我欣喜地看到了业务同学的加入。这些业务同学敏锐的分析目光与业务感给我们的用例场景分析带来了极好的助力,也为整个工作坊增加了不少亮点。

我把整个工作坊分为了十个步骤,依次为:

  • 确定利益相关人
  • 确定业务期望和愿景
  • 对问题域的共同理解
  • 确定项目的业务范围
  • 确定业务流程
  • 史诗级故事和主故事
  • 运用用例分析场景
  • 通过边界识别限界上下文
  • 上下文映射
  • 领域架构

我选择一些重要步骤对整个工作坊做一个简单的回顾。

阅读全文 »

这是一幅奇妙的图,如你所见,画中的两只手各自画着对方,当我们明晓这样一种怪异的循环时,一瞬间,仿佛这张静止的画突然流动起来,而且是一种永恒的运动,作画的两只手似乎永远无法停止。正如《哥德尔艾舍尔巴赫》一书的作者侯世达在评价艾舍尔的这幅《画手》时提到的:

《画手》给我们提供了一个更紧凑的圈,这幅画中的每一只手都在画另一只手:这是个只包含两个阶段的怪圈。

侯世达在巴赫的音乐、艾舍尔的绘画以及哥德尔不完全定理中发现了“怪圈”这个概念。

所谓“怪圈”现象,就是当我们向上(或向下)穿过某种层次系统中的(这里,系统是音乐的调子)一些层次时,会意外地发现我们正好回到了我们开始的地方。有时我用“缠结的层次结构”这个词来形容出现怪圈的系统。

我在阅读《哥德尔艾舍尔巴赫》这本书时,改不了作为程序员的积习,尤其当我看到这幅令人震撼的《画手》时,我即刻从“怪圈”想到了“递归(Recursion)”。因为“递归”正是这样自身调用自身的编程技巧。当然,一段正确的递归程序,必须要有一个必定能够到达或满足的终止条件,否则就会像《画手》那样永恒地循环下去。程序术语称之为“死循环”。

阅读全文 »

软件复杂度的成因

Eric Evans的经典著作《领域驱动设计》的副标题为“软件核心复杂性应对之道”,这说明了Eric对领域驱动设计的定位就是应对软件开发的复杂度。Eric甚至认为:“领域驱动设计只有应用在大型项目上才能产生最大的收益”。他通过Smart UI反模式逆向地说明了在软件设计与开发过程中如果出现了如下问题,就应该考虑运用领域驱动设计:

  • 没有对行为的重用,也没有对业务问题的抽象。每当操作用到业务规则时,都必须重复这些规则。
  • 快速的原型建立和迭代很快会达到其极限,因为抽象的缺乏限制了重构的选择。
  • 复杂的功能很快会让你无所适从,所以程序的扩展只能是增加简单的应用模块,没有很好的办法来实现更丰富的功能。

因此,选择领域驱动设计,就是要与软件系统的复杂作一番殊死拼搏,以降低软件复杂度为己任。那么,什么才是复杂呢?

阅读全文 »

Java的类是自定义的引用类型,是对职责相关的行为与数据的一种封装,用以表现一种业务领域或者技术领域的概念。在不同的场景,类包含的成员可能有所不同,大体可以分为如下五类:

  • 数据类:可以视为是持有数据的容器,类的成员只包含了字段,以及与字段有关的get/set方法
  • 实体类:既包含了体现状态的字段,又包含了操作这些状态的方法
  • 服务类:只有方法(行为)没有字段(状态),可以理解为提供内聚职责的服务
  • 函数类:如果定义的公开方法只有唯一一个,可以理解为它封装的其实是一个函数,通常用匿名类或者Lambda表示
  • 工具类:只包含一系列静态方法,通常不支持对该类型的实例化
阅读全文 »

GitChat《领域驱动战略设计》作者,《软件设计精要与模式》作者,《架构之美》评注者,公众号@逸言 架构编码实践者张逸的知识星球。

  1. 每周一篇技术长文分享,主题包括领域驱动设计,面向对象设计,函数式编程,响应式编程,分布式与微服务架构,大数据,Java语言,Scala语言,职业规划,敏捷管理与技术实践。
  2. 开展以上相关主题的交流与问题答疑,并鼓励读者分享好文。优选文章与积极提问者将获得技术书籍赠送,包括我的签名书籍,我的GitChat书籍免费阅读码,红包等小礼品。
  3. 不定期提供免费线上微课,内容涵盖上述主题。

欢迎大家到我的星球做客,更重要的是让大家能看到你的真知灼见。本文即来自我在知识星球《DDD高端俱乐部》的回答。

问题:我对于领域模型如何表示始终还不太明白。按照Evans书里的说法,代码应当是领域模型的主要部分,文档、图表作为补充。另外一方面,领域模型应当是所有参与者都能够理解的,而我觉得用户不太可能去理解代码。

比如以Evans书里举的,可以超载10%这一点,书里是通过一个Strategy模式来表达这个知识,从程序员的角度看很清晰了,但是从用户的角度看,还是不太能够明白吧。

请教张老师如何看待这个问题?

阅读全文 »