在项目中引入领域驱动设计的经验

Chris Patuzzo近期在一次演讲中介绍了领域驱动设计(DDD)的原则,并结合一个基于Ruby on Rails的真实项目进行讲解。在这次项目之前,Chris所在的团队为重新设计公司的主营网站所做的两个概念验证都因为可伸缩性方面的问题而失败了。因此,业务主管部门决定在这一次尝试中采取一种更为敏捷的、增量式的方法,他们受到了DDD的启发,在这次重启的开发过程中全力促进开发者与领域专家的交流。

\\

Patuzzo是Which?的技术主管。在他看来,DDD的要点是捕捉到业务的概念,软件的构建需要围绕着对业务的理解而展开。在这次项目重启的过程中,开发者开始学会与领域专家进行深入交流,以试图理解整个业务的实际行为。在此基础上设计出合适的领域模型,并找到系统中存在的各个边界。按Patuzzo的经验来看,在具有清晰的边界划分的系统中开展工作要轻松许多。通过保持关注分离,系统将更易于理解,如果之后需要将系统中的某些部分提取出来,实现起来也会更简单。

\\

DDD建议将问题分解为多个层,每一层各司其职,例如表示层、领域层以及基础设施层。Patuzzo特别提到在进行Rails开发时存在着一种常见的实践,即将领域层与基础设施层合并在一起,这种方式显然违背了DDD的建议。除了分层架构外,另一种选择是由Alistair Cockburn定义的多边形架构(Hexagonal architecture),但Patuzzo并不强烈主张这种架构风格,他认为这种架构可能会令人迷惑。他表示,这些架构有助于管理系统的复杂度,保持对核心领域的专注,但他也承认这些思想对于Ruby社区来说还比较新鲜,需要一定的时间去适应。

\\

衡量复杂度的一种方式是计算对象间的交互,通过使用聚合与聚合根,可以将这种交互限制在聚合之内,以及聚合根之间的交互,从而将这种交互的频率减至最低。Patuzzo将其称为系统的表面区域。Ruby项目通常会使用活动目录(Active Record)这种设计方式,因此每个类都表现为全局的常量,可以在系统中的每一处随意访问。为了绕开这个问题,开发者通常会用聚合的名称作为类名的前缀。通过将系统功能分解为聚合,使对象间的通信显得更为结构化。这种新的设计方式对于团队来说确实引入了一个陡峭的学习曲线,这一部分在开发过程中所产生的分歧也是最大的。但在项目的回顾会议中,Patuzzo对于最终的结果表示很满意。

\\

Patuzzo在总结中表示:虽然全新的开发过程为开发者带来了一些负担,但好处也很明显。开发者学到了DDD的基本模式与思想、如何将架构分解为多个层、关注分离的思想、以及如何设计一个能够应对变化的系统。由于新系统是基于一个能够充分表现业务需求的模型而建立的,因此他相信他的团队将能够更好地满足新的需求。

\\

查看英文原文:Experiences Introducing DDD in a Project

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis笔记之基本数据结构 链表

链表 链表具有空间存储不连续,增删节点快的优点,因此redis在列表键、发布与订阅、慢查询、监视器等使用了链表作为底层实现。由于C语言中没有内置的链表实现,因此redis自己进行了实现。 双向链表。每个listtNode都有perv和next指针&#x…

treeset java_Java TreeSet iterator()方法与示例

treeset javaTreeSet类的iterator()方法 (TreeSet Class iterator() method) iterator() method is available in java.util package. iterator()方法在java.util包中可用。 iterator() method is used to iterate the elements of this TreeSet is ascending or increasing or…

SpringCloud组件:Ribbon负载均衡策略及执行原理!

大家好,我是磊哥。今天我们来看下微服务中非常重要的一个组件:Ribbon。它作为负载均衡器在分布式网络中扮演着非常重要的角色。本篇主要内容如下:在介绍 Ribbon 之前,不得不说下负载均衡这个比较偏僻的名词。为什么说它偏僻了&…

Redis笔记之基本数据结构 字典

字典 符号表、关联数组或者映射,有点类似于java中的map,用于保存键值对key-value。字典中的键key是独一无二的。底层实现为哈希表。下面进行简述: 哈希表。哈希表主要包含table数组、size、sizemask以及used。table用于保存哈希表节点&…

【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

本文目录 前言一、编写第一个C语言程序-Hello World二、编译程序三、链接程序四、运行程序五、总结六、学习建议七、clang指令汇总回到顶部前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法。学习任何一门语言&#xff…

安卓平板体验Java开发,还能白嫖一年阿里无影云,真香!(内含白嫖方法,人人可领)...

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)阿里无影云早有耳闻,前两天看朋友发体验照片,可能是程序员天生爱折腾的特性又发挥作用了&#xff0c…

Linux命令(三)

echo:输出信息echo ”abc”echo “字符串” |passwd --stdin USERNAME :利用管道修改用户密码输出重定向:>覆盖输出(会覆盖原文件中的内容)>>追加输出 (原有内容会被保留)Set –c &#xff1a…

strictmath_Java StrictMath scalb()方法与示例

strictmathStrictMath类scalb()方法 (StrictMath Class scalb() method) Syntax: 句法: public static double scalb(double do , int sf);public static float scalb(float fl , int sf);scalb(double do , int sf) method is used to return do* 2 raised to the…

你知道group by的工作原理和优化思路吗?

前言 日常开发中,我们经常会使用到group by。亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用group by有哪些需要注意的问题呢?本文将跟大家…

strictmath_Java StrictMath hypot()方法与示例

strictmathStrictMath类hypot()方法 (StrictMath Class hypot() method) hypot() method is available in java.lang package. hypot()方法在java.lang包中可用。 hypot() method is used to return the square root of sqrt(sq(d1)sq(d2)) without any intermediate operation…

关Jquery判断input type=checkbox元素是否被选中的判断

2019独角兽企业重金招聘Python工程师标准>>> 在用到复选框的时候&#xff0c;想在js中判断chekbox是否被选中 <input name"isPermit" id"isPermit" type"checkbox"> 百度了很多的判断方法 1、 if($("#isPermit").att…

Redis夺命十二问,你能扛到第几问?

Redis是面试中绕不过的槛&#xff0c;只要在简历中写了用过Redis&#xff0c;肯定逃不过。今天我们就来模拟一下面试官在Redis这个话题上是如何一步一步深入&#xff0c;全面考察候选人对于Redis的掌握情况。小张&#xff1a;面试官&#xff0c;你好。我是来参加面试的。面试官…

Java Scanner nextLine()方法与示例

扫描仪类nextLine()方法 (Scanner Class nextLine() method) nextLine() method is available in java.util package. nextLine()方法在java.util包中可用。 nextLine() method is used to get the skipped line. nextLine()方法用于获取跳过的行。 nextLine() method is a non…

bzoj 1192

http://www.lydsy.com/JudgeOnline/problem.php?id1192 好像学过一个东西&#xff1a; [0..2^(N1)-1]内的数都的都可以由2^0,2^1,...,2^N这N1个数中若干个相加得到。 #include<cstdio> #include<cstdlib> #include<iostream> #include<fstream> #incl…

Spring Boot Admin 报警提醒和登录验证功能实现!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Spring Boot Admin&#xff08;SBA&#xff09;是一个开源的社区项目&#xff0c;用于管理和监控 Spring Boot 应用程序&…

Java Hashtable rehash()方法与示例

哈希表类rehash()方法 (Hashtable Class rehash() method) rehash() method is available in java.util package. rehash()方法在java.util包中可用。 rehash() method is used to extend the capacity and it is invoked implicitly if the number of keys limit exceeds hash…

企业Shell面试题18:单词及字母去重排序案例

1、按单词出现频率降序排序&#xff01; 2、按字母出现频率降序排序&#xff01; the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more inf…

5种高大上的yml读取方式,你知道几种?

我们今天就来点实战&#xff0c;总结一下除了烂大街的Value和ConfigurationProperties外&#xff0c;还有哪些读取yml配置文件的方法&#xff1f;1、Environment在Spring中有一个类Environment&#xff0c;它可以被认为是当前应用程序正在运行的环境&#xff0c;它继承了Proper…

Java Hashtable equals()方法与示例

哈希表类equals()方法 (Hashtable Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether equality of this Hashtable with the given Object or not. equals()方法用于检…

为什么ConcurrentHashMap不允许插入null值?

作者&#xff1a;磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 语言中&#xff0c;ConcurrentHashMap 和 Hashtable 这些线程安全的集合是不允许 key 或 value 插…