AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

Eric Evans:领域驱动设计的实践

  • 2018-02-25
  • 本文字数:1263 字

    阅读完需:约 4 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

Eric Evans 在最近于阿姆斯特丹举行的 DDD Europe 2018 上做了主题演讲,他认为构建软件时,很重要的一点就是不断探索和练习。他非常青睐领域驱动设计(Domain-Driven Design,DDD)中策略模式,但是他发现真正有意思的是接受一个困难的领域,按照不同的方式进行推导分析,打破窠臼,尝试寻找新的理念,他还以“时间(time)”作为领域举了一些实际的例子。

Evans 是最早的 DDD 图书的作者,经历过很多的项目,在这个过程中,团队发现了领域中很多新的理念,并且能够基于发现的理念构建伟大的软件。但令人遗憾的是,很多项目他无法公开讨论,这些项目相关的业务可能具有保密协议(non-disclosure agreement,NDA),或者它们的领域本身就非常晦涩难懂,需要非常多的时间才能描述清楚。

通用子域(generic subdomain)指的是在很多的系统中都会看到的领域,Evans 发现这些领域很适合作为实践的起点,有些领域我们已经习惯了它们的运行方式,所以被我们长期忽略,它们尤为适合作为起点。他鼓励开发人员在这些领域花费时间去发现和探索新的想法,寻找为它们建模的新的可能性和新的方式。他认为,这是一个战术层面的练习,我们正在设计非常具体的东西,应该通过编码来尝试这些想法。他还指出,有一些真正的变化是非常重要的。在改善模型时,微小的增强非常重要,但是如果我们想要推倒重来的话,就必须要想好可行方案。

Evans 以 Joda-Time 为例进行了说明,这是一个用于时间领域的库,长期以来一直是 Java 程序员的标准工具,并且在进行了一些改善后,纳入了 Java 8。它十年来没有明显的变化,其中一个主要的原因就是对于大多数场景来说,它已经足够好了。因此,我们停止了寻找替代方案,我们非常习惯于使用它,忘记了可能还有替代的方案,甚至已经无法想到完成该功能的其他方式。这种状态被 Evans 称为“遗留性的盲目(legacy blindness)”。按照他的经验,几乎在每个项目中,在以不同的方式进行思考时,很大的一个障碍就是对当前领域的熟悉程度,如果遗留模型非常好的话,那这一点就更明显。打破这种盲目性的一种方式就是找一个具体的场景,展现遗留模型一些不合时宜的地方,并以此作为起点。

Evans 展现了 Joda-time 的几个例子,他据此在时间这个领域寻找新的视角和概念。其中一个样例就是为某个时间实例增加一个月,根据起始时间的不同,结果看起来会有一点诡异:

  • 为 2018 年 1 月 31 日增加一个月,将会返回 2018 年 2 月 28 日;
  • 为 2018 年 1 月 31 日增加两个月,将会返回 2018 年 3 月 31 日;
  • 为 2018 年 1 月 31 日增加一个月,然后对得到的结果再增加一个月,将会返回 2018 年 3 月 28 日。

另外一个具体的例子就是按照新的方式来计算美国感恩节假期的日期,也就是十一月份第四个星期四。他强调练习的目的并不是取代整个库,而是要摆脱对遗留系统的盲目性,在以更好的方式解决问题时,寻找新的理念和想法。

DDD Europe 2019 的计划已经启动,但是具体的日期尚未确定。

查看英文原文 Eric Evans: Practicing Domain-Driven Design

2018-02-25 18:002924

评论

发布
暂无评论
发现更多内容

React源码分析2-深入理解fiber

flyzz177

React

React源码解读之React Fiber

flyzz177

React

大厂前端面试考什么?

loveX001

JavaScript

每日一题之Vue数据劫持原理是什么?

bb_xiaxia1998

Vue

京音平台-一起玩转SCRM之电销系统

京东科技开发者

架构设计 系统 scrm 企业号 1 月 PK 榜 电销

SOA 和微服务有何区别?

江南一点雨

Java 微服务 springboot SOA

React源码解读之更新的创建

flyzz177

React

用javascript分类刷leetcode9.位运算(图文视频讲解)

js2030code

JavaScript LeetCode

React面试:谈谈虚拟DOM,Diff算法与Key机制

beifeng1996

React

前端二面经典vue面试题指南

bb_xiaxia1998

Vue

云原生人才培养计划2.0 之 消息产品「全家桶训练营」重磅来袭

阿里巴巴云原生

阿里云 云原生

React源码解读之任务调度

flyzz177

React

前端leetcde算法面试套路之回溯

js2030code

JavaScript LeetCode

2023前端二面常考面试题合集

loveX001

JavaScript

WWW 是否应该属于 URL?

devpoint

Cookie url SEO www

恭喜 OpenSergo 获得中国开源云联盟 2022 “优秀开源项目”

阿里巴巴云原生

阿里云 开源 云原生 OpenSergo

React源码分析4-深度理解diff算法

flyzz177

React

前端leetcde算法面试套路之堆

js2030code

JavaScript LeetCode

百度前端经典vue面试题整理

bb_xiaxia1998

Vue

从零开始实现一个Promise

helloworld1024fd

JavaScript

React源码分析3-render阶段(穿插scheduler和reconciler)

flyzz177

React

面试官:说说Event Loop事件循环、微任务、宏任务

loveX001

JavaScript

分布式是大数据处理的万能药?

jiangxl

前端高频react面试题整理

beifeng1996

React

让 Java Agent 在 Dragonwell 上更好用

阿里巴巴云原生

Java 阿里云 云原生

社招前端react面试题整理

beifeng1996

React

vivo 故障定位平台的探索与实践

vivo互联网技术

根因分析 聚类 K-Means 二阶指数

22道js输出顺序问题,你能做出几道

loveX001

JavaScript

react的jsx和React.createElement是什么关系?面试常问

beifeng1996

React

从零手写react-router

helloworld1024fd

JavaScript

前端必会手写面试题合集

helloworld1024fd

JavaScript

Eric Evans:领域驱动设计的实践_语言 & 开发_Jan Stenberg_InfoQ精选文章