软件工程第九章面向对象方法学.ppt

上传人:本田雅阁 文档编号:2602027 上传时间:2019-04-16 格式:PPT 页数:95 大小:310.51KB
返回 下载 相关 举报
软件工程第九章面向对象方法学.ppt_第1页
第1页 / 共95页
软件工程第九章面向对象方法学.ppt_第2页
第2页 / 共95页
软件工程第九章面向对象方法学.ppt_第3页
第3页 / 共95页
软件工程第九章面向对象方法学.ppt_第4页
第4页 / 共95页
软件工程第九章面向对象方法学.ppt_第5页
第5页 / 共95页
点击查看更多>>
资源描述

《软件工程第九章面向对象方法学.ppt》由会员分享,可在线阅读,更多相关《软件工程第九章面向对象方法学.ppt(95页珍藏版)》请在三一文库上搜索。

1、第九章 面向对象方法学,9.1 面向对象方法学引论,3,1 传统方法学的缺点,传统的生命周期方法学的本质,是在具体的软件开发工作开始之前,通过需求分析预先定义软件需求,然后一个阶段接着一个阶段有条不紊地开发用户所要求的软件,实现预先定义的软件需求。 但它并不能完全消除软件危机。生命周期方法学仍然有许多不足之处,对某些类型的软件开发,这种方法学比较适用,对另一些类型的软件则可能完全不适用。,4,存在的问题,1生产率提高的幅度远不能满足需要 生命周期方法学强调需求分析的重要性,强调在每个阶段结束之前必须进行评审,从而提高了软件开发的成功率,减少了重大返工的次数; 开发过程中实行严格的质量管理,采用

2、先进的技术方法(主要是结构分析、设计、编程技术)和软件工具,也都加快了软件开发的速度。 但开发效率的提高仍然很有限,提高的幅度远远赶不上对软件产品的需要。 从用户提出要求到他们最终得到所需要的目标系统,往往需要经过几年甚至更长的延迟时间。,5,2软件重用程度很低 重用也称为再用或复用,是指同一事物不经修改或稍加改动就多次重复使用。 软件重用是节约人力,提高软件生产率的重要途径。 结构分析、结构设计和结构程序设计(简写为 SASDSP)技术,虽然给软件产业带来了巨大进步,但却没能很好地解决软件 重用问题。 几乎每次开发一个新的软件系统时,都要针对这个具体的系统作大量重复而又繁琐的工作。,6,3.

3、软件仍然很难维护 传统的生命周期方法学强调文档资料的重要性,规定最终的软件产品应该由完整、致的配置成分组成;在软件开发整个过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要质量指标。因此,对这样的软件所进行的维护属于结构化维护的范畴,可维护性有比较明显的提高,软件从不能维护变成基本上可以维护。 但实践表明,即使是用生命周期方法学开发出的软件,维护起来仍然相当困难,软件维护成本仍然很高。,7,4软件往往不能真正满足用户需要 用传统方法开发涉及多种不同领域知识的大型软件系统,或开发需求模糊或需求动态变化的系统时,所开发出的软件系统往往不能真正满足用户的需要。 所谓“不能真正满足用户的需要

4、”,主要有以下两种表现: 一种是开发人员不能完全获 得或不能彻底理解用户的需求,以致开发出的软件系统与用户预期的系统不一致,不能满足用户的需要。 另一种表现是,所开发出的系统不能适应用户需求经常变化的情况,系统的稳定性和可扩充性不能满足要求。,8,出现问题的原因,1僵化的设计模型 瀑布模型意味着在生命周期各阶段间存在着严格的顺序性和依赖性。生命周期方法学特别强调预先定义需求的重要性。 要求在着手进行具体的开发工作之前,必须通过需求分析预先定义并“冻结”软件需求,然后再一步一步地实现这些需求。,9,实践表明,在系统建立起来之前,往往很难仅仅依靠分析就确定出一套完整、准确、一致、有效的应用需求,这

5、种预先定义需求的方法更不能适应用户需求不断变化的情况: 预先定义需求的策略所作的假设,只对某些软件成立,对于多数软件并不成立。人们为了充实和细化他们的初步设想,通常需要经过在某个能运行的系统上的实践过程。 项目参与者之间存在通信鸿沟 良好的通信和相互理解对于保证工程成功是至关重要的。 各种文档,本质上是被动、静止的通信工具,通过它们来理解一个动态系统是困难的。,10,预先定义的需求可能是过时的 一些类型的软件,用户对它们的需求与外部环境、公司经营策略或经营内容等密切相关,因此是随时间变化的,在不同时间用户的需求可能有较大不同。采用预先定义需求的策略,在一年或数年之前预先指定对需求随时间变化的软

6、件的需求,显然是不切实际的。 按照这样预先指定的需求开发软件,当软件开发出来的时候就已经过时了,不符合那时的用户需要了。然而按照生命周期方法学,在开发后期修改需求需付出很高代价,甚至根本不可能修改。,11,2结构化技术的缺点 用这种技术开发出的软件,其稳定性、可修改性和可重用性都比较差。 围绕实现处理功能的“过程”来构造系统的。然而用户需求的变化大部分是针对功能的不稳定性 清楚地定义了目标系统的边界,软件通过界面与客观世界通信。系统结构依赖于对系统边界的定义,很难把这样的系统扩展到新的边界系统较难修改和扩充 把处理分解成子处理的过程多少带些任意性,并且把数据和操作作为分离的实体可重用性差,12

7、,2 软件工程的新途径,快速原型法 克服传统方法学的致命弱点所开发出的系统往往不能真正满足用户的需要 1区分两类不同的软件系统 一类系统的需求比较稳定而且能够预先指定预先指定的系统。开发这类系统应该预先进行严格的形式化的需求分析,制定出很精确的需求规格说明,并在严格管理下采用形式化的开发生命周期。,13,另一类系统的需求是模糊的或随时间变化的,通常在系统安装运行之后,还会由用户驱动对需求进行动态修改用户驱动的系统。 开发这类系统需要采用一种适于进行反复试探的技术。这类系统必须具有能够快速、简便地进行调整的特性,以便在运行使用的过程中,及时根据用户需求的变化相应地修改系统。,14,2快速原型法简

8、介 快速原型法(原型法):从常规的程序设计方法和僵化的瀑布模型开发(传统的自顶向下的开发)模式,飞跃到一种快速、灵活、交互式的软件开发。 其核心是,用交互的、快速建立起来的原型取代了形式的、僵硬的(不允许更改的)大部头的规格说明,用户通过在计算机上实际运行和试用原型系统而向开发者提供真实的反馈意见。,15,原型法的基本思想: 首先建立一个能反映用户主要需求的原型系统,让用户在计算机上运行、试用这个原型系统,通过实践,了解未来系统的概貌,提出许多修改意见,根据这些意见,快速修改原型系统,然后用户再次试用修改后的原型系统 用户在试用原型系统的过程中,很容易判断它是否真正满足自己的业务工作需要。 软

9、件开发人员首先向用户提供一个“样品”(即原型系统),用户经过试用向开发人员作出“反馈”。通过“试用一反馈一修改”的多次反复,最终开发出真正符合用户需要的应用系统,这就是用原型法开发软件的优点。,16,3用原型法开发软件的过程 (1)抛弃原型法 目的:是评价目标系统的某个(或某些)特性,以便更准确地确定需求,或者更严格地验证设计方案。 使用完之后就把这种原型系统抛弃掉,然后再重新建立正式的目标系统。 本质上仍属于瀑布模型,建立原型只不过是一种辅助性的步骤。,17,(2)演化原型法(高度迭代的动态方法) 在每次迭代过程中,都要再次分析和确定需求,再次进行设计,再次实现系统,以及再次进行测试和评价。

10、 基本作法:分析用户需求实现原型系统用户试用意见对原型进行修改和扩充用户试用,18,面向对象方法学,面向对象方法简介 出发点和基本原则:尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。,19,面向对象方法的四个要点: 认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。 面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。,20,把所有对象都划分成各种对象类

11、(简称为类, Class),每个对象类都定义了一组数据和一组方法。数据用于表示对象的静态属性,是对象的状态信息。 类中定义的方法,是允许施加于该类对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。,21,按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。 在这种层次结构中,通常下层的派生类具有和上层的基类相同的特性(包括数据和方法),这种现象称为继承。 但是,如果在派生类中对某些特性又做了重新描述,则在派生类中的这些特性将以新描述为准,也就是说,低层的特性将屏蔽高层的同名特性。,22,对象彼此之间仅能通过传递消息互相

12、联系。 对象与传统的数据有本质区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体,必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。 一切局部于该对象的私有信息,都被封装在该对象类的定义中,就好像装在一个黑盒子中一样,在外界是看不见的,更不能直接使用,这就是“封装性”。,23,OO = Objects Classes Inheritance Communication with messages,24,2面向对象方法的主要优点 (1)与人类习惯的思维方法一致 (2)稳定性好 (3)可重用性好 (4)可维护性好,25,两种新途径的结合,两种

13、新途径并不是相互排斥的,相反,它们是相互促进相互补充的,很容易把这两种途径结合起来以获得更好的效果。 面向对象方法所带来的稳定性、可重用性和可维护性等优点,对于用快速原型法成功地开发软件来说,是至关重要的。,26,三种软件开发模式的软件特点:,1传统的瀑布模型 在开发时期内没有或很少有需求变化; 对应用领域很熟悉(例如,扩充已存在的系统); 低风险项目(例如,对目标和开发环境很熟悉); 除了在早期阶段,用户对开发工作参与很少; 要求使用面向过程的编程语言。,27,2螺旋模型 在项目开发的早期需求可能有变化; 对应用领域较熟悉; 中等风险项目(例如,对目标和开发环境较熟悉); 用户不同程度地参与

14、整个项目的开发过程; 使用面向对象语言或第四代语言。,28,3渐增模型 在整个开发过程中采求都可能有变化; 对应用领域不熟悉; 高风险项目。 用户完全参与到整个开发过程中; 使用面向对象语言或第四代语言。,29,结构分析、设计技术本质上是线性的,是建立在软件生命周期概念的基础之上的,这种技术与瀑布模型紧密地结合在一起。 面向对象的软件技术并不是基于某种开发模式的技术,它既可以用于瀑布模式中也可以用于螺旋模式或渐增模式中。 使用面向对象方法学开发软件时,可以采用最适用于所开发软件特点的开发模式。,30,使用面向对象方法学开发软件时,工作重点是生命周期中的分析阶段。 在开发的早期阶段定义了一系列面

15、向问题的对象,并且在整个开发过程中不断充实和扩充这些对象。 对生命周期各阶段的区分不太重要、不明显。分析阶段得到的对象模型也适用于设计阶段和实现阶段。 各阶段都使用统一的概念和表示符号,整个开发过程都是吻合一致的,,31,3 基本概念,1 对象 对象是对问题域中某个实体的抽象,设立某个对象就反映了软件系统保存有关它的信息并且与它进行交互的能力。 面向对象方法学中的对象是由描述该对象属性的数据以及可以对这些数据施加的所有操作封装在一起构成的统一体。,32,1对象的形象表示,33,实现对象操作的代码和数据是隐藏在对象内部的,一个对象好象是一个黑盒子,表示它内部状态的数据和实现各个操作的代码及局部数

16、据,都被封装在这个黑盒子内部,在外面是看不见的,更不能从外面去访问或修改这些数据或代码。 使用对象时只需知道它向外界提供的接口形式而无须知道它的内部实现算法,不仅使得对象的使用变得非常简单、方便,而且具有很高的安全性和可靠性。,34,2对象的定义(三种定义形式) (1)对象是具有相同状态的一组操作的集合。(面向对象程序设计的角度) (2)对象是对属性值和操作的封装。(信息模拟的角度) (3)对象:( ID, MS, DS, MI) ID是对象的标识或名字 MS是对象中的操作集合 DS是对象的数据结构 M!是对象受理的消息名集合(即对外接口),35,3对象的特点 以数据为中心 对象是主动的 实现

17、了数据封装 本质上具有并行性 模块独立性好,36,2 其他概念,1类(Class) “类”就是对具有相同数据和相同操作的一组相似对象的定义。 类是对具有相同属性和行为的一个或多个对象的描述。 例如:Circle类,37,2实例(Instance) 实例就是由某个特定的类所描述的一个具体的对象。 实际上类是建立对象时使用的“样板”,按照这个样板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。,38,3消息( Message) 消息是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。 一个消息由三部分组成: 接收消息的对象; 消息选择符(也称为消息名); 零个或多个变元。 例

18、如:MyCircleShow(GREEN),39,4方法(Method) 方法,就是对象所能执行的操作,也就是类中所定义的服务。 方法描述了对象执行操作的算法,响应消息的方法。(在 C十语言中把方法称为成员函数) 例如:Circle类中成员函数 Show(int color)的定义,即这个成员函数的实现代码。,40,5属性( Attribute) 属性,就是类中所定义的数据,它是对客观世界实体所具有的性质的抽象。类的每个实例都有自己特有的属性值。 在 C十语言中把属性称为数据成员 例如: Circle类中定义的代表圆少坐标、半径、颜色等的数据成员,就是圆的属性。,41,6继承(Inherita

19、nce) 继承是指能够直接获得已有的性质和特征,而不必重复定义它们。 在面向对象的软件技术中,继承是子类自动地共享基类中定义的数据和方法的机制。,42,继承的特性,继承具有传递性 当一个类只允许有一个父类时,也就是说,当类等级为树形结构时,类的继承是单继承;当允许一个类有多个父类时,类的继承是多重继承。 继承性使得相似的对象可以共享程序代码和数据结构,从而大大减少了程序中的冗余信息。 派生出新的子类的办法,使得对软件的修改变得更加容易。,43,7多态性(Polymorphism) 多态性是指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。 不同层次中的每个类

20、各自按自己的需要来实现行为。当对象接收到发送给它的消息时,根据该对象所属于的类动态选用在该类中定义的实现算法。 多态性是通过虚函数来实现的。 显著提高了软件的可重用性和可扩充性。,44,8重载(Overloading) 函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字; 运算符重载是指同一个运算符可以施加于不同类型的操作数上面。,45,4 面向对象建摸,模型是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。 由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。,46,建模的必要性,帮助我们思考问题、定义术语、在选择术语

21、时作出适当的假设,并且可以帮助我们保持定义和假设的一致性。 建模的目的主要是为了减少系统复杂性。 模型提供了组织大量信息的一种有效机制。 由于模型的规范化和系统化,因此比较容易暴露出系统分析员对目标系统认识的片面性和不一致性。 模型经过多次必要的修改,为后续的开发工作奠定了坚实基础。,47,面向对象方法最基本的原则,按照人们习惯的思维方式,用面向对象观点建立问题域的模型,开发出尽可能自然地表现求解方法的软件。 三种形式的模型 对象模型(描述系统数据结构,最重要、最基本、最核心) 动态模型(描述系统控制结构) 功能模型(描述系统功能),48,5 对象模型,对象模型表示静态的、结构化的系统的“数据

22、”性质。 它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。 为建立动态模型和功能模型,提供了实质性的框架。 建立对象模型的目标是从客观世界中提炼出对具体应用有价值的概念。,49,建立对象模型的表示方法包含的符号: 表示类的符号(应该既能表示属性又能表示服务); 表示对象(类实例)的符号; 表示继承关系的符号; 表示类和(或)对象问其他关系的符号。,50,表示类-对象的图形符号,1.类对象:含义是“一个类及属于该类的对象” 类对象 类,51,2命名 命名是否恰当对系统的可理解性影响相当大 应遵守的几条准则: (1)使用标准术语 (2)使用具有确切含义的名词 (3)必

23、要时用名词短语作名字 即富于描述性、简洁而且无二义性。,52,表示结构的图形符号,结构表示了问题域中的复杂关系,是对客观世界实体相互间关系的抽象。目标系统的任务决定了系统的结构。 类对象间的关系可以概括为归纳关系、组合关系及关联关系。,53,1归纳关系(“一般-特殊”关系) 反映了一个类与若干个互不相容的子类之间的分类关系。,54,2组合关系(“整体-部分”关系、聚集关系。)反映了对象之间的构成关系。具有传递性。,55,聚集树,56,3.关联关系 反映对象之间相互依赖、相互作用的关系。 (1)表示符号:用相互依赖、相互作用的两个对象之间的连线表示 (2)阶:是参与关联的对象的个数。阶数用标在连

24、线端点的单个数字或数值区间表示,57,(3)链属性:是关联链的性质。,58,(4)限定 一个受限的关联由两个对象及一个限定词组成。可以把限定词看作是一种特殊的链属性。利用限定词通常能有效地减少关联的阶数。,59,(5)消息连接 反映了一个对象对另一个对象的处理依赖性。这种关系表明,一个对象为了完成自己的任务,需要借助于另一个对象提供的服务。,60,例子 某公司对象模型,61,案例实践,问题1 在进行软件设计和选择软件开发工具之前,是否进行开发方法学的选择?,62,所谓方法学是指组织软件生产过程的一系列方法、技术和规范。方法学是软件开发者长年失败和成功经验的理论性总结,从软件重用的思路来说,方法

25、学重用的价值远非某些程序组件重用可比。,63,以北京市公路局系统为例 首先,在系统调查阶段我们了解到:这个系统要分期 (递增式) 开发。由于处于机构改革时期,系统生存期内的用户需求和系统结构变因很多。这表明目标系统应该具有较强的可维护性,即每期开发成果应在后续工程中具有较高的可重用率。 其次,一期工程的工作量相当大(最后成果包括 124 个模块、72 类报表、119个数据库表、439 个窗口、912 个数据窗口),而开发者对公路局业务不了解,多为经验不足的大学生,理解需求的能力较低。 这表明采用的开发方法学必须能最大限度地减少重复劳动,实现开发过程中的成果共享和重用;必须能支持消除需求理解误差

26、的调整工序,使下游成品阶段的设计变更比较容易进行。,64,参照国外软件开发工作量计算方法,即仅下游120个模块 (含报表) 的编码和测试为41人月,那么公路局系统从上游设计开始近200个模块和报表、100多个数据库表的开发工作量至少也应在120人月以上。 由于采用了面向对象的软件工程方法,尽管开发人员大多经验不足,但是第一期工程总工时最终仍控制在 80 人月以内,降低成本1/3左右。同时在系统可维护性、重用度及其他功能和性能指标上,均超过了我们以往采用结构化方法开发的系统。,65,对停留在程序主导级开发的软件开发人员来说,他们选择 OOP 的原因也往往是被动的。其实,在程序主导开发者的辞典中是

27、找不到“方法学”这一词的,或者把“方法学”与“程序算法”混为一谈。至于把 OOP 看成是 OOSE 的全部就更不足为怪了。,66,问题2 对象抽象的出发点是现实世界的问题描述,还是可执行的实例对象?,67,在现实世界早期抽象阶段,面向对象方法与其他方法区别并不大,都要从现实世界的问题描述出发,即从用户接口、问题领域的知识和经验出发,构筑现实世界的问题模型,也就是确定目标系统是“做什么的”。 面向对象的问题分析模型从3个侧面进行描述,即对象模型 (对象的静态结构)、动态模型(对象相互作用的顺序)和功能模型(数据变换及功能依存关系)。 软件工程的抽象原则、层次原则和分割原则同样适用于面向对象方法,

28、即对象抽象与功能抽象原则是一样的,也是从高级到低级、从逻辑到物理,逐级细分。每一级抽象都重复对象建模 (对象识别)动态建模(事件识别)功能建模(操作识别)的过程,直到每一个对象实例在物理(程序编码)上全部实现。,68,对象抽象是从逻辑级还是物理级出发,与开发前是否进行方法学选择一样,也是区分OOSE 与 OOP 的试金石。 由于许多工具或语言(如PB、C、Motif) 都支持OOP,使一些程序级系统开发人员可以很方便地不经过逻辑抽象就直接开发物理对象,在早期阶段意识不到从物理层即实例对象出发进行系统开发的祸患,孰不知正是这种随心所欲的 OOP 不仅无法发挥面向对象方法应有的优越性,而且还会给开

29、发后期带来大量返工作业。,69,和以往采用结构化方法一样,我们在系统设计阶段也引入了原型化方法,以便用系统样品即原型与用户对话,求得对需求理解的勾通,避免或减少后期返工。 大多OOP工具都为开发原型提供便利,问题在于原型与最终产品间的关系,即原型是逻辑对象还是物理对象的样品。若是后者,那就等同于最终产品。 在木已成舟时再让用户评审,若发现问题,要么推倒重来,要么强迫用户削足适履。事实上,我们为设计评审而基于逻辑对象开发的原型,相当部分被用户否决。 但由于尚未进行对象实例即物理级开发,而是使用超类对象原型统一模拟对象事件和操作,所以无论是对象模型、动态模型还是功能模型,修改起来都不困难。,70,

30、问题3 设计阶段是否先设计超类,是否在实例对象设计开始之前完成超类对象的实现?,71,面向对象方法开发出的软件具有较强的可重用性,这种重用包括开发项目内部的重用和外部的重用。重用依存于超类设计,没有超类的对象系统好比“把洗衣机当米缸”,不能物尽其用。超类设计的好与不好,首先看其内部重用率的高低,内部重用率高,必然外部重用率也高。 由于系统开发工期紧、工作量大,而我们的开发队伍年轻,经验和人力都不足,内部重用率高的超类开发无疑是我们的救星。它可以减少重复劳动,易于统一规格,对复杂问题统一攻关、统一解决,便于统一维护。,72,对超类的抽象即实例对象的泛化原则,我们是从下面几个方面考虑的: (1)寻

31、找大多数实例对象的共同行为。 例如“打印报表”、“查询静态代码表”、“录入数据库表数据”等。 (2)超类的多态性设计要保证使用超类继承关系可以满足各子类的操作要求。 例如,继承同一个“数据录入”祖先窗口,可以完成不同结构数据库表的数据录入。,73,(3)利于信息的隐蔽性,不会破坏数据的完整性,利于将复杂问题简单化。 例如,对具有复杂关系、结构及相关存取操作的数据库表集的维护。如果不使用一个泛化类将数据结构及其相关操作封装起来,下层程序员要想操作有关库表就必须对库表设计有深入的了解,并且确保程序算法设计不得破坏数据的相关一致性,这将大大增加程序设计和测试的难度,要求程序员有较丰富的经验。而采用这

32、种泛化类 (公用函数、公用存储过程) 后,程序员所要做的只是发“消息”和取“输出信息”了。,74,显然,超类的设计和实现必须在程序员普遍进行实例对象开发之前完成。也就是说,OOSE 的上游系统设计人员必须文武 (设计与编程) 双全,能够担负起超类对象的程序实现与测试任务,这与结构化方法的上层系统设计人员基本可以不编程有所不同。同时,超类对象在下游开发过程中必须经常吸收特化过程中的反馈(包括来自用户的反馈),进行相应的调整修改。所以OOSE担任超类对象设计与实现的设计人员很难像结构化方法那样进入编程阶段后就可以稍事轻松,他们往往始终离不开编程现场。,75,如果设计阶段不预先设计和开发出超类对象,

33、在同一项目的多数开发者之间没有可以共同继承的祖先对象,甚至在各个开发人员自己的作用范围内都不使用继承关系,那么这不仅不是OOSE,就连称之为OOP都很勉强。,76,问题4 如何处理对象模型面向对象关系数据库模式的映射?,77,面向对象的数据库设计方法可以用于各种数据库,如层次型、网络型、关系型,当然也包括面向对象型。OOSE 中的数据库设计无疑必须采用面向对象的数据库设计方法。 数据库设计也称数据库模式,基本上由3个层次的模式构成:从特定DB应用角度来看待DB设计的外部模式;从组织或企业角度出发进行的DB设计即概念模式;处理对应特定 DBMS 特征与局限性的DB设计即内部模式。具体而言,内部模

34、式是数据库的SQL定义,逻辑模式是表集合的逻辑定义,外部模式是从特定应用角度看的局部DB。外部模式与逻辑模式之间的接口是视图、存储过程或其他驻在服务器端的DB处理程序。,78,如果在抽象出的对象模型中,各个应用分别是一个或多个超类对象的子对象,那么,选择适当细分层次的对象模型将其映射到概念模型,是数据库库表对象设计的关键。外部模式与概念模式之间的接口越少、越简单越好,这样的程序设计简单,数据库和程序都易于维护。也就是说,局部化是个重要的设计原则。 OOP多是数据库的后端处理,是基于既存数据库的。因此无论是否进行过问题世界的对象建模,以及是否将对象模型合理地映射到数据库逻辑模式 (面向对象数据库

35、设计),OOP 都可以工作。,79,问题5 编程时是否先调查有无可重用 (继承) 对象,是否参与下层对象对上层对象、超类对象的反馈?,80,埋头于自己分担的程序对结构化方法或许是必须的,但在面向对象方法中担任程序设计的开发人员,应该先去调查对象数据辞典中有无其他开发人员已经完成、自己稍加特化就可重用的对象。从总体上说,对象的共享、重用应该由上层设计人员统一管理,以便保证对象风格的一致性,避免冲突。但是,对象的独立性、封装性和多态性都很便于重用,这是结构化系统所不能比拟的,而重用是软件开发方法学的最重要思想之一。上层设计人员往往不可能面面俱到,懂得软件设计理论的开发人员,即使只开发下层程序也应采

36、用最省力、最有效率的编程方法,即大量使用重用对象。,81,在继承超类对象和重用他人对象时,若发现有设计不合理的地方,应该及时反映给对象开发的承担者。 对上层设计人员来说,一方面应该鼓励程序实现人员重用既存对象,另一方面应通过开发人员共享对象数据辞典,使个别的对象重用能够立即反映到整体对象模型中,以保证设计变更时的一致性。,82,面向对象方法与结构化方法比较,83,分析是问题抽象 (做什么),设计是问题求解 (怎么做),实现是问题的解 (结果)。任何方法学对客观世界的抽象和求解过程都是如此。在问题抽象阶段,结构化方法面向过程,按照数据变换的过程寻找问题的结点,对问题进行分解。因此,与面向对象方法

37、强调的对象模型不同,描述数据变换的功能模型是结构化方法的重点。如果问题世界的功能比数据更复杂或者更重要,那么结构化方法仍然应是首选的方法学。如果数据结构复杂且变换并不多,那么如以过程主导分析和设计,一旦有系统变更就会给下游开发带来极大混乱。,84,由于对过程的理解不同,面向过程的功能细分所分割出的功能模块有时会因人而异。而面向对象的对象细分,从同一问题领域的对象出发,不同人得出相同结论的比率较高。 在设计上,结构化方法学产生自顶向下、结构清晰的系统结构。每个模块有可能保持较强的独立性,但它往往与数据库结构相独立,功能模块与数据库逻辑模式间没有映射关系,程序与数据结构很难封装在一起。如果数据结构

38、复杂,模块独立性很难保证。面向对象方法抽象的系统结构往往并不比结构化方法产生的系统结构简单,但它能映射到数据库结构中,很容易实现程序与数据结构的封装。,85,在软件工程基本原则中有一条“形式化原则”,即对问题世界的抽象结论应该以形式化语言 (图形语言、伪码语言等) 表述出来。结构化方法可以用数据流图、系统结构图、数据辞典、状态转移图、实体关系图来进行系统逻辑模型的描述;而面向对象方法可以使用对象模型图、数据辞典、动态模型图、功能模型图。其中对象模型图近似系统结构图与实体关系图的结合,动态模型图类似状态迁移图,功能模型图类似数据流图。,86,公路局系统有 100 多个数据库表,但数据的加工 (变

39、换) 很单纯,如果当初选择结构化方法学,情况会怎么样? 在问题抽象的最初阶段不会有太大差异。由于数据变换少,可以把对象和对象的操作看成一一对应,即最初问题描述的对象模型与功能模型基本一致。以其中计划管理处子系统为例,对象是计划管理员、规划管理员、概预算管理员、统计管理员,功能 (操作) 是计划、规划、概预算、统计。,87,问题存在于下层抽象里。 首先,许多公共超类对象设计与结构化方法相悖,因为它破坏了过程的连续性及系统结构的逻辑层次性,把一些下层模块及在过程分析中没有语义的对象,放在系统结构的上层。因此如果采用结构化方法,须将继承关系改为下层模块调用关系。但是事实上,祖先对象的一些状态 (属性

40、值) 是从主控模块直接得到指示而确定的;从控制角度说,它的确处于系统的上层地位。如果采用结构化方法,结果将是要么把系统结构变成网络状,失去结构化特征,要么放弃这种统一完成重复性劳动的设计方案。,88,其次,应用对象模型向数据库概念模式的映射设计也是该系统采用面向对象方法的一个标志。如果使用结构化方法,数据库模式可能映射客观世界的数据结构。由于公路、养路单位、管理单位、路况、桥梁、隧道及道路上的绿化情况等各实体间客观存在着复杂的多重关系,其结果可能定义出一个像蜘蛛网似的关系库结构,因而大大加重了数据库前端应用编程和数据库维护的负担。,89,总之,该系统若使用结构化方法,系统结构和数据库结构都可能

41、成为网状结构,且互相无关。而目前采用的面向对象方法,系统结构和数据库结构都是多重继承结构,相互存在映射关系。显然前者较后者复杂性高、可维护性差、内部重用难度大、重用率低。 其实,无论是用什么方法学开发软件,交给用户的都应该是满足用户当前需求的软件。用户在短期内不会发现开发者使用先进方法学给他们带来的益处,倒是开发者本身由于大大减轻了开发负担而最先受益。但是随着时间的推移,获得最大收益的还是用户,因为软件的长期质量(包括维护成本低和生存周期长)给用户带来的好处才是根本的。,90,方法学是思路不是定律,91,对于方法学,是这样理解的: (1)方法学的目的是:使后人分享前人的成功,避开前人的失败,把

42、注意力集中在尚未开拓领域的创造性劳动上。所以方法学与开发人员的创造性是绝不冲突的。它既不能像法律那样靠权威来界定是非边界,也不能像定律那样通过证明和推理给出普遍结论。如果一定要做比喻的话,它好比人的世界观。,92,(2)没有放之四海而皆准的方法学,任何方法学都有其局限性,所以软件开发人员大可不必拘泥于某种特定的方法学。 例如,面向对象方法的对象模型图,这种形式化语言远不如结构化方法的结构图和数据流图简单明了,倘若把公路局系统全部用对象模型图表述出来,至少也要几十页。由于最上层功能模型与对象模型是一致的,所以我们采用的是结构化方法的系统结构图。,93,(3)事实表明,由 OOP 带动的 OOSE

43、 方法确实比结构化方法更能自然地抽象现实世界,而且一些 OOP 工具确实已相当成熟。相反,结构化方法及开放平台下的结构化程序开发工具,虽然不能说止步不前,但其近年来的进步是有限的。,94,(4)根据我们的体会,对实践 OOSE 有以下一些建议: 1 最好在选定方法学后,对全体开发人员进行一次关于面向对象方法学的培训。 2 由于有超类对象的提前开发工作,OOSE 的上游设计工作量比结构化方法的上游工作负担重,时间和人力应该更充足一些。否则到下游开发后再追加或多次修改变更超类对象,容易造成混乱和无效劳动。 3 由于系统越大对象类越多,为了便于内部重用和共享,应该建立电子化的对象数据辞典,以便对对象进行统一归类管理。,95,4 应该有严格的命名规则,如果可能,应将命名规则集成到数据辞典中。 5 下层开发铺开后,如果发现应该对某些实例对象泛化成新的超类对象,必须尽快进行新超类追加的设计,变更越快越好。 6 子对象继承超类对象后,发现超类设计的缺陷是常有的事。开发队伍内部应有很畅通的反馈渠道,使超类得到及时的修正。子对象切不可轻易将超类对象封杀掉,使系统失去统一控制。遵从系统设计中定义的继承关系进行实例对象开发应该成为全体开发人员的理念。 7 面向对象设计的好处越到后来越显著,特别是在系统维护和扩充方面。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1