ddd

随笔-DDD与MVC

主宰稳场 提交于 2020-04-07 19:33:04
今天看到美团的文章是关于遵循DDD来设计业务模型的,当时就想到了MVC这个架构设计模式,便和美团的朋友探讨了一番,探讨完之后,思考之后,便想写个随笔记录一下。 首先来讲,我一开始是讲DDD与MVC混肴了的,其实这两种模式,是不可与之比较的,因为MVC是技术角度设计技术架构,DDD则是从业务的角度设计业务架构,两者是相辅相成的模式。 其次,我们今天不说DDD中的各种概念,就简单说一下,DDD是干什么的,与传统业务划分模式有什么不同呢? DDD是用来作为业务划分的一套准则,使用DDD可以使业务划分更加清晰、合理,相应的,在代码上面则体现为类职责更加单一,代码分层更加合理、明确,更好的实现高内聚、低耦合的代码要求。 DDD与传统业务划分模式的区别,往常我们划分业务,大多是根据数据库实体来划分一个service,然后所有相关这个实体的操作都写在这个service里面,这样的设计在业务简单时是完全OK的,但是,在后面的业务发展中,service往往会臃肿不堪,举个例子,比如一个订单service,我们一开始会做订单提交之类简单的逻辑,后面就会新增订单统计相关的逻辑,这些逻辑看似与订单有关,但又可以独立出去,我们没有一个准则来划分;而DDD就为我们提供了这样一套准则,帮我们去更好的划分业务领域,去分类;也就是说DDD给我们提供了业务划分的准则,与传统模式相比,更加具有指导性,有规范。 来源:

关于box-shadow属性的一点心得

白昼怎懂夜的黑 提交于 2020-04-06 10:23:45
  一般我用到box-shadow都是用于诸如按钮,文本块,某些图标,css类似为: box-shadow: 1px 1px 5px rgba(0, 0, 0, .8);   这样,样式看上去会更加柔和,或者增加了立体感。   我个人的理解上,box-shadow的本质就是本体的形状的复制。   因此,当我们要给样式增加立体感的时候,就可以做的更加逼真。 HTML: <div class="box shadow"></div> CSS:    .box {      width: 300px;     height: 100px;       background: #ccc;       border-radius: 10px;              margin: 10px;         }        .shadow1::before,     .shadow1::after {       content:"";       position:absolute;       z-index:-1;       bottom:15px;       left:10px;       width:50%;       height:20%;       box-shadow:0 15px 10px rgba(0, 0, 0, 0.7);       transform

微服务架构设计模式

孤街醉人 提交于 2020-04-05 18:36:59
目录 什么是微服务模式 单体结构的历程 单体地狱的银弹-微服务架构 扩展立方体和服务 微服务架构的好处和弊端 优点 大型的复杂应用程序可以持续交付和持续部署 每个服务都相对较小并容易维护 更好的容错性 更容易实验和采纳新的技术 弊端 服务的拆分和定义是一项挑战 分布式系统带来的各种复杂性 开发者需要思考到底应该在应用的什么阶段使用微服务架构 服务的拆分策略 识别系统操作 创建抽象领域模型 定义系统操作 根据业务能力进行服务拆分 从业务能力到服务 根据子域进行服务拆分 上帝类的处理 什么是微服务模式 随着网络基础设施的高速发展,以及越来越多的个体接入互联网,在考虑构建支持海量请求以及多变业务的软件平台时,微服务架构成为多数人的首选。微服务架构的出现时服务事物发展规律的:当问题足够大,有足够多的的不确定因素时,人们习惯于把大的问题拆分成小的问题。通过分割,抽象和重用小而可靠的功能模块来构建整体方案。但是当这些小的,可重用的部分多来越多的时候,又会出现新的问题。再相似的阶段,人们遇到的问题也是相似的,这个时候人们需要一些共识,需要用一些通用的词汇来描述问题以及解决方案,这也是人们知识的总结,微服务模式就是这样的总结和概括,是一种可以通用的共识,用于描述微服务领域的中的问题及解决方案。 单体结构的历程 在企业发展的初期,应用程序相对较小,所有的代码运行在一个应用程序中有以下好处

Java Map 接口

痴心易碎 提交于 2020-03-27 07:11:03
Map接口中键和值一一映射. 可以通过键来获取值。 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值。 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常. 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常。 当在不允许使用Null对象的Map中使用Null对象,会抛出一个NullPointerException 异常。 当尝试修改一个只读的Map时,会抛出一个UnsupportedOperationException异常。 序号 方法描述 1 void clear( ) 从此映射中移除所有映射关系(可选操作)。 2 boolean containsKey(Object k) 如果此映射包含指定键的映射关系,则返回 true。 3 boolean containsValue(Object v) 如果此映射将一个或多个键映射到指定值,则返回 true。 4 Set entrySet( ) 返回此映射中包含的映射关系的 Set 视图。 5 boolean equals(Object obj) 比较指定的对象与此映射是否相等。 6 Object get(Object k) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 7 int

DDD基本概念

只谈情不闲聊 提交于 2020-03-11 18:56:34
http://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html#!comments 实体(Entity) 实体就是领域中需要唯一标识的领域概念。因为我们有时需要区分是哪个实体。有两个实体,如果唯一标识不一样,那么即便实体的其他所有属性都一样,我们也认为他们两个不同的实体;因为实体有生命周期,实体从被创建后可能会被持久化到数据库,然后某个时候又会被取出来。所以,如果我们不为实体定义一种可以唯一区分的标识,那我们就无法区分到底是这个实体还是哪个实体。另外,不应该给实体定义太多的属性或行为,而应该寻找关联,发现其他一些实体或值对象,将属性或行为转移到其他关联的实体或值对象上。比如Customer实体,他有一些地址信息,由于地址信息是一个完整的有业务含义的概念,所以,我们可以定义一个Address对象,然后把Customer的地址相关的信息转移到Address对象上。如果没有Address对象,而把这些地址信息直接放在Customer对象上,并且如果对于一些其他的类似Address的信息也都直接放在Customer上,会导致Customer对象很混乱,结构不清晰,最终导致它难以维护和理解; 值对象(Value Object) 在领域中,并不是没一个事物都必须有一个唯一标识,也就是说我们不关心对象是哪个,而只关心对象是什么

领域驱动设计(DDD :Domain-Driven Design)相关的思考

橙三吉。 提交于 2020-03-11 01:16:12
今天,技术总监给我们上了一堂有关DDD 的课程,感触颇多,特此记录! 1、问题 1.1、面向对象 虽然一直在说面向对象编程,但实际开发中一直没有做深入思考,更谈不上去用了,惭愧。 一个Class要有属性和行为,属性是对状态的描述,而行为是对属性进行改变所做的一些操作。当前项目中也有太多的残缺类(一个实体类中只有getter和setter 方法,基本上没有什么行为,故曰残缺类)。 我们来看一下 java.util.ArrayList.java,该类中的属性只有一个: transient Object[] elementData; // non-private to simplify nested class access 其他的像grow()、indexOf()等方法都是对该属性的操作,而且方法数远远大于属性,这才是一个正确的类,我们要对属性进行深入分析,发掘其一系列行为,让其变得高内聚、松耦合。 2、领域驱动设计思想及发展 2004年Eric Evans在其书中《领域驱动设计—软件核心复杂性应对之道》提出了“领域驱动设计(简称DDD)”的概念。 此后一批专家陆续出版了DDD相关的书籍,丰富了领域驱动设计的实践,其中有<Applying Domain-Driven Design and Patterns> <Domain-Driven Design Quickly> <Domain

xpath获取同级元素

自作多情 提交于 2020-03-10 05:21:35
XPath轴(XPath Axes)可定义某个相对于当前节点的节点集: 1、child 选取当前节点的所有子元素 2、parent 选取当前节点的父节点 3、descendant 选取当前节点的所有后代元素(子、孙等) 4、ancestor 选取当前节点的所有先辈(父、祖父等) 5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 7、preceding-sibling 选取当前节点之前的所有同级节点 8、following-sibling 选取当前节点之后的所有同级节点 9、preceding 选取文档中当前节点的开始标签之前的所有节点 10、following 选取文档中当前节点的结束标签之后的所有节点 11、self 选取当前节点 12、attribute 选取当前节点的所有属性 13、namespace 选取当前节点的所有命名空间节点 如:要定位当前td同级后的一个td //td[.='text']/following-sibling::td following-sibling 选取当前节点之后的所有同级节点,跟preceding-sibling一样都是选取同级同父的节点,只不过following是取对应节点之后的节点,preceding

人人都可以领域驱动设计(一)

两盒软妹~` 提交于 2020-03-08 10:55:21
最近几年, 领域驱动设计 (Domain-Driven Design, DDD )这个术语越来越多地出现在软件工程师的视野里。对DDD不熟悉的人可能会觉得它是软件领域里的一个新的概念,但是实际上, Eric Evans 在十几年前就已经提出了这个概念。这个“古老”的概念在之所以能够重焕新生,很大程度上是因为遇上了“ 微服务 ”这个浪潮。如果把DDD里面的理念拿去和微服务架构做对比,你会发现它们有着高度的相似性——DDD里的 限界上下文 不正是微服务架构中的微服务吗?于是,各大公司纷纷运用DDD的方法论来构建自己的产品架构。有些团队成功地将DDD结合到了产品架构中,产生了许多优秀的实践;也有些团队反映DDD太过复杂,很难落地。那么DDD究竟是个什么样的理念?为什么大家都争先恐后地使用它,彷佛不加点DDD都不好意思说自己是微服务架构?然而又为什么那么多团队说DDD难以落地?本文将会结合简单的代码实现来谈谈笔者对DDD的理解。 什么是领域驱动设计? 软件的核心是其为用户解决领域相关的问题的能力。 软件就是为了解决某一领域相关问题而存在的,比如一个普通的计算器软件,就是为了满足我们进行简单的加减乘除运算而存在。对于计算器这种小而简单的软件,一个普通的软件工程师可能花上几天就能过设计开发出来,而且基本不会出现Bug。但是对于一些大型而且复杂的系统,一个团队都得花上很长的时间去设计整个架构

[DDD]學習筆記 第15章 精煉(Distillation)

橙三吉。 提交于 2020-03-07 04:39:11
核心領域(Core-Domain) 為了使領域模型成為企業真正的資產, 模型中的關鍵核心部份需要足夠靈活和充分利用來創建應用程序的功能; 簡而言之, 核心領域是系統中最有價值的部份. 濃縮模型, 將最有價值, 最體現專門知識的概念突顯出來, 並開發出滿足系統願景的柔性設計. 核心領域取決於個人的觀點, 也是通過反複迭代來確定的. 精煉的逐步升級 應用以下的技術沒有嚴格的順序要求, 但不同的技術對設計產生的影響會有所不同: 領域願景聲明(Domain Vision Statement): 描述領域的基本概念與價值. 突出核心(Highlighted Core): 增進交流並指導我們的決策. 隔離核心(Segregated Core): 重新封裝使核心更清晰. 抽象核心(Abstract Core): 以抽象形式表達基本的概念與關系, 並對模型進行大面積的重組和重構 通用子域(Generic Subdomains) 通用子域可能是系統中一些通用元素, 與主要目標無關的輔助功能, 但對系統的功能卻是不可或缺的; 它所抽離出來概念也是與其他商業應用同樣需要的概念, 但別讓它們包含任何的專業領域知識. 對於通用子域的開發可採用現成的解決方案或公開的模型. 一個子域具有通用性, 並不代表它的代碼具有重用性, 通用子域主要是要滿足某些特地需求, 不應該去關注它的代碼重用性,

如何运用领域驱动设计 - 领域事件

妖精的绣舞 提交于 2020-03-05 18:24:39
开篇 距离发布上一篇该系列的文章好像已经过了快一个半月了,好吧,我托更了😭。一晃就已经到了3月份,在这樱花🌸盛开的季节,终于得重新连载该系列了。在停更的期间时不时会收到大家关于DDD的留言和问题,一旦我有时间一定会回复大家的问题。在此,衷心感谢大家对本系列文章的支持😄。 概述 在实践领域驱动设计(DDD)的过程中,我们往往会遇到多个领域对象相互交互的情况。比如聚合根A在执行某操作之前需要得到聚合根B的某个信号(或某些数据)。如果在单体应用程序中,我们有条件和机会使得两者进行强引用来完成操作,但是这将直接打破领域驱动设计的规范,从而使得项目不可控,再次回到 大泥球 的开发。 现在,咱们可以选取一种更纯净的方式来解决这类问题,并且还能够更清晰的描述领域对象的活动迹象。这就是咱们今天的主题 ———— “领域事件” 。那么到底什么是领域事件呢?引入领域事件会为我们已有的DDD项目带来哪些益处?是否一定要使用领域事件呢? 本文将从不同的角度来带大家重新认识一下“领域事件”这个概念,并且给出相应的代码片段( 本教程的代码片段都使用的是 C# ,当然思想是跨越任何编程语言的 😀)。 什么是领域事件 在原著 《领域驱动设计:软件核心复杂性应对之道》 其实并没有直接提及到关于领域事件的介绍。领域对象是在后期才被作者 Evans 提出,经过 Udi Dahan (Nservicebus作者)和