多变且复杂的需求
如果没有多变的需求,也许就没有今天的面向对象软件,我们曾经试图通过需求管理、需求跟踪等等管理方式约束和减少需求频繁更新带给软件的冲击,可是这样下去的结果只有一个:使得软件更加僵化;或者程序员更加 劳累。
需求不但多变,而且经常是不可能第一次就能掌握,需求反映了某个领域的专业知识,例如数学、管理、财务或 电子商务等等,每个特定案例需求又有其特别复杂之处,几乎没有人能够第一次接触就可以深入掌握这些专业领域的 需求本质,就是专门的建模专家也不例外。
既然需求是多变而且复杂的,所以,就不能使用“堵”式方法对其进行控制和管理,只能顺势而为,通过灵活多变的 以及迭代反复的方式逐步抓住需求,并且作为需求的实现软件系统必须能够迅速应对需求变化,需求变化有多快,软件 变化就有多快。
因此,对于多变的需求,我们的解决之道是:引入灵活多变的架构,面向对象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建模。
(以上文字源自板桥本人的第四届中国软件技术大会“领域设计建模”演讲稿 )
分享到:
相关推荐
面向对象的UML建模技术是软件开发领域中一种重要的设计和沟通工具,它通过图形化的方式描绘出系统的结构和行为,使得开发人员能够更好地理解、设计和实现复杂的软件系统。本课程涵盖了UML(统一建模语言)的核心概念...
UML(Unified Modeling Language),统一建模语言,是一种在软件工程领域广泛使用的可视化建模工具,尤其在面向对象的设计中起到关键作用。它提供了一种标准化的方式来描述系统的静态结构和动态行为,使得开发者、...
面向对象建模是软件开发中的核心概念,尤其在GIS(地理信息系统)领域,它有助于理解和构建复杂的系统结构。GIS面向对象分析涉及对现实世界地理实体的抽象和建模,以便在计算机系统中进行处理。张老师的课件中提到了...
面向对象分析与设计是软件开发领域中的核心概念,它结合了计算机科学、工程学和管理学的方法,旨在创建高效、可维护的软件系统。在这个过程中,UML(统一建模语言)扮演着至关重要的角色,它是面向对象设计的标准化...
根据提供的信息,我们可以总结并深入探讨《UML面向对象建模与设计(第二版)》这一书籍中的关键知识点。此书是由Michael Blaha和James Rumbaugh共同编著的,是一本面向对象技术领域的权威性著作。以下是书中涵盖的...
其次,面向对象分析(OOA)是系统分析阶段的关键,侧重于识别和理解领域内的实体和它们之间的关系,将这些实体建模为对象。这有助于更准确地捕捉业务需求,确保软件设计与实际问题的对应。 再者,面向对象设计(OOD...
面向对象分析与设计是软件工程领域内,一种被广泛采用的方法,用来开发可靠的软件系统。该方法专注于对现实世界问题建模的过程,通过将系统分解成小的、可管理的部分(称为对象)来简化复杂的问题。 1. 面向对象...
《UML面向对象建模与设计》这本书由Michael Blaha与James Rumbaugh共同撰写,是面向对象设计领域的重要参考书籍之一。书中通过丰富的案例与实践指导,为读者提供了系统而深入的面向对象建模方法论。本次提供的资料是...
《UML面向对象建模基础》是一门深入探讨面向对象设计和建模技术的课程,由专家徐锋编撰的电子教案提供了丰富的教学资源。UML(统一建模语言)是软件工程领域中广泛使用的标准化建模语言,用于可视化、理解和文档化...
面向对象分析与设计是软件开发领域中的核心概念,它结合了计算机科学、工程学和管理学的原理,用于创建高效、可维护的软件系统。UML(统一建模语言)2.0版则是这一领域中广泛使用的标准化建模工具,为理解和表达面向...
UML(Unified Modeling Language),即统一建模语言,是一种标准的图形化建模语言,用于软件工程领域,特别是面向对象设计和分析。UML提供了一种可视化的方式来描述系统的需求、结构和行为,使得开发团队能够更清晰...
### 面向对象分析与设计(第3版) #### 知识点概览 《面向对象分析与设计(第3版)》是一本全面介绍面向对象方法论的经典著作,由Grady Booch、Robert A. Maksimchuk、Michael W. Engle、Bobbi J. Young、Jim ...
面向对象系统分析与设计是软件工程领域的一个重要部分,它涉及如何使用面向对象的方法来分析和设计软件系统。面向对象方法强调的是用现实世界中的概念来模拟软件系统中的实体和它们之间的交互。以下是一些在面向对象...
面向领域建模(Domain-Driven Design,简称DDD)是一种软件开发方法,由Eric Evans在其同名著作《领域驱动设计:软件核心复杂性应对之道》中提出。DDD的核心思想是将复杂的业务逻辑通过深入理解领域知识来建模,使得...
Grady Booch,作为IBM的杰出工程师和畅销书作者,他在面向对象领域的贡献尤为突出。 在《面向对象分析与设计(第3版)》一书中,Booch 和其他作者一起,向读者展示了如何通过统一建模语言UML(Unified Modeling ...