程序设计方法学第六章面向对象程序设计方法学概述.ppt

上传人:夺命阿水 文档编号:259538 上传时间:2023-03-30 格式:PPT 页数:57 大小:1.39MB
返回 下载 相关 举报
程序设计方法学第六章面向对象程序设计方法学概述.ppt_第1页
第1页 / 共57页
程序设计方法学第六章面向对象程序设计方法学概述.ppt_第2页
第2页 / 共57页
程序设计方法学第六章面向对象程序设计方法学概述.ppt_第3页
第3页 / 共57页
程序设计方法学第六章面向对象程序设计方法学概述.ppt_第4页
第4页 / 共57页
程序设计方法学第六章面向对象程序设计方法学概述.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《程序设计方法学第六章面向对象程序设计方法学概述.ppt》由会员分享,可在线阅读,更多相关《程序设计方法学第六章面向对象程序设计方法学概述.ppt(57页珍藏版)》请在课桌文档上搜索。

1、第六章 面向对象程序设计方法学概述,面向对象程序设计方法学主要内容,1.面向对象程序设计方法的基本概念2.面向对象程序设计方法的起源3.面向对象计算的基本原理4.面向对象程序设计的基本原则5.面向对象分析与设计方法,基本概念,封装(encapsulation)信息/实现的隐藏(information/implementation hiding)对象标识(object identity)消息(message)类(class)继承(inheritance)多态性(polymorphism)接口(interface),基本概念,封装,将属性和操作包装成一个单元,使得对状态的访问和修改只能通过封装提供

2、的接口进行。信息/实现的隐藏,将某些属性或方法限制在封装内部使用,限制外部的可见性。对象标识,每个对象可以作为软件实体被标识和处理,每个对象都有一个对象标识符(object identifier OID)。消息,对象间发送请求的载体。接口,一组没有公共代码的对象共享实现。,基本概念,类,类是对象的类型(模版),对象是类的实例。继承,子类隐式使用超类(或父类)的属性和操作。多态性,子类覆盖(overriding)父类的方法,它和重载(overloading)的区别在于重载是在同一对象层次中,利用参数的不同来进行动态绑定(dynamic binding)。,面向对象程序设计方法的起源,1.符号抽象

3、Backus1957 的Fortran实现使用了人们习惯的符号记法,而且确保了编译后的运行效率。2.过程抽象C语言的发展使得函数概念的普及和大规模应用。一些相对完整的功能代码被封装在一个函数里面实现3.信息隐藏和抽象数据类型 Wirth1980的Modula-2语言实现了模块,在不降低运行效率的情况下实现了信息隐藏和抽象数据类型 4.类型抽象挪威计算中心的Kristen Nygaard和Ole-Johan Dahl开发了Simula67语言;70年代中期,Xerox Palo Alto研究中心开发了Smalltalk语言;这些语言用类、对象、重载、动态绑定技术实现了抽象数据类型,但是其运行效率

4、不能让人满意,其抽象类型概念也不能让人接收让人接受,直到C和C+,例子(c语言)过程抽象,stack.h/*declarationoftheinterfaceofmodulestackofcharater*/charpop();voidpush(char);conststack_size=100;,stack.cpp#includestack.h staticcharvstack_size;staticchar*p=v;charpop()/Checkforunderflowandpop voidpush(charc)/checkforoverflowandpush,进步:记法方便了程序设计 函

5、数理清了算法之间的关系缺点:过渡依赖全局数据 语言本身缺乏模块化的支持,例子(Modula-2)信息隐藏,define module stackexport qualified pop push;procedure pop(c:char);procedure push(c:char);end stackimplementation module stackfrom inout import writestringconst max=50;typeindex=0.max;stk:array index of chartop:index;procedure push(c:char);beginen

6、d push;begintop:=0;end stack.,module usestackfrom inout import write,writelnfrom stack import push,pop;varletter:char;beginpush(“A”);push(“B”);push(“C”);push(“D”);while NOT empty()doPop(letter);write(letter);end;end usestack.,进步:引入模块化概念,支持信息隐藏缺点:内建类型支持不好,缺乏类型抽象,例子(c+)类型抽象,class stackPublic:virtual p

7、ush(char var)=0;virtual char pop()=0;class stack_array:public stackpush(char var);,编程的风格变为:1.决定需要那些类 2.为每一个类提供完整的接口 3.为类、接口获得一般性(泛化)4.实现接口的算法,改进:内建类型支持好不足:缺乏对类型的类型 描述能力,例子(c+)类型泛化,template class stackpublic:virtual void push(T,改进:具有描述类型的 类型的能力缺点:只在设计时刻存 在一定程度的类型 泛化能力,例子(JAVA)类型反射,public class StackC

8、ount static String names=“array”,”list”;public static void main(String args)Class stackTypes=Class.forName(stack_array),Class.forName(“stack_list”);stackTypes0.newInstance().push(typenames0);stackTypes0.newInstance().push(typenames1),改进:类型不仅存在于设计时刻,而且在运行时刻能够动态的确定类 型。运行时刻的类型支持缩小了问题领域和机器领域的距离,使得对问题的抽象

9、更加方便的实现,面向对象的抽象原理,1.数据抽象原理 数据抽象提供了面向对象方法的始点,其核心就是实现了模块化与信息隐藏,同时它也是面向对象方法学的基础。2.行为共享原理 行为共享是指许多实体具有相同的接口,将不同实体的相同操作定义为抽象的操作将给用户带来方便。3.进化原理 进化包括两种含义:一是指系统随需求变化而修改和增加的情况;二是指对复杂问题的增量式的求解过程。进化建议面向对象对修改封 闭,对增加开放 4.正确性原理 正确性的问题主要是由行为共享所导致的,当一个实体请求另外一个实体的某种行为时候,系统必须确保能够在共享的行为组中找到正确的行为实现并运行它,面向对象计算模型是指对上述面向对

10、象抽象原理的具体实现技术,大部分面向对象语言使用如下三类技术 1.封装 封装实现了数据抽象技术 2.分类 分类是实现行为共享的基础 A 集合 B 抽象数据类型 C 类 3.共享 共享技术用于实现行为共享和进化原理。在面向对象语言系统中,共享又统称为多态性。多态性表明一个对象可以属于多于一个的分类,这样,就有可能让两个不同的分类共享相同的行为。,多态性,强制多态预先规定了语言中各种类型之间的映射关系,是一种隐式做类型转换的方法。例如:2.0+2.0、2.0+2、2.0+2 重载允许一个函数名使用多次,每次带有不同的参数,例如print(PrintWriter)和print(FileWriter)

11、,同样的命名使得程序容易设计和理解。强制和重载合起来被称为特定的多态性,因为两者都用于特定的目的,还有两种多态用于比特定多态更加基础的形式。参数化多态性,是为不同类型的参数提供相同的操作。假设一个队列需要同时支持两种类型,整型和字符型。在单态的系统中,需要建立两个类型来实现,这两个类型绝大多数代码类似或者相同;如果使用参数化多态,则可以指定队列参数的某种性质,而不是特定的类型,从而通过建立一个队列实现上述功能。通过模板概念实现参数化多态。,包含多态性是一种强调分类之间关系的程序设计风格,一种分类可以替代一种分类,分类之间不在孤立,分类之间体现了继承关系。通常期望面向对象的语言应该具有包含多态性

12、的特征,因为它是一种很好的实现自底向上的设计工具。然而。另外一种观点则认为目前对继承关系的滥用破坏了面向对象思想的优秀性,应该在面向对象程序中放弃继承,通过其它的方式实现行为共享原理。矛盾的焦点在于如何建立分类之间的关系。,多态性,一些面向对象的设计原则,1.开闭原则(OCP)2.里氏代换原则(LSP)3.依赖倒转原则(DIP)4.接口隔离原则(ISP)5.合成聚合复用原则(CARP)6.迪米特法则(LoD)7.单责任原则(SRP),开闭原则(OCP),开闭原则是面向对象程序设计的第一原则,这个原则最早由Bertrand Meyer提出:“Software entities should be

13、 open for extension,but closed for modification”,即一个软件实体应该对扩展开放,对修改关闭。也就是说,当一个软件需要增加或者修改某些功能时候,应该尽可能的只是在原来的实体中增加代码,而不是修改代码。开闭原则保证了系统具有一定的稳定性,同时保证了系统的灵活性。开闭原则的另外一个叫法称为“对可变性的封装原则”。,若财务部颁布主板和内存应使用额外费用,则需修改如下:,开闭原则(OCP),计算部件数组中各个部件价格的总和。,开闭原则(OCP),较好的一种设计方式是:将计价策略合并到Part的getPrice()方法中。Part和ConcretePart类

14、的示例如下:,里氏代换原则(LSP),里氏代换原则最早由Barbara Liskov提出:“基类出现的地方,子类一定可以出现”,也就是对基类是合法的操作,对子类也一定合法。正方形是否是长方形的子类?,里氏代换原则(LSP),长方形类public class Rectanglelong width;long height;public void setWidth(long width)this.width=width;public long getWidth()return width;public void setHeight(long height)this.height=height;pu

15、blic long getHeight()return height;,正方形类public class Square extends Rectanglepublic void setWidth(long width)this.width=width;this.height=width;public long getWidth()return width;public void setHeight(long height)this.width=height;this.height=height;public long getHeight()return height;,一个Rectangle对

16、象的合法操作,对Square却非法!public void resize(Rectangle r)while(r.getHeight()=r.getWidth()r.setHeight(r.getHeight()+1);,里氏代换原则(LSP),一个数学意义上的正方形是一个四边形,但是一个Square对象不是一个Rectangle对象,因为一个Square对象的行为与一个Rectangle对象的行为是不一致的!,依赖倒转原则(DIP),依赖倒转原则要求用户尽量依赖于抽象而不是实现。传统的过程式的程序设计方法倾向于使得高层次的模块依赖于低层次的模块,DIP原则把这个依赖关系倒转过来。一般而言,高

17、抽象层次包含的是应用系统的商务逻辑和宏观的控制过程,而低层次模块包含一些具体的算法。低层次代码经常会变动,高层次则相对稳定一些。为了更有效的保持系统的稳定性,应该使得低层次的模块依赖于高层次模块。从复用的角度来看,只有实现依赖倒转原则,才会避免当低层次模块发生改变的时候不会导致高层次模块的修改。,接口隔离原则(ISP),尽量使用多个小而专用的接口而不是单一的接口,接口隔离原则(ISP),合成聚合复用原则(CARP),优先使用合成和聚合,而不是继承来达到复用的目的。终态类不可继承,要复用终态类的代码,唯一的办法就是合成或者聚合。因为一个非终态类的内部成员向子类公开,因此,继承关系是一种“白箱”复

18、用。而“白箱”复用是一种破坏封装原则的复用办法。,迪米特法则(LoD),迪米特法则又称为最少知识法则,是指一个对象应当对其它对象尽可能少的了解,并尽可能少得与其他对象发生联系。这种思想是和模块化程序设计中的模块低耦合高内聚同样的道理。public class Someonepublic void operation1(Friend friend)Stranger stranger=friend.provide();Stranger.operation3();public class Friendprivate Stranger stranger=new Stranger();public vo

19、id operation2()public Stranger provide()return stranger;,单责任原则(SRP),一个类应该有且仅有一个职责。关于职责的含意,面向对象大师Robert.C Martin有一个著名的定义:所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因引起该类变化,其实就是耦合了多个互不相关的职责,就会降低这个类的内聚性。单责任原则与关系数据库中规范化设计理论一致,做到“单一化、分离化、一事一地”。,面向对象分析与设计方法,方法学和面向对象方法论,1.方法论是指思考和做事的策略、步骤、方向和行动 面向对象方法论的

20、概念在1987年由Booch首先提出2.目前面向对象方法论有50多种,主要有:Booch模型;Rumbaugh的OMT模型;Jacobson的OOSE模型;Martin的OOAD模型;Shlaer的OOSA模型;Coad的面向对象方法论;Martin的面向对象方法论等等。3.目前人们在努力统一各种面向对象方法论,统一的结果是产生了统一模型语言UML。UML本身不是方法,但是UML提供了能够描述所有面向对象方法的符号工具和语义工具。,面向对象程序设计的一般过程,面向对象程序设计的一般方法,描述问题域,提出解决方案,实施解决方案,建立面向对象的领域模型,确定面向对象的实现模型,构造、测试和发布面向

21、对象程序,OOA,OOD,OOP,重点考虑什么事必须完成,而不是如何完成。,决定问题如何来解决。,本课使用的例子,一个文件分割、合并器能够分割和合并文件能够增加和删除文件能够展示和提取文件,领域模型,OMT方法Coad对象方法Jacobson用例驱动方法,领域模型(Coad方法),模型部件,问题域(PD),人机交互(HI),数据管理(DM),系统交互(SI),领域模型(OMT方法),1.什么是对象模型对象模型描述了客观世界实体以及实体彼此间的关系,是问题域的静态数据结构表示,以对象图形式表示。2.什么是动态模型动态模型表示瞬时的、行为化的系统的“控制”性质,规定了类型模型中实体的合法变化序列,

22、即对象的动态行为,以状态图形式表示。3.什么是功能模型功能模型用来描述系统中对象功能,表达数据的流动、转换情形,以数据流程图、用例图形式表示。,领域模型(Jacobson用例方法),用例(use case)是指行为相关的事务(transaction)序列,该序列由用户在与系统交互中执行。每一个用例就是一个使用系统的方式,当用户给定一个输入,就执行一个用例的实例,并引发执行属于该用例的一个事务。确定用例模型,用例由使用者、实例和作用三个部分描述使用用例模型构造需求模型需求模型包括领域对象模型、界面描述使用用例和需求模型建立分析模型,分析模型用于划分出接口对象、实体对象、控制对象,以及由这些对象组

23、成的子系统,建立领域模型的一般方法,领域模型的内涵:问题域有什么问题域做什么问题域需要我们提供什么功能领域模型建立的一般步骤:1.跟踪、记录所有的实体,输出一个实体的词汇表2.统一类型、实体命名方法和规则3.描述单个类型,输出不完全的类图4.确定类型之间的关系,输出完整的类图(问题域的静态结构)5.描述状态、时序、流程(问题域的动态结构)6.建立用例,用于描述功能7.提取界面并展示给用户8.迭代上述过程,描述实体类型,文件集合文件,描述类型之间的静态关系,关联关系普通关联 递归关联 限定关联 或关联 有序关联 关联类 三元关联聚合关系继承关系依赖关系,文件和集合文件的关系,在问题域中的模型主要

24、用于呈现给用户以及对问题的理解,可以是不精确的,可能与最后的实现模型有一定的区别,描述实体类型的动态关系,可以用活动、状态序列等描述类型之间的动态关系,建立用例,用例用于以下目的:确定系统功能,达成与用户的共识在分析、设计、开发人员之间取得一致提供系统设计、实现中类、对象等的设计依据为系统测试打下基础用例由以下几个部分构成:角色实例实例的操作关系(时序、调用、合并)角色实例的描述,用例图,小结(领域模型),对问题域的分析输出了以下成果1.确定了问题域中有哪些实体类型以及它们之间的关系2.确定了问题域中这些实体类型的动态结构3.确定了需要实现的功能如果使用UML工具,将形成1.类图2.活动图3.

25、用例图,实现模型(OMT方法),1.确定体系结构将系统划分成子系统确定问题域中一致的继承分配子系统的处理器和任务选择一个方法管理数据存储确定全局资源以及访问方式确定系统的控制流处理边界条件2.确定对象结构合并问题域三个模型来获得类的操作(服务)设计算法实现操作优化对数据的访问路径调整类结构,增加继承、抽象和泛化确定类关系(作用关系)将类和关系封装在子系统或者模块中3 输出结果更加详细的对象模型、动态模型、功能模型,实现模型(Coad方法),主题层:模块、包、命名空间的划分类与对象层:确定有哪些类结构层:确定类、对象之间的关系(通用特定;整体部分)属性层:确定类的属性,以及属性的封装机制服务层:

26、确定类的接口,实现模型(用例方法),用例方法将该阶段称为构造阶段,构造阶段的成果包含了:1.构块模型,构块模型的设计集中考虑可跟踪性、实现环境2.交互作用图,交互作用、事件与激励、均一化3.确定对象内部行为(状态图)4.实现和测试,建立实现模型的一般方法,实现模型的内涵:1.实现模型中有哪些类,每个类有哪些接口2.实现模型中这些类是怎样组织的3.对于每一项功能,实现模型中类的动态调用过程是怎样的4.类、接口、功能以怎样的方式呈现给用户建立实现模型的一般步骤:1.扩展问题模型确定对象类以及对象类的领域(类图)2.寻找可重用的设计模式3.根据问题模型确定类的状态空间和行为接口(类图)4.根据问题模

27、型确定类的组织方式(类图/对象图/包图/配置图)5.确定类的工作流、控制流(细化的活动图、序列图等)6.迭代上述过程,确定类的领域,一个标准的面向对象系统的类包括四个领域1.应用领域包含了对于应用本身有价值的类事件管理类事件识别类2.商业领域包含了对于行业有价值的类关系类角色类属性类3.结构领域包含了对于体系结构有价值的类人机界面类数据操作类机器通信类4.基础领域包含了实现应用、商业、结构的语言相关的类语义类结构类基础类,可重用性:基础领域结构领域商业领域应用领域,确定类的领域,应用领域类文件集合类(SetFile)商业领域类文件类(File)文件流类(FileStreamOpt)文件合并分割

28、类(FileCutMerge)结构领域类系统主窗口 MainWindow集合文件浏览窗口 FilesBrowseWindow文件详细信息查看窗口 FileInfoWindow命令按钮/工具栏 CommandButton/CommandToolBar基础领域类字符串/整数/布尔 String/Integer/Boolean日期时间 DateTime哈希表 Hash枚举 Iterator,确定类的状态空间和行为接口,类的状态空间是指类的属性以及属性的约束条件类的行为接口是指类暴露的方法或者服务在复杂的类设计中,类的状态空间和行为接口应通过对不变式、前置条件和后置条件的设计作为依据类的不变式、前置条

29、件和后置条件可以作为系统单元测试的主要依据例如在设计时刻应确保FileStreamOpt的行为接口ExtractStream前置条件是存在一个File(file1)对象,后置条件是存在一个File(file2)对象和一个FileStreamOpt(stream1)对象,且Size(file1)=size(file2)+size(stream1)为不变式,类的状态空间和行为,确定类的组织方式,类的组织方式往往和实现的语言有关,类可以有以下几种组织方式,类的组织设计应以问题域的类图为依据:1.通用特化(继承关系)2.抽象实例(接口、抽象类、模板)3.聚集(成员)4.关联(单向或者双向的引用)5.依赖(函数参数、友元),确定类的组织方式,确定类的工作流,根据用例细化问题域的状态图、活动图等,详细描述对于用例的每一个实例,确定系统对象调用流程,小结(实现模型),建立实现模型将输出以下结果:确定了系统所有实现的类、类的接口、不变式确定了类之间的组织关系每一个功能的实现细节如果使用UML,将形成以下内容类图、对象图、包图协作图、活动图、配置图细化的用例图,

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

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号