`

面向对象与领域建模

阅读更多

多变且复杂的需求

  如果没有多变的需求,也许就没有今天的面向对象软件,我们曾经试图通过需求管理、需求跟踪等等管理方式约束和减少需求频繁更新带给软件的冲击,可是这样下去的结果只有一个:使得软件更加僵化;或者程序员更加 劳累。

  需求不但多变,而且经常是不可能第一次就能掌握,需求反映了某个领域的专业知识,例如数学、管理、财务或 电子商务等等,每个特定案例需求又有其特别复杂之处,几乎没有人能够第一次接触就可以深入掌握这些专业领域的 需求本质,就是专门的建模专家也不例外。

  既然需求是多变而且复杂的,所以,就不能使用“堵”式方法对其进行控制和管理,只能顺势而为,通过灵活多变的 以及迭代反复的方式逐步抓住需求,并且作为需求的实现软件系统必须能够迅速应对需求变化,需求变化有多快,软件 变化就有多快。

  因此,对于多变的需求,我们的解决之道是:引入灵活多变的架构,面向对象OO架构正是应对多变需求而生,强调软件的可维护性 和拓展性,OO可能不是最好方式,但是目前是最合适的;对于复杂的需求,我们的解决之道是:委派专门的建模专家跟踪理解需求, 在需求和需求实现之间搭建桥梁,项目方法上采取多次迭代的敏捷软件开发方式,逐步了解学习掌握需求。

  在这里稍微说明一下,很多人总是将软件和数学、管理、财务混为一谈,其实软件本身就是一门独立的专业,是为 数学、管理。财务等专业领域服务的,不能期望软件人员也是其他领域专业人员,可是在中国现实中,很多人总是 无法分辨,例如某局长将整个机关考核信息化的任务交给电脑中心,这就是将考核管理专业和软件专业混同的例子, 在考核管理和软件之间需要一个领域建模专家,由他来理解或者设计考核管理体系,然后通过模型,表达成 软件人员能够看懂的符号,软件人员通过模型了解领域。

  曾经有需求专家呼吁:最好将需求给所有软件人员都了解,需求专家和一般软件人员一起工作,这些想法的本质是 好的,但是不可能实现的,不可能每个软件人员不但了解软件架构和OO思想;还能够掌握另外一个专业领域的艰深知识, 所以,现在我们提出:将领域专家建立的统一领域模型让所有软件人员都了解,让一般软件人员围绕领域模型工作,这样 的方式才切实可行。

需求分析方法演变

  历史上,对需求分析方法可以说经过三个阶段:

  第一阶段:围绕数据库的驱动的分析设计,新软件项目总是从设计数据库及其字段开始。这个阶段特征就是围绕数据库编程,典型的是 DBase/Foxpro,以及后来的Delphi/VB技术。

  这种围绕数据库分析设计的缺点非常明显:首先,不能迅速有效全面认识反映需求,世界不只是由简单的关系数据组成,而且 使用关系数据来反映现实需求,不符合人类自然思维(OO才是),是一种扭曲的分析方法,特别对于初学者,他们接受数据库分析方法的难度反而可能会大于OO分析方法,现在很多职业学校和社会培训,基础课程从数据库开始,从某种程度上,是历史倒退, 严重阻碍中国软件发展的进程。

  围绕数据库分析极其容易导致过程化设计编程,围绕数据分析和过程化编程是一对恶魔,数据库结构确立后,就让普通程序员写SQL 语句,SQL语句执行有明显的先后顺序,在这样顺序过程编程思维中,OO思维就难以生存。长此以往,成为习惯后,就很难改变到 OO设计上,所以,传统编程经验越丰富,转变到OO设计就越难。

  在运行性能方面:围绕数据库分析设计容易导致软件运行时负载集中在数据库端,系统性能难于扩展(走上集中式、昂贵的、高风险的大型机模式), 闲置了中间件J2EE服务器分布式集群处理能力,就是使用了集群,也分担不了负载。

  最后,我们必须认识到:对象和关系数据库存在阻抗,本身是矛盾竞争的,他们是两种分析看待需求的流派,可以说是水火不容, 要么你采取数据库分析设计以及过程化编程,要么完全采取OO,现在使用.NET和Java这样OO语言的人很多,但是70%左右都是使用OO语言
编写传统过程化系统,在Java中这样做,会有极差性能;而这种现象在.NET中又极容易得到纵容,.NET是一个系列阵营,正如Windows系列一样, 当你和别人说,你在使用Windows,别人可能觉得你没有落后时代,但是他们哪里知道你在使用Windows 3.1呢?

  第二阶段:面向对象的分析设计方法诞生后,有了专门的分析和设计阶段之分,我们使用UML符号来表达分析设计思想,分析设计进入了一个相对更高的层次,拥有了自己一套科学且艺术的方法论。但是有一个致命缺点:分析阶段和设计阶段是断裂的,互相不能很好衔接,为什么?

  首先,我们看看分析人员和设计人员在职责重点工作是什么?
  分析人员的职责:是负责从需求领域中收集基本概念。而设计人员的职责:必须指明一组能北项目中适应编程工具构造的组件,这些组件必须能够在目标环境中有效执行,并能够正确解决应用程序出现的问题 两个阶段两者目标不一致,分析人员只管需求分析,至于是否适合设计,或者能够导出适宜设计的分析结果,这个尺度很难衡量和把握;

  而设计人员因为照顾代码可运行,因此,经常可能会抱怨分析员给出的结果过于粗糙,不适合设计,这样分析设计两个阶段就导致分裂,项目失败。

  在这个阶段,虽然有UML帮助,但是UML不是思想,打个比喻:会CAD的绘图员就是建筑师吗?很显然,UML就是CAD图符号,UML不等于分析设计思想。 所以,有人说UML不是银弹,这些就象说中医不是科学一样绕人(中医就不是西医,当然就不是科学)。

  第三阶段:融合了分析阶段和设计阶段的领域驱动设计(Evans: DDD)。2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计 )简称Evans DDD, 领域建模是一种艺术的技术,它是用来解决复杂软件快速应付变化的解决之道,所以,从Evans DDD通篇文章中,你找不到科学象征的定理和公式,当然如果 你试图寻找这样寻找,你也就陷入了“中医是不是科学”怪圈了。

  Evans DDD抛弃了分裂分析模型与设计的做法,使用单一的模型来满足这两方面的要求。这就是领域模型。 单一的领域模型同时满足分析原型和软件设计 ,如果一个模型实现时不实用,重新寻找新模型。如果模型没有忠实表达领域关键概念时,也必须重新寻找新的模型。 建模和设计成为单个迭代循环。将领域模型和设计紧密联系。因此,建模专家必须懂设计。

领域建模的重要性

  如果你说一个软件开发需要经过需求、分析和设计三个阶段的话,那么可能反映你的思想已经落伍,软件开发现在是 经过需求、建模阶段,混合了分析和设计阶段,可以更激进地说:我们国家的系统分析员和系统设计员考试也许应该合并了, 合并成建模专家的考试,否则,这些都是中国软件落后世界十年的证据,可悲的是:我们自己可能都不知道。

  Evans DDD可以说是近期与SOA相提并论的两大重要技术思想,SOA是着重于软件集成方面;而EvansDDD才是着重我们软件开发上, 在大部分情况下,软件开发重要程度不亚于软件集成,但是因为软件开发方面开源力量冲击,软件集成上工业厂商利润最高, 所以,工业厂商在SOA叫得最响,我们参加得各种会议几乎都是SOA,当心被误导,工业厂商从来不会告诉你事实得争相。

   没有面向对象的分析设计,哪里面向对象的构件或组件?过去经验不是证明:我们使用大量的构件组件,却在编制面向过程的体系?

  以EJB2为例子,在EJB2过去大部分系统中,我们常常以数据库为中心,实体Bean因为特殊技术原因,僵硬一块,变成数据库 的代名词,我们围绕实体Bean编制出大量的值对象Vale Obejct,或称为DTO(Data Transfer Object),在这样系统中,从对象 的名称也可以看出,对象是为数据服务的,对象从属于数据库的。

  现在,要彻底改变过来,OO就是以对象为主,数据库是从属对象设计的,如果说EJB2的实体bean技术让你不得不走上传统过程化编程歧路,那么 EJB3已经更正了实体Bean设计缺陷,从EJB发展可以看到一个侧面:工业厂商更多关心的是功能,而不是设计?

  只有谁才真正关心你的软件设计和代码质量?只有你自己。我不是提倡都不要参加工业厂商的会议,而是需要每个人冷静想想: 到底谁是自己代码的主人?

  领域建模属于与具体.NET或Java技术无关的设计思想,有人总是说:.NET比Java简单,其实这又是一个大误区,如果都达到同样设计水准,无论使用.NET或Java,都需要付出同样的努力;那为什么有人觉得.NET简单,那是因为设计要求降低了,参见这篇.NET的DDD文章

分层架构

  分层架构是现代OO软件企业系统的基本架构,只有分层才能达到良好的可拓展性和维护性。基本三层:表现层、业务层和持久层 ;J2EE中表现层和持久层有成熟框架支持,应用重点在业务层。

  业务层根据Evans DDD,可以再细分为应用层和领域层两种,在业务层设计编码中,大量应用OO设计原则和设计模式。领域层定义:负责表达业务领域概念、业务状态以及业务规则,是整个业务软件核心和重点。 应用层定义:负责完成功能,并且协调丰富的领域对象来实现功能,不能包括业务规则,无业务状态;

  每个层都是内聚的,并且只依赖它的下层,为了实现各层的最大解耦,IOC/DI容器是当前Java业务层的最好选择 。

   没有分层架构的快速开发基本是旁门左道,不如返回Foxpro和Delphi/VB两层时代。将本属于业务层的逻辑交由表现层来处理的快速UI方式也是一种旁门左道。快速开发必须基于良好的质量,虽然良好的分层架构带来开发效率的降低,但是这些也是可以有方法解决。

建模与项目管理

   在我们大多数从软件项目管理上寻找软件永恒解决之道时,他们可能没有意识到又在范“缘木求鱼”老毛病了, 打个比喻很容易明白这个道理:冷兵器时代(也就是火枪没有没有发明之前),各种排兵布阵可能在作战指挥时 很有效;但是到了火器时代,所有的过去作战方式就落伍了;当然到了现在信息化战争时代,更是天壤之别。

   Evans DDD领域驱动建模的诞生,对过去传统的项目管理都提出挑战,当我们还在争论RUP好还是敏捷好的时候, 谁会想到我们应该采取围绕统一领域模型的迭代驱动开发呢?

   有人可能还在疑惑?我接到一个大项目,那么我的建模和架构设计时间应该是5个月还是5年呢?当然应该回答他:都不行,需求是多变且复杂的,计划赶不上变化,现在就应该开始DDD建模。

(以上文字源自板桥本人的第四届中国软件技术大会“领域设计建模”演讲稿 )

分享到:
评论

相关推荐

    面向对象分析与设计

    《面向对象分析与设计(第3版)》通过大量例子说明了基本概念,解释了方法,并展示了在不同领域的成功应用。全书分为理论和应用两部分。理论部分深刻剖析了面向对象分析与设计(OOAD)的概念和方法。应用部分连续列出了5...

    uml面向对象建模与设计

    面向对象建模与设计(第二版)电子书,该书是“面向对象建模与设计”领域的经典著作。全书由四个部分组成。第一个部分以一种高层的、独立于语言的方式描述面向对象的概念,以及UML表示法;第二部分从问题陈述到分析...

    第二部分 软件需求分析与建模(7面向对象分析).ppt

    7.1 面向对象建模 7.2 用例建模 7.3 建立领域模型 7.4 行为建模 7.5 案例分析 7.6 实验要求及习题

    面向对象软件架构设计

    第一单元:软件生命周期与软件架构介绍 2 ...借鉴RUP的UML建模与分析 213 第四单元:设计模式与软件设计思想 267 设计模式 268 常用的软件架构风格及适用情况分析 391 SOA 及分层架构设计 443 第五单元:架构设计实践

    面向对象技术 uml建模

    1、程序设计 OOP:以程序模块为 Object 2、系统分析 OOA:以领域事物为 Object 3、系统设计 OOD:以系统组成元素为 Object 4、软件工程 OOSE:综合OOP、OOA和OOD 5、数据模型 OODB:以数据为 Object

    校园二手交易平台-基于UML面向对象分析与设计.docx

    内容包括:校园二手交易平台需求分析、校园二手交易平台用例图、校园二手交易平台用例文档、校园二手交易平台活动图、校园二手交易平台状态图、校园二手交易平台时序图、校园二手交易平台类图、校园二手交易平台组件...

    面向对象的系统设计.part1

    本次再版,根据国内外面向对象领域理论与技术的最新发展做了不少修改。 本书是作者的另一本著作 《面向对象的系统分析》(第2版)的姊妹篇,二者构成完整的OOA&D方法体系。  本书的主要内容是论述如何在面向对象的...

    UML面向对象建模与设计(第2版)

    (“面向对象建模与设计”领域的经典著作) 作者: (美)Michael Blaha,James Rumbaugh [作译者介绍]译者: 车皓阳

    面向对象系统分析与设计课件及复习资料

    面向对象系统分析与设计课件及复习资料 为老师上课用课件和复习指导 内容包括: 1.3 uml概述 1.3.1 uml简史 1.3.2 uml概貌 1.3.3 uml的特点和用途 第2章 面向对象的软件开发过程 2.1 rational统一...

    面向对象的组态软件图形界面系统设计与研究

    本文论述了面向对象的组态图形界面系统的模型的建立和实现。以面向象的建模方法,采用统一建模语言UML,借助RationalROSe建模工具建立整个界面系统的模型。依据系统模型,以面向对象的编程方法,采用面向对象的编程...

    面向对象架构模式之:领域模型(DomainModel)

    如果说事务脚本是面向过程的,那么领域模型就是面向对象的。面向对象的一个很重要的点就是:“把事情交给最适合的类去做”,即:“你得在一个个领域类之间跳转,才能找出他们如何交互”,Martin Flower说这是面向...

    面向问题域的领域建模方法

    软件开发已经成为一个非常重要的工业领域,对软件工程 的研究也进行了几十年的努力, 并取得了一定的进展。而软件开发的工业化生产的模式仍未形成,目前面临的问题与!“世纪”年代初出现“软件危机”时几乎相同,即...

    面向对象分析与设计课程设计 宠物救助申请管理系统项目设计报告 原创 48页课程大作业

    用例模型与非功能性需求 用例模型 用例描述 非功能性需求 面向对象分析模型 领域模型类图 主事件流说明 关键业务用例的分析类结构 核心业务场景系统时序图 系统操作契约 面向对象设计模型 精细化设计与模式应用 设计...

    论文研究-面向对象有标复句本体建模.pdf

    基于面向对象方法为带标志构件的现代汉语复句子类(有标复句)建立本体模型,奠定中文信息处理复句层级的研究基础。在原有成果的基础上,利用关系标志与分句间的联系对标志构件进行句法分析,并在本体构造方法框架的...

    社团管理系统报告(面向对象系统分析与设计课程设计报告).zip

    内含业务概况、组织结构、业务目标、涉众分析、业务建模、领域模型、业务规则、概念模型、系统建模-----------------------------

    面向对象软件架构设计.ppt

    借鉴RUP的UML建模与分析 213 第四单元:设计模式与软件设计思想 267 设计模式 268 常用的软件架构风格及适用情况分析 391 SOA 及分层架构设计 443 第五单元:架构设计实践

    面向对象的系统设计.part2

    本次再版,根据国内外面向对象领域理论与技术的最新发展做了不少修改。 本书是作者的另一本著作 《面向对象的系统分析》(第2版)的姊妹篇,二者构成完整的OOA&D方法体系。  本书的主要内容是论述如何在面向对象的...

    基于UML小型虚拟超市管理系统的分析设计

    UML是面向对象技术领域中占主导地位的标准建模语言,它统一了过去相互独立的数十种面向对象的建模语言共同存在的局面,通过统一语义和符号表示,系统对软件工程进行描述、构造,形成一个统一的、公共的、具有广泛...

    面向对象软件开发和过程(七)业务建模

    我们把业务建模这个概念放在了最后的部分,因为面向对象是业务建模的基础。面向对象是一种用计算机语言模拟现实生活的技术。而传统的语言是基于时序的,是计算机观点的语言,和人们熟悉的社会观点是不同的...

    基于UML网上选课系统的分析设计

    UML是面向对象技术领域中占主导地位的标准建模语言,它统一了过去相互独立的数十种面向对象的建模语言共同存在的局面,通过统一语义和符号表示,系统对软件工程进行描述、构造,形成一个统一的、公共的、具有广泛...

Global site tag (gtag.js) - Google Analytics