- 浏览: 604476 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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 910从设计理念层面看 abst ... -
深入浅出单实例Singleton设计模式
2013-09-11 00:14 757前序 单实例Singleton设计模式可能是被讨论和使用的 ... -
一些软件设计的原则
2013-09-11 00:12 717摘自http://coolshell.cn/arti ... -
API设计:用流畅接口构造内部DSL
2013-09-05 18:29 1026摘自http://coolshell.cn/art ... -
性能调优攻略
2013-08-29 00:12 886转载自http://coolshell.cn/a ... -
软件级负载均衡器(LVS/HAProxy/Nginx)的特点和对比
2013-05-17 11:11 798现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升 ... -
大型网站架构演变和知识体系
2013-05-13 11:39 962源自http://www.blogjava.net/ ... -
webservice通信原理
2013-05-13 11:17 1104当前,WebService是一个热 ... -
为什么要使用EJB?
2013-04-23 10:17 521源于http://www.jdon.com/arti ... -
分布式Web服务器架构
2013-04-15 09:52 905最开始,由于某些想法 ... -
分布式架构关键技术
2013-04-15 09:51 1347分布式的概念 所谓分 ... -
海量数据处理系列(二)系统过载保护
2013-04-03 17:47 1478前言:前段时间在网上看到腾讯后台开发总监bison分享的一篇 ... -
关于领域建模时考虑用户需求的出发点的理解
2012-12-12 15:32 1169摘自http://www.jdon.com/4275 ... -
应用架构设计的三个类型
2012-12-04 11:08 901转载http://www.jdon.com/43952 ... -
混合OO和Functional设计
2012-11-14 17:12 816摘自 http://www.jdon.com/43907 ... -
DCI架构是什么?
2012-11-12 17:19 1417摘自http://www.jdon.com/37976 ... -
DDD DCI和领域事件
2012-11-12 14:40 1695摘自http://www.jdon.com/jdonframe ... -
EDA事件驱动架构 领域事件 Event Sourcing
2012-11-12 10:11 2720摘自http://www.jdon.com/eda.html ... -
不变性immutablity设计
2012-11-08 14:39 1216摘自http://www.jdon.com/4296 ...
相关推荐
《软件工程思考与练习》通过系统性的讲解和丰富的实践练习,帮助读者理解并应用软件工程的原理和方法,以期提高软件开发的效率和软件产品的质量,最终达到减轻软件危机影响的目的。通过不断学习和实践,软件工程师...
每个阶段都有明确的目标与任务,要求学生能独立思考、合作研讨,并注重问题解决能力和团队合作精神的培养。实习报告的撰写要求详细记录系统分析、设计和实现的过程,体现出学生的专业素养和严谨态度。 四、实习时间...
"最好用的桌面任务、计划、日志管理软件" 提供了一个全面的解决方案,帮助用户轻松地管理日常工作任务、制定工作计划以及记录工作日志。下面将详细讨论这些核心功能及其重要性。 首先,任务管理是软件的核心组成...
"软件项目管理思考题" 软件项目管理是指对软件项目的规划、组织、协调、控制和监理,以确保项目的目标和要求得到实现。软件项目管理思考题是对软件项目管理的重要组成部分,它帮助项目经理和团队成员更好地理解软件...
《软件工程实验任务书1》涉及的是一次关于软件工程的实验任务,主要目标是设计一个出卷系统,满足教师、学生和题库维护人员的需求。在这个任务中,我们需要完成以下关键部分: 1. **实体-关系图(E-R图)**:E-R图...
### 软件重构的思考与实践 #### 一、什么是重构? 重构(Refactoring)是一种在不改变软件外部行为的前提下,对软件内部结构进行调整的过程。这种调整旨在提高代码的质量,使其更加易于理解、修改和维护。软件的...
《软件工程——实践者的思考》是一本深入探讨软件开发过程和方法论的书籍,适合对软件工程感兴趣或者正在从事相关工作的读者。这本书的核心是将理论与实际操作相结合,引导读者从实践中提炼出有效的软件工程策略。 ...
在高职计算机专业的课程中,CAD(计算机辅助设计)软件教学占有重要的地位。随着信息化水平的提升和技术的快速发展,CAD技术已经成为许多行业中不可或缺的一部分。本文探讨了当前高职计算机专业CAD软件教学中存在的...
本软件工程实习任务书是软件技术专业的一门实践课程,旨在使学生进一步理解和领会软件工程的原理、技术和方法,巩固所学理论知识,加深对软件、软件工程、软件生命周期等相关概念的理解,让学生全面系统地掌握软件...
在服装CAD的学习中,创意是推动行业发展的重要力量,因此任务应具有一定的开放性和创新性,鼓励学生通过独立思考和协作探讨来完成任务,从而在实践中培养创新精神和独立工作能力。 通过这种任务驱动的教学方式,...
### 软件危机及其克服策略 #### 一、软件危机概述 软件危机,这一术语最早出现在20世纪60年代末,随着计算机技术的飞速发展,软件需求激增,但传统的软件开发方式却显得力不从心,引发了一系列问题。这些问题包括...
《工业软件相关技术发展综述及思考》 工业软件,作为信息化与工业化深度融合的关键工具,其重要性不言而喻。在“两化融合”的大背景下,工业软件承担着推动产品设计数字化、过程控制自动化、企业管理信息化和装备...
基于SpringBoot的软件开发管理系统任务书 基于SpringBoot的软件开发管理系统任务书是软件工程专业的毕业设计(论文)任务书,旨在设计和实现一个基于SpringBoot的软件开发管理系统。该系统主要分为系统管理员和操作...
总结而言,软件工程课程设计任务书通过具体的项目实践,旨在培养学生的软件设计和实现能力,提升其独立思考和解决问题的能力。在这一过程中,学生将全面接触和深入理解软件开发的各个阶段,不仅为将来走向职业岗位...
11. 可互操作性(interoperability):一个软件系统与其它软件系统相互通信并协同完成任务的难易程度。 McCall 模型是一个层次结构模型,包括质量要素、衡量标准、度量。ISO/IEC9126 质量模型分为内部质量模型、...