- 浏览: 592257 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (300)
- Web前端 (27)
- Java疑难 (60)
- 面试 (59)
- 汇编语言 (1)
- 计算机组成原理 (2)
- 操作系统 (3)
- 计算机网络 (6)
- C/C++疑难 (9)
- SSH (2)
- Web开发 (15)
- 故障 (3)
- 软件开发 (16)
- Portal开发 (1)
- 后台开发 (6)
- 数据库 (35)
- 设计模式 (4)
- 数据结构与算法 (4)
- Linux (3)
- 项目管理 (10)
- 多线程 (12)
- 嵌入式 (9)
- 网络编程 (4)
- 架构设计 (20)
- 软件工具技巧 (7)
- 并行并发 (4)
- 窗口编程 (7)
- 串口编程 (0)
- Flex (2)
- 协议 (1)
- 通讯方式 (4)
- 性能分析优化 (5)
- 测试相关 (4)
- 海量数据处理 (2)
- JAVA核心技术 (10)
- SOA (3)
- 攻略规划 (1)
- 爬虫/搜索 (2)
- 正则表达式 (1)
- A Comparison Of NoSQL Database Management Systems And Models (1)
最新评论
-
charles751:
分析的很好!但有一点:只要同步组合操作就可以了,不一定非要sy ...
Vector 是线程安全的? -
S346618898:
core Java中有一段:Vector类对自己的所有可修改方 ...
Vector 是线程安全的? -
code_cj:
基本上明白了.但执行顺是否应该是/etc/profile -& ...
profile bashrc bash_profile之间的区别和联系 -
xd2008ck:
各自有各自的场景吧楼主不要太激进了
Vector 是线程安全的? -
zwt2001267:
写的不错,赞一个
Vector 是线程安全的?
摘自http://www.jdon.com/43127
首先,我觉得软件是用来被用户使用的,也就是说软件是用来帮用户完成一些事情的。从下面的用例图可以很好的理解用户与软件的关系:
上图是超市里的一个营业员处理一笔销售的一个用例。从这个用例我们可以清楚的看到营业员和系统之间的一个交互。从中我们可以清晰的得出系统该做什么:
makeNewSale
enterItem
makePayment
这三个操作可以理解为用户希望软件为她做的三件事请。最近我惊奇的发现,DDD和DCI
的一个巨大差别,让我不得不拿出来和大家确认。那就是:
1)DDD强调软件不应该实现整个用例的交互过程,而应该只建立一个排除软件使用者的领域模型,该领域模型的目的不是要实现软件软件使用者与模型之间的交互过程,而是要捕捉和实现软件使用者提出的需求;
2)DCI强调软件应该实现整个用例的交互过程,在DCI
的架构中,可能会有一个Person对象,然后扮演Cashier的角色参与到MakeNewSale或EnterItem等场景中去。
大家看到区别了吗?DDD更多的是把软件或者说把领域模型看成是一个“工具”,我们人类作为软件使用者通过使用这个工具来做一些事请;而DCI
则是在模拟软件使用者与软件之间的整个交互过程,也就是说在DCI
的架构中,我们能在内存中看到一个Cashier在做事情,就像现实生活中一样;而在DDD
中,我们只会在内存中看到一些“物”在相互作用帮助软件使用者处理一些事情;简单的说:DCI是在完全模拟现实,而DDD
则只侧重于表达除人之外的一个客观的“物模型”;
个人认为DDD
的思想要比DCI
好,因为虽然通过DDD
思想建立出来的领域模型看起来是静态的,但我认为这恰恰是软件本质上该做的并且是只需要做的事情,事实上,我们都认为电脑是工具,我们建立领域模型目的也是为了用它,把它看成为一个工具而已。如果软件还要模拟人际交互的过程,那无疑会使软件(领域模型)不具有客观性。
其实很多时候想想:
如
果基于贫血模型的开发,那么软件只是一个帮助人类记录事实的工具,我们设计的对象没有任何行为,只是数据,就像数据库中的数据一样。事实上,数据库里存放
的不是数据,而是事实的结果。比如数据库中有一条应聘记录,表示某个人在某个时候应聘过某个职位这个事实。所以,在贫血模型的开发模式下,我们的软件仅仅
只是帮助我们记录事实的结果;
而在DDD
等
倡导的充血模型的开发模式下,对象不仅仅只是一个记录事实结果的工具,而是一个个活生生的能够拥有自己个体行为以及能够和其他对象交互的交互行为的对象。
此时,对象不仅可以记录事实结果,而且可以表示事实发生的原因,即对象之间的相互交互协作,即这个事实结果是通过怎样的事实产生的,其实从更高的层面上理
解,对象之间交互是一种正在发生的事实。因此,基于DDD
思想的对象不仅可以表示事实的结果,还能表示事实本身,即对象交互。但这个交互没有包含软件使用者与软件之间的交互,而仅仅表示软件领域模型中各个具有一定客观性的对象之间的交互;
而在DCI
的思想架构下,则认为软件除了要记录DDD
所涉及的事实外,还应该表示出软件使用者与软件之间的整个交互事实;
那么大家觉得哪个才是软件需要实现的真谛呢?
呵呵,就这么多吧,话不多,但都是我深刻思考后的东西。希望大家也谈谈各自的看法。
2011年11月02日 22:50 "@tangxuehua
"的内容
DDD强调软件不应该实现整个用例的交互过程,而应该只建立一个排除软件使用者的领域模型,该领域模型的目的不是要实现软件软件使用者与模型之间的交互过程,而是要捕捉和实现软件使用者提出的需求;
2)DCI强调软件应该实现整个用例的交互过程,在DC ...
2)DCI强调软件应该实现整个用例的交互过程,在DC ...
首先,你总结得非常好,这是我以前一直在强调的,DDD重视的是静态结构,就像结构型模式一样;而DCI
重视的动态交互,是行为模式;DDD对应的是UML中类图实现;DCI对应的是UML中用例图实现。
DDD各有侧重点,但是不代表谁比谁好,他们都是盲人摸象,反映事物的一个方面,正如我们要完整表达一个需求,需要类图 + 用例图 + 顺序图结合起来表达一样,而四色
原型的类图其实是原始类图 + 顺序图,将动静结合在一起了。
DDD是找出静态实体核心,因为在一个领域中如果没有实体,我们就没有DCI
里面发生的任何场景,如果没有电话,就不会有电话铃响的动作和事件
,DCI侧重的是事件
行为,但是事件
行为在客观世界中一般都是由实体发出的;当然在人为的逻辑世界中,比如计算机世界或数学算法世界,行为动作可能没有客体,那么这时就是面向函数编程范式了。
在实际应用中,DDD + DCI
结合起来比较好,这个帖子是我之前针对你疑问结合DDD
+ DCI
分析图书馆案例:http://www.jdon.com/jivejdon/thread/42751#23136856
这里也有一篇DDD
DCI
+Events结合的案例:http://www.jdon.com/jdonframework/dci.html
其实DCI
思想,恰好可以作为DDD
中没有被深入的“上下文”的一个另类扩展。
关于banq说实体发出事件
行为,我认为是没有站出领域看领域做成的。我们应该俯视领域,不应该身临领域。整个领域一早就遵循“道”来运转着,与其说“他”主动发出事件
行为,不如说“他”发出事件
行为是必然的——事件。
程序员是创造世界的人,那么用户就是引导(控制)世界的人,但不是参与世界事件
的人。用户不同事件
参与者,用户(事件驱动者)是推第一块骨牌的人,而骨牌是事件
,参与者只是骨牌内在的逻辑的一部分。所以说我们不应该与领域中的“他”重叠在一起,而是站到领域之外,站在世界之外,去观察这些规律,这些逻辑。
当我看到这一标题,我的直觉是解决问题,但是太粗浅了,更近一步说软件为什么能解决问题,我想是因为软件是现实的反应,软件可以模拟现实的物质和规则,因此特可以解决问题。
物
质有形也是无形,有形如桃子,汽车,无形如工资、温度;这些都是现实的体现。在软件世界中,他们被抽象成对象、数据,他们有喜有乐。缺少它们,软件无法解
决问题,当然它们形态不一,有的身强体壮,能打能抗,能熬夜;有的精通某项个领域;有的擅长调度指挥,有的擅长通讯传递。但是通过他们协作,问题可以被解
决
规则则是贯穿于对象、数据的一言一行中。缺少他们的约束,软件将从有序走向混乱。有些类太强,有些类太弱,有些类太忙,有些类太闲,如果有一天,某些对象倒下了,那软件将何去何从。规则的存在告诉这些居民如何协作,如何让秩序更加有序。
发表评论
-
抽象类与接口选择
2013-12-06 00:20 846从设计理念层面看 abst ... -
深入浅出单实例Singleton设计模式
2013-09-11 00:14 715前序 单实例Singleton设计模式可能是被讨论和使用的 ... -
一些软件设计的原则
2013-09-11 00:12 684摘自http://coolshell.cn/arti ... -
API设计:用流畅接口构造内部DSL
2013-09-05 18:29 985摘自http://coolshell.cn/art ... -
性能调优攻略
2013-08-29 00:12 843转载自http://coolshell.cn/a ... -
软件级负载均衡器(LVS/HAProxy/Nginx)的特点和对比
2013-05-17 11:11 766现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升 ... -
大型网站架构演变和知识体系
2013-05-13 11:39 907源自http://www.blogjava.net/ ... -
webservice通信原理
2013-05-13 11:17 1072当前,WebService是一个热 ... -
为什么要使用EJB?
2013-04-23 10:17 482源于http://www.jdon.com/arti ... -
分布式Web服务器架构
2013-04-15 09:52 870最开始,由于某些想法 ... -
分布式架构关键技术
2013-04-15 09:51 1299分布式的概念 所谓分 ... -
海量数据处理系列(二)系统过载保护
2013-04-03 17:47 1435前言:前段时间在网上看到腾讯后台开发总监bison分享的一篇 ... -
关于领域建模时考虑用户需求的出发点的理解
2012-12-12 15:32 1128摘自http://www.jdon.com/4275 ... -
应用架构设计的三个类型
2012-12-04 11:08 854转载http://www.jdon.com/43952 ... -
混合OO和Functional设计
2012-11-14 17:12 768摘自 http://www.jdon.com/43907 ... -
DCI架构是什么?
2012-11-12 17:19 1376摘自http://www.jdon.com/37976 ... -
DDD DCI和领域事件
2012-11-12 14:40 1613摘自http://www.jdon.com/jdonframe ... -
EDA事件驱动架构 领域事件 Event Sourcing
2012-11-12 10:11 2677摘自http://www.jdon.com/eda.html ... -
不变性immutablity设计
2012-11-08 14:39 1178摘自http://www.jdon.com/4296 ...
相关推荐
ToDoList是一个轻量级任务管理软件,非常便于日常的任务管理。需要的朋友们可以下载试试吧 提示:ToDoList需要.net 4.0 。 软件特色 1.界面清爽,操作简单。简单的界面,符合我提倡的“简单不思考”原则。 2....
也是所有关于软件的不成熟的印象、抽象产生的地方。 在应用层,抽象的、逻辑过程强一些。想象的部分占据主要的部分。需要对现实的业务,基于设备的具体能力,进行构造。 3个范畴定义了“软件”和“程序”的分别。第...
本书是直面软件工程中的最困难任务——侦错,围绕软件世界中的最强大工具——调试器,全方位地展示了软件调试技术的无比威力和无穷魅力。 全书主要内容包括:CPU的调试支持;Windows操作系统中的调试设施;Visual C/...
论文研究-关于武器装备体系论证方法的思考.pdf, 针对武器装备体系建设的特点,简述了目前武器装备体系论证特点和存在的方法问题.通过分析武器装备体系论证手段,剖析武器...
软件测试中关于测试用例设计的一点思考测试用例(TestCase)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。测试用例(TestCase)目前没有经典的...
因此,测试对于软件生产来说是必需的,问题是我们应该思考“采用什么方法、如何安排测试?” 二、软件测试的目的 软件测试的目的决定了如何去组织测试。如果测试的目的是为了尽可能多地找出错误,那么测试就应该...
实验五 555定时器实验 Multisim仿真软件实现 包含课后思考题、包含电路图、.m文件、思考题答案以及实验报告完整版
本书是直面软件工程中的最困难任务——侦错,围绕软件世界中的最强大工具——调试器,全方位地展示了软件调试技术的无比威力和无穷魅力。 全书主要内容包括:CPU的调试支持;Windows操作系统中的调试设施;Visual C/...
软件工程 河北师范大学软件学院 上节回顾 发布不迭代计划 产品设计 产品实施 产品实施阶段的工作 开发 测试 监控 …… 目录 任务看板 燃尽图 每日立会 目录 任务看板 燃尽图 每日立会 Sprint backlog的形式 Excel ...
《计算机网络》课程设计任务书 一、课程设计要求 通过本课程设计,使学生对计算机网络的基本概念的理解,通过相关的设计学习网络协议和网络工具的开发,从而充分掌握计算机网络体系结构和应用。 学生必须仔细阅读...
本书是直面软件工程中的最困难任务——侦错,围绕软件世界中的最强大工具——调试器,全方位地展示了软件调试技术的无比威力和无穷魅力。 全书主要内容包括:CPU的调试支持;Windows操作系统中的调试设施;Visual C/...
本书是直面软件工程中的最困难任务——侦错,围绕软件世界中的最强大工具——调试器,全方位地展示了软件调试技术的无比威力和无穷魅力。 全书主要内容包括:CPU的调试支持;Windows操作系统中的调试设施;Visual C/...
如果您没有上述条件,想进入嵌入式软件开发行业,可以试试笔者的MinGW嵌入式软件仿真调试平台,为您开启嵌入式软件开发中三个最重要的概念:任务(Task),消息队列(MsgQ),信号量(Semaphore)。(笔者工作中在写嵌入式...
很多人认为,软件的需求过程...众所周期,软件需求分析是软件生命周期的第二阶段,主要对前期软件定义及计划阶段提到的任务及计划进行概要的补充,需求分析的主要任务不是确定将来的系统怎么完成某项工作,这是设计阶段
其中改善是对原来业务流程的连续的、渐进的改善,而再造是对企业业务流程的根本的再思考和再设计,从而使企业的关键绩效得到提高。 数据流程分析: 数据流程分析就是吧数据再现行系统内部的流动情况抽象出来,舍去了...
本书是直面软件工程中的最困难任务——侦错,围绕软件世界中的最强大工具——调试器,全方位地展示了软件调试技术的无比威力和无穷魅力。 全书主要内容包括:CPU的调试支持;Windows操作系统中的调试设施;Visual C/...
本书是直面软件工程中的最困难任务——侦错,围绕软件世界中的最强大工具——调试器,全方位地展示了软件调试技术的无比威力和无穷魅力。 全书主要内容包括:CPU的调试支持;Windows操作系统中的调试设施;Visual C/...
"学生讨论:根 " " " " "教师点拨:很显然这台计 "据已有的认知 " " " " "算机无法工作,看起来, ",会得出还需 " " " " "计算机系统仅有硬件系统 "要"计算机软件" " " " "是不够的,那到底是怎么 ""的结论 " " " ...
面向对象思考过程英文第三版。完成一个上传任务
三、思考题 1、需求分析主要反映了用户对软件项目的哪些方面的需求? 2、分析系统流程图,程序流程图和数据流图的区别和各自的特点。 3、怎样写合乎规范的数据流图? 4、数据字典中的数据项的构成共有哪几种可能的...