`
klcwt
  • 浏览: 194571 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
阅读更多

http://www.jdon.com/jivejdon/thread/34255.html
1. 主要从三个维度去考虑
1.1 静态
静态主要是考虑关系学,分为包的关系,类的关系,根的聚合关系,通过不同层次的关系,分而治之,形成一个良性有序的关系类图。
类的关系:领域职责和业务决定
根的聚合:主要考虑不变量关系,那些类应该在此根聚合中,并保持不变量关系,那些在此聚合中,但不在不变量范围之内。目的是为了既保持此聚合的内存和存储的一致性(修改其中元素,锁定根,这样就可以保持一致), 同时又要保持远离高并发(挑出活跃修改的元素,以防止保护范围不合适,锁定太频繁,性能太差)。
注意该关系不同于DB中的关系。DB中的关系是用键来指示表之间的关联,关系单调,不能反映出丰富的继承,组合,层次关系语义。如果给键值加上类型的考虑,可以模拟一部分类之间的关系类型。
类之间的关系更丰富,而且可以动态增删改,可以抽象。 这也是DB与类之间映射失配的关键。 而Hibernate其实可以看成是DBMS上面的一个代理层,或是解释层,把丰富的类关关系映射成单调的DB关系。


1.2 动态
1. 应用层次:动态主要是针对业务中的一些业务流程来进行建模。这主要要考虑因动作而导致的一系列相关因素的变化的原子性,一致性。包括单个行为(或方法)的原子一致性,多个行为的原子性,一致性。相对应用层就是每操作(per operation),每请求(per request),每会话(per conversation)的原子性,一致性。 这主要映射到应用层的(离线)悲观乐观锁,或DB层的悲观乐观锁或是隔离级。
2. 操作层次:主要针对具体业务操作单元中的可变性。动态还要针对类之间的职责协作, 也就是具有静态关系的类之间的协作。这里面除了类之间的相互调用 ,更主要的需要充分考虑到策略,规则,计算的可变性(可能采用新策略),具体来说如:排序策略,搜索策略,存储策略,计费规则,计税规则,验证规则,过滤规则,贴子中的评分规则,精华评估策略,类似贴子,相关贴子的选择计算策略等。不同行业中,主要的业务往往保持稳定,但在业务中的一些相关规则策略是灵活多变的。这主要映射到一些设计模式:proxy,decorator,adaptor,command,chain等。

1.3 领域
针对静态,动态关系的分析和划分时,都是从领域的角度,在领域知识下指导进行的。划分的结果(如不同的层,不同的包)都是综合了动静领域三方面的考量,其中领域是决定性因素。而领域知识中的元素之间的关系组织又需要从静态和动态的角度去分析。
1.可以先得出领域中主要的显式概念和关系。然后利用领域的职责来进行模型的横向分层,利用领域的业务目标来进行类的纵向切割。
2.横纵之后,在单个层中及某一纵向块中,在领域目标及相关知识的指导下,充分从动静两方面去考虑和分析,这时分析模式和设计模式就可以大展拳脚了。利用我们在软件实现中的经验,复用并修改创造已有的优秀模式,去组织建模领域的类和关系分层图。
3. 第1和第2步是迭代过程,也就是模型的精化。因为动静的分析不可避免会影响到职责和目标的重新划分。而职责和目标也会影响到动静态关系的组织方式的选择(关系的组织不会只有唯一的必然选择)。例如操作层次的动态性中,可能造成DB的竞争,为了减少竞争, 要注意以聚合的根为存储单元,同时把活跃变化的元素剔出聚合的不变量范围之外。

1.4. 在此过程中。会逐步分析出许多不属于领域的东西或说多数模型均存在的问题。
1通用型服务:存储,安全,事务,创建,权限,单点登录。 AOP来介入
2. 与其他系统的协调:模型映射,概念映射,关系映射,映射维护。只能是在不同的模型层中去协调,可以采用防腐层,结合模式(proxy, decrator, delegate, adapator)解决
3. 比较难处理的地方:创建职责,可变性处理。 Spring来负责


仔细看了下,才发现 “应用层次:动态主要是针对业务中的一些业务流程来进行建模。”,业务流程怎么能放在应用层呢?这肯定是错误的。

我主要是从以下两方面考虑:

这里面的应用层与 系统分层(应用,领域层)中的应用概念不是一个概念。 这里的应用层其实是有点类似于martin flower中的知识层,是说明更高抽象,更高目标,更粗业务粒度的概念。

另外, 对于应用层是否一定不能放业务流程,其实是个仁者见仁的问题,有时我们很难做到分得如此干净。 而对于一些比较固定的流程,其实也可以放入应用层,关键是这个流程要满足以下条件:
1。 固定或说稳定
2, 不涉及业务规则或策略判断
3. 简单:一到二步,顺序组合。
这样应用层的接口,其实也就是组成了一个基本的相对固定的高层业务框架




DB与类之间映射失配,不理解,请举个具体的例子?
映射失配,或者叫阴抗失配。 是指DB关系模型与OO类模型(我把它也看成另一种关系模型,只不过这个模型中的关系是比较灵活,通过多态和模式应用,还具有动态性。 )之间的映射存在障碍
OO中的关系: 聚合, 组合 , 继承, 加上设计模式后(其实也就是应用以上三个基本关系的灵技巧性组合)来得到更多的应对不同变化类型的关系。

DB中的关系: 外键关联,主键关联

OO的关系与DB中的关系的转化: 为了让DB的相对简单的关系来映射OO中的丰富关系,我们可以采用外键关联,主键关联, 一表多类, 一类多表,中间表等技巧来持久化类。

这样的映射如果是我们自己来做,写在代码中,就很别扭,也不能聚焦在模型中,容易精力分散到映射OO与DB中, 尤其是更严重的, 这种思路很容易把我们引入以DB关系思考的分析设计,也就DB驱动的分析设计开发。(观点参见DDD一书)。


分享到:
评论

相关推荐

    大白话领域驱动设计DDD视频教程

    第1章 初步了解DDD 课程介绍 抛开杂念,看看传统三层CRUD编程方式 DDD领域驱动设计到底是什么? DDD和传统三层优劣势比较 DDD在国内现象是个什么情况? DDD从战略设计到战术设计概览 第2章 领域分析模型 核心域,...

    ddd.rar_www.03ddd_www.DDD89.com

    标题中的"ddd.rar_www.03ddd_www.DDD89.com"表明这是一个压缩文件,可能包含了某个项目或资源的代码、文档等,而URL部分可能是发布者或来源的标识,但具体网址已无效。 描述中提到的是一个89S52微控制器与射频卡...

    领域驱动模型(DDD).zip_ddd_领域模型_领域驱动_领域驱动设计

    领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,它强调通过深入理解和建模业务领域来驱动软件的设计和开发。DDD的核心思想是将复杂的业务逻辑转化为可操作的软件模型,以此来提高软件的可维护性...

    DDD 微服务落地实战视频教程

    《DDD 微服务落地实战视频教程》是一套全面解析领域驱动设计(Domain-Driven Design,简称DDD)在微服务架构中的应用的课程。这套教程共包含21个章节,旨在帮助学习者从理论基础到实战技能,逐步掌握如何在实际项目...

    【推荐】DDD领域驱动设计&中台实践资料合集(20份).zip

    DDD领域驱动设计&中台实践资料合集,共20份。 DDD促进传统架构微服务转型 化繁为简--DDD驱动复杂业务软件架构的演进 基于FP的DDD实践 基于DDD的领域建模中的模版和工具实践 架构分层模型适配 金融支付系统的改造之...

    DDD领域驱动设计&中台实践资料合集(20份).zip

    DDD领域驱动设计&中台实践资料(20份): DDD促进传统架构微服务转型(42页).pdf DDD在旅游电商架构演进中的实践(47页).pdf DDD实践中的那些坑(28页).pdf DDD的为与不为(25页).pdf Every Entity as A ...

    DDD实战篇:分层架构的代码结构

    不同于其它的架构方法,领域驱动设计DDD(DomainDrivenDesign)提出了从业务设计到代码实现一致性的要求,不再对分析模型和实现模型进行区分。也就是说从代码的结构中我们可以直接理解业务的设计,命名得当的话,非...

    【推荐】张逸-DDD聚合工作坊

    【推荐】张逸-DDD聚合工作坊是一份深入探讨领域驱动设计(Domain-Driven Design,简称DDD)的专题资料,由知名专家张逸在IAS2019演讲中分享。这份29页的PDF文件是关于如何有效地运用DDD方法论进行软件开发的实践指导...

    DDD领域驱动设计学习框架简介PPT

    领域驱动设计(DDD)是一种软件开发方法,由Eric Evans在其同名著作《领域驱动设计》中提出。DDD致力于解决复杂业务系统的开发问题,通过将业务领域专家与开发人员紧密合作,将复杂的业务逻辑转化为可执行的软件模型...

    基于DDD和微服务中台架构与实现

    【基于DDD和微服务的中台架构与实现】是一本深度探讨现代企业IT架构的书籍,作者欧创新和邓頔结合实践经验,阐述了如何利用领域驱动设计(DDD)和微服务架构构建灵活且高效的中台系统。以下是该书涉及的主要知识点:...

    最新领域驱动设计(DDD)资料合集(23份).zip

    最新领域驱动设计(DDD)资料合集,共23份。 金融支付系统的改造之路 化繁为简--DDD驱动复杂业务软件架构的演进 基于DDD的领域建模中的模版和工具实践 基于FP的DDD实践 架构分层模型适配 可视化的遗留系统微服务...

    DDD分层架构参考代码目录结构

    《DDD分层架构及其在微服务中的应用》 DDD(Domain-Driven Design,领域驱动设计)是一种软件开发方法,强调以业务领域为中心进行系统设计。其分层架构模型是DDD的核心设计模式,它将系统分为用户接口层、应用层、...

    DDD领域设计模式代码案例

    DDD(领域驱动设计)是一种软件开发方法,它强调以业务领域为中心进行系统设计,通过将复杂的业务逻辑转化为可理解的模型来提升软件质量。在Java环境下,DDD可以帮助开发者更好地理解和实现业务逻辑,提高代码的...

    设计的秘密:DDD落地最佳实践与实战

    "设计的秘密:DDD落地最佳实践与实战" 本资源摘要信息主要关注Domain-driven design(DDD)的设计理念和实践,旨在帮助开发者更好地理解和应用DDD在软件开发中的重要性。 DDD的优势 DDD的主要目的是为了解决软件...

    DDD领域驱动设计和中台实践资料合集25篇.zip

    DDD实战,领域驱动设计 DDD在旅游电商架构演进中的实践 Every Entity as A Microservice - 领域驱动设计DDD 分享我对领域驱动设计(DDD)的学习成果 化繁为简--DDD驱动复杂业务软件架构的演进 基于DDD的领域建模中的...

    DDD领域驱动设计day01.pdf

    领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,由Eric Evans在其同名著作中提出,旨在帮助开发者更好地理解和处理复杂的业务逻辑,通过深入挖掘领域知识来构建高质量的软件系统。DDD的核心是...

    基于DDD和微服务的中台建设.pdf

    DDD领域驱动设计是一种以领域为核心的设计方法论,旨在通过领域专家和开发团队的紧密合作,将业务问题的复杂性转化为软件设计的清晰结构。它特别适合于中台和微服务架构的构建,因其能有效地将复杂的业务领域分解成...

    领域驱动设计案例-供应链商品域DDD实践

    领域驱动设计(DDD)是一种软件开发方法,旨在处理复杂的业务逻辑和系统设计。在供应链商品域的实践中,DDD 提供了一种结构化的方法来理解和管理软件的复杂性。以下是基于标题、描述和标签的主要知识点: 1. **理解...

    基于DDD(领域驱动设计)并支持SaaS平台的微服务框架

    **基于DDD(领域驱动设计)并支持SaaS平台的微服务框架详解** DDD(Domain-Driven Design,领域驱动设计)是一种软件开发方法论,强调通过深入理解和表达业务领域,来驱动软件的设计和实现。在现代企业级应用开发中...

    ddd.rar_ddd474.com

    本资源"ddd.rar_ddd474.com"提供了一种实用的方法来解决这一问题,主要总结了三种常用的技术。下面我们将详细探讨这三种方法。 1. **使用公共静态变量**: 公共静态变量是一种简单直接的方式,可以在程序的不同...

Global site tag (gtag.js) - Google Analytics