领域驱动设计,让程序员心中有码(二)

           引子,软件工程没有银弹

     上一篇博文,抛出了一个问题,领域驱动设计真的是万能的良方吗?对于这个问题,大家的答案无疑是一致的,作为一种非常受软件行业欢迎的软件思想,领域驱动设计固然有很多优点,却并非万能。

   回到十年前,第一节软件工程学的课堂上,我们的老师就告诉了我们一句真理,软件工程没有银蛋,这句话说的是,软件工程领域,从来没有一种思想或理论能够带来成倍的效率提升。不知不觉,十年过去,我们大概可以看到,软件开发新技术日新月异,新语言层出不穷,但是无论哪种技术,都不见得相对于其所对标的技术取得了成倍的提升。技术尚且如此,理论就更不用说了。

   领域驱动设计,近年来受到技术圈的广泛追捧,主要得益于微服务技术的发展。一千个读者有一千个哈姆雷特,而不同的人往往对这种理论有不同的看法。如果问一个.net开发者领域驱动是什么,大概他会说是abp架构。ABP架构作为完全按照领域驱动设计思想构建的技术架构,目前得到了社区的广泛追捧。然而,领域驱动架构和领域驱动设计,依然是道和术的区别,开发者在学习领域驱动架构的同时,也应该了解领域驱动设计。那么领域驱动设计究竟是什么的东西?由于时间和篇幅有限,我无意通过代码介绍如何实现一个领域驱动的功能,而是希望把领域驱动设计的基本思路进行梳理,期待能通过我的梳理,抛砖引玉,给大家带来启迪

    一,领域驱动设计,不错的选择  

  作为现代软件工业发展的产物,敏捷开发和极限编程,实现了生产力的解放,通过抛弃传统研发模式中留下的臃肿的设计文档,实现了劳动生产力的提升,无数互联网公司,依靠灵活的开发手段,为产品插上了快速开发的翅膀。开发者们不用加班,分分钟就把代码撸完,然后把产品质量关把好,发布,嗯,早早的就回家休息了。然而,随着产品功能的逐渐增加,团队自然而然也需要扩展。可是,团队成员越来越多,代码质量成为一个难以把控的问题。如何保证产品功能的一致性?如何保证功能符合产品的需求?管理者们不厌其烦,每天开会必须提开发质量,必须强调变量命名,注释,设计原则,设计模式,然后每天一次集成,代码审查估计已经不现实了。于是,作为面子的产品质量尚且有测试把关,而作为内脏的代码质量本身,成为上帝的骰子,好与坏全靠开发者们的自觉性和经验。

    冰山,在软件产品华丽外表之下,究竟深藏着多少问题?

一个复杂的数据库关系模型图

  领域驱动设计在这样的场景下推出来的一种理念。软件系统的复杂度是开发者们没办法避免的客观情况,而根据领域的实际情况,建立模型是解决问题行之有效的方法。在实际过程中,我们需要领域专家与开发者一起,共同努力,以一种特殊的方式来进行沟通,并通过模型将实际生活中的问题抽象化。   领域驱动设计的核心是建模,实际上对于大部分开发者而言,建模是一个基本技能,却并非每个人都能熟练的掌握。技术人员都普遍对他们工作领域有关的知识不感兴趣,而更愿意从事精细的框架工作,例如通过技术手段解决实际问题。而学习业务领域和领域建模的工作往往留给别人去做。然而,实际上,软件核心的复杂性,既包括需要直接面对的技术问题,而客观存在的业务问题却也是不可忽视的,过份重视技术,轻视建模,只会导致工作重心的偏离。甚至可以说,过份的重视领域驱动架构基础设施本身,而忽略了建模过程,在后期执行过程中可能会导致不可控制的风险。对于这一点大家都是容易理解的,以前的架构,简单反而容易维护,而系统架构复杂了,反而提高了学习成本导致不容易维护。   软件设计的基本原则是“高内聚,低耦合”。作为一个复杂的软件工程,依靠领域驱动建模,将紧密联系在一起的业务设计成一个领域模型,让领域模型内部隐藏细节,这样让领域模型与领域模型之间的关系变得简单,将极大的降低复杂业务之间千丝万缕的耦合关系。 
  

                        面向领域设计的模型图              二,领域设计的要素,统一语言和建模及文档   在进行设计之前,我们有必要建立基本的原则,那就是统一语言,模型,和设计文档。   1  统一语言   在日常讨论过程中,我们需要跟领域专家讨论,往往大家都是自己行业内的专家,也意味着大家都有自己的表达问题的方式和自己的理解,这有可能导致需求支离破碎。例如对对方表达的术语不了解,会形成鸡同鸭讲的情况。因此,需要建立一个能够互相沟通理解的语言环境,例如,互相的交流双方的术语,并试图利用双方都能理解的词语进行问题的分析。也许在最开始这样共同语言并不能很好的运作,但是却可以在后期逐渐完善。我们的开发者应该定期的了解领域所在行业的业务知识,扩充自己的知识面,这也有利于我们与领域专家的交流。   2  建模和画图   在我们工作过程中模型无处不在,不管是在纸上绘制的简单模型,或者使用专业软件绘制的各种模型,都是模型。领域驱动设计本身,依然依赖于模型驱动设计。学会建模对于广大开发者来说,都是一项基本技能。可以说,代码语言是为了与其他开发者进行沟通交流,那我们建立的各种软件设计模型将极大的方便不同领域的人员进行交流。建模也可以称之为语言的一部分利用uml建立类图,是一种可以比较易于接受的方式。我们可以采用以下手段来建立领域模型。   1)建立一个与实现绑定的模型。初版的模型也许很简陋,但是它可以成为一个基础,然后在后期逐渐完善。   2)建立一种基于模型的通用语言或表达形式和机制。通过通用语言让参与项目的所有人理解模型。   3)开发一个蕴含丰富知识的模型。模型不是单纯的数据结构,它更是各类知识的聚合体。   4)提炼模型,模型应该能在项目过程中动态改变,发现新的概念就加进来,过时的概念就适时移除,避免臃肿。   5)头脑风暴和实验。模型在于实践和应用,它需要项目参与者共同的努力,而头脑风暴是发挥集体智慧的良好方式。对模型进行实验或者进行场景的模拟,有利于让模型更符合需求。   当然,对于领域专家而言,不同类型的模型也许无法理解,例如类图可能过于复杂,可以使用画图的形式,通过解释性的图形或者模型,可以让不同层次的人都能获得一致的理解。   3  设计文档   设计文档依然是不可抛弃的重要资料,虽然设计文档可能不利于维护,却仍然不可抛弃。毕竟开发过程中,通过代码和模型,有可能会导致关键信息的丢失,而且有的不能直接参与讨论的领域专家需要通过文档才能了解之前讨论的情况,甚至可能画图会形成很多歧义,这也需要解释性的文档才能说清楚。为了让文档变得更加有效,不建议重复赘述已知的信息,而关键信息更改后,应该尽量保持最新。 完全依赖代码或架构的自解释特性目前似乎已经成为大家的普遍习惯,但是代码可能存在歧义,或者有的方法本身就无法表达方法的本质含义,最终导致代码成为无法理解的神之领域,这种问题已经不是一个单纯的领域驱动架构能够解决的。如果为了让代码来解释模型,我们所有人必须时刻抱着一丝不苟严于律己的态度,才能写出完全符合领域模型的代码,问题是这种方式现实吗?   4  概念总结:   1)领域就是问题域,有边界,领域中有很多问题;   2)任何一个系统要解决的那个大问题都对应一个领域;   3)通过建立领域模型来解决领域中的核心问题,模型驱动的思想;   4)领域建模的目标针对我们在领域中所关心的问题,即只针对核心关注点,而不是整个领域中的所有问题;   5)领域模型在设计时应考虑一定的抽象性、通用性,以及复用价值;   6)通过领域模型驱动代码的实现,确保代码让领域模型落地,代码最终能解决问题;   7)领域模型是系统的核心,是领域内的业务的直接沉淀,具有非常大的业务价值;   8)技术架构设计或数据存储等是在领域模型的外围,帮助领域模型进行落地;     三、问题思考  掌握建模和基本的步骤,意味着一切刚刚开始。道阻且长,行则将至,领域驱动设计,不仅仅是一种简单的建模思想或技术架构,更是一种挑战。在选择之前,是否需要思考一下,这一套体系,真的适合在你的团队中运行么?如果要切实的运行,还需要付出多少代价?尤其是对于领域模型而言,如果缺乏合理有效、而且持续迭代的设计,你难道不觉得最终所有的模型仅仅只是一种数据结构设计吗? 参考资料: 1.《领域驱动设计-软件核心复杂性应对之道》 2.https://blog.csdn.net/three_bird/article/details/51336834 3.https://blog.csdn.net/heweimingming/article/details/78661540

原文地址:https://www.cnblogs.com/xiyuanMore/p/10085784.html

时间: 2024-10-27 14:41:55

领域驱动设计,让程序员心中有码(二)的相关文章

领域驱动设计-让程序员心中有码(九)

一.易于腐化的软件设计 犹记得刚刚参加工作时,是地图厂商四维图新集团旗下的一家子公司,主要从事规划测绘相关软件研发的公司.当时我的项目是为勘测设计院提供相对应的应用软件,对地理信息和规划相关的图纸信息,几乎已经专业水平.事实上,规划设计大概和软件设计类似,有规划的设计.或无规划的设计,造成的结果几乎是天壤之别. 我们或许很容易就能设想到一个毫无规划设计的城市,纵横交错的路网.杂乱无章式的建筑布局.各种凌乱的棚户区设计,恰好象征着软件设计的无序性,也恰好体现了软件企业在经费不足.组织缺乏管理.开发

领域驱动设计,让程序员心中有码(七)

领域驱动设计- 让程序员心中有码(七) -设计原则和设计模式,互联网开发者们共同的追求 前言 多年来,笔者一直从事传统软件企业的软件开发和项目管理工作.笔者发现在众多的传统软件企业中,评判优秀开发者的标准往往是技能的熟练程度,基本上都是以梭代码的速度论英雄.有人评价说,这种开发可以称之为cv编程,即ctrl+c和ctrl+v编程为主.这种开发往往对开发者的技能要求并没有想象中的那么高,由于工时和合同的限制,不得不压缩开发时间,通过靠密集的劳动力资源.较高的工作强度来完成项目的开发.这种模式,通过

领域驱动设计,让程序员心中有码(五)

1      从搬砖谈领域对象 有一个古老的故事,大概是这样的.作者问三个建筑工地上的工人他们在干什么?有一个没精打采的说,我在挖洞!而另一一个人却说,我在盖一座房子.还有一个人说,我在建立一座巨大的城市.不同的思维模式决定了不同的发展,十年过后,第一个工人,还是在挖洞,而第二个则成为了工头.第三个最终却成为了大设计师. 在软件开发领域,往往会使用搬砖这个词来形容我们所开发的每个功能模块,实际上也确实如此,如果把我们需要完成的每个项目,比作一座高楼大厦,那么在项目中所完成的各种模块,也确实是我们

领域驱动设计系列(转)

曾经参与过系统维护或是在现有系统中进行迭代开发的软件工程师们,你们是否有过这样的痛苦经历:当需要修改一个Bug的时候,面对一个类中成百上千行的代码,没有注释,千奇百怪的方法和变量名字,层层嵌套的方法调用,混乱不堪的结构,不要说准确找到Bug所在的位置,就是要清晰知道一段代码究竟是做了什么也非常困难.最终,改对了一个Bug,却多冒出N个新Bug.同样的情况,当你拿到一份新的需求,需要在现有系统中添加功能的时候,面对一行行完全过程式的代码,需要使用一个功能时,不知道是应该自己编写,还是应该寻找是否已

领域驱动设计系列(3)有选择性的使用领域驱动设计

本系列的第一篇博文抛砖引玉,大谈领域驱动设计的优势,这里笔者还是希望以客观的态度,谈谈领域驱动设计的缺点及其不适合使用的场景,以让读者可以有选择性的使用领域驱动设计. 我们知道,没有最好,只有最合适,设计也是一样.因此,所谓设计,就是以你和你的团队的知识.经验和智慧,全面充分的考虑各种内外因素后,在你们的设计方案中作出合理的选择的过程.而这些影响你们选择的因素主要有: 技术框架的特征和约束(如果你的项目决定使用C语言进行开发,那么首先在设计方法上,就需要使用面向过程而非面向对象的设计方法). 时

领域驱动设计系列文章(3)——有选择性的使用领域驱动设计

本系列的第一篇博文抛砖引玉,大谈领域驱动设计的优势,这里笔者还是希望以客观的态度,谈谈领域驱动设计的缺点及其不适合使用的场景,以让读者可以有选择性的使用领域驱动设计. 我们知道,没有最好,只有最合适,设计也是一样.因此,所谓设计,就是以你和你的团队的知识.经验和智慧,全面充分的考虑各种内外因素后,在你们的设计方案中作出合理的选择的过程.而这些影响你们选择的因素主要有: 技术框架的特征和约束(如果你的项目决定使用C语言进行开发,那么首先在设计方法上,就需要使用面向过程而非面向对象的设计方法). 时

DDD领域驱动设计基本理论知识总结

领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD.领域驱动设计分为两个阶段: 以一种领域专家.设计人员.开发人员都能理解的通用语言作为相互交流的工具,在交流的过程中发现领域概念,然后将这些概念设计成一个领域模型:由领域模型驱动软件设计,用代码来实现该领域模型:

从三层架构迈向领域驱动设计

本文读者基本要求:从事信息管理系统开发,略懂GOF设计模式及SOLID设计原则,对三层面向过程机械编码厌倦,并且不知道出路在何方,如果还掌握代码坏味和重构手法,那是极好的. 1. 三层架构 理论介绍-->实际经验-->总结反思 1.1 简单介绍三层架构 严格分层架构模式的特点是上层只能访问相邻的下层,其他层次间的调用都不允许.三层架构就是一种严格分层模式,它把职责划分为界面展示.业务逻辑.数据访问三层,还有一个业务实体,前面三层都要依赖它,所以它并不构成一个层.结构如图1. 三层架构的特点是一

[转]DDD领域驱动设计基本理论知识总结

领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD.领域驱动设计分为两个阶段: 以一种领域专家.设计人员.开发人员都能理解的通用语言作为相互交流的工具,在交流的过程中发现领域概念,然后将这些概念设计成一个领域模型:由领域模型驱动软件设计,用代码来实现该领域模型: