1第一 二章 面向对象
- 格式:ppt
- 大小:670.00 KB
- 文档页数:66


第一章面向对象的引入和发展本书专门讨论面向对象的方法及有关的主要问题因此在本章一开始首先要讨论为什么要引入面向对象的方法及其讨论范围之后再讨论面向对象的书四个主要方面面向对象基础及面向对象程序设计语言利用UML进行面向对象的分析与设计面向对象的设计模式面向对象的设计原则以及面向对象的数据库1.1 面向对象方法的发展历程面向对象的方法的研究正在引起全世界越来越强烈地关注和高度重视被誉为研究最新技术的好方法针对日趋复杂的软件需求的挑战软件业界开始崇尚利用面向对象的方法和思想进行软件开发与人类发明史上的许多创举不同面向对象不是瞬间出现的面向对象不是某个人的突发奇想而是许多人经历多年研究积累的产物面向对象的方法起源于面向对象的程序设计语言在20世纪60年代中期Simula-67的设计者Dahl和Nygaard 提出对象object的概念在程序设计语言中开始使用数据封装(data encapsulation)的概念在20世纪70年代Liskov使用抽象数据类型(ADT)的理论和实现有了重大的进展奠定了面向对象的基础Liskov最著名的研究成果是CLU语言支持隐藏内部数据表示方法从20世纪70年代起Xerox公司的 Palo Alto 研究中心经过对Smalltak7274几经连续不断地研究改革后在1980年推出了Smalltalk-80它在系统设计中强调对象概念的统一引入对象对象类方法实例等概念及术语采用了动态联编及单继承机制体现了面向对象方法的许多重要概念对面向对象方法学的形成和发展起了重大作用于此同时Bell实验室的B.Stroustrup着手在C语言的基础之上加以扩展使之成为一个面向对象的语言定名为C++由于C语言在80年代已成为通用的开发语言它不仅可以用于微机而且可以用于范围很宽的计算机结构及环境因此在C语言的基础上扩展而成的C++虽然不是纯粹的面向对象语言却继承了C的语言构造易学易用不需特殊的计算机平台这些比Smalltalk-80明显的优点受到计算机界的普遍欢迎许多C++商业版本和工具相继出现原来阻碍面向对象程序设计语言推广使用的性能价格比问题也顺利地得以解决所以C++的问世促进了面向对象技术的发展java语言与internet有着直接的关系它采用了类C++的风格是一个比较严格的面向对象的语言并且可以跨平台运行用java写的applets可以嵌入HTML中被解释执行当前许多系统已经利用java来编写并能在多种平台上运行另外还有一些其它的面向对象的程序设计语言也在80年代相继出现如objective-C Eiffel CommonLOOPS等许多基于框架Frame-based的知识表达系统提供了面向对象的特征Tertronix和Data General公司提供了面向对象辅助设计和工程系统象O2ITASCA及ObjectStore等面向对象的数据库系统已日趋成熟并已进入商品化许多Client/Server数据库开发工具都采用了面向对象的方法与技术如BORLAND INTERNATIOAL公司的DELPHI POWERSOFT公司的POWER BUILDER和INFORMIX的NEW ERA等在20世纪90年代后期Grady Booch Ivar jacobson及Jim Rumbaugh三人尽管他们在面向对象领域各有各自的主张但是他们通力合作将面向对象用合理的符号表示产生了统一建模语言(Unified Modeling Language, UML)这个图形化的建模语言既有可视的表达形式又有严谨的语义支撑1.2 引入面向对象方法的动机之所以面向对象的方法被广泛采用部分原因是源于人们长久以来的一个希望希望面向对象的方法象以前其它的软件开发技术一样能够满足软件开发对于生产效率可靠性易维护性易管理等方面更高更快更强的迫切要求除此之外还有许多原因都促使了它的流行面向对象的方法强调从问题域的概念到软件程序和界面的直接映射心理学的研究也表明把客观世界看成许多对象更接近人类的自然思维方式因此面向对象方法非常易于理解解决问题更加具有针对性因此利用面向对象开发的软件具有很好的可维护性可扩展性和可重用性因此软件的实现就不是那么复杂了在面向对象的方法中将数据和功能并在一起考虑这样的表述非常自然因此在分析和实现的隔阂变得非常小从另一方面考虑面向对象的方法取代的过程化的方法而广泛应用是因为面向对象的方法却是有明显的优点下面我们探讨一下过程化的方法与面向对象方法的差别在过程化的方法中系统是围绕着过程来组织的系统的运行通过过程间的数据传送来实现的在该方法中过程和数据清除地分开因此重点分别集中在数据结构算法和顺序步骤上因此过程非常难以重用过程化方法还缺乏强有力的可视化建模技术该方法在分析和实现不同阶段的概念的差别很大因此需要进行概念上的转换因此造成了分析设计和实现间的范畴移位设计模型离实现还有很长的一步而面向对象的方法中系统中系统是围绕着对象组织的系统的运行是通过对象间的消息传递而运行的相关的数据和行为捆绑在对象中将问题域建模为对象使得在实现时非常自然地反应现实问题可视化的模型表达能力非常强使得人们易于理解支持强有力的概念例如抽象封装继承多态等可视化的问题模型可以演变为问题解决模型设计模型距离实现只有很小的一步1.3 面向对象方法的益处面向对象的方法是实用的但不是万能的它还不够完美面向对象的方法虽然充满挑战但的确是一种有效的软件开发方法我们不能以一种极端地方式对待面向对象的方法而应该认真研究面向对象方法并将面向对象的方法纳入开发软件及其研究的长期计划中去下面讨论面向对象对软件开发的主要软件活动的内在影响1.3.1 需求分析结构化技术的过程分析和数据分析之间的边界从未解决数据流图的过程世界与实体关系图的数据世界难以共存过程和数据分析在某些场合可以满足要求而在某些场合就会发生冲突这种冲突在实时系统模型中尤为突出如控制过程与数据模型的对应关系经常变得不清晰面向对象方法在生命周期的早期就将过程和数据融合在一起尽管不能明确地称为过程和数据分析但是在谈论面向对象时称动态和静态分析更为妥当使用面向对象概念将这两方面的分析很好地协调起来所以有人将面向对象中过程和数据的融合比喻成爱因斯坦的相对论中空间和时间的融合当然这种比喻不太恰当1.3.2 系统设计在系统设计时面向对象的方法既有优势又有不足面向对象的优势是使设计者将软件中棘手的问题利用封装特性隐藏起来这些问题包括难以理解的数据结构复杂的组合逻辑详细的过程和数据间的关系高深的算法及关键的设备驱动程序等面向对象方法的缺点是应用封装和继承性是结构本身变得复杂缺点与优点相比缺点反而并不是太突出了由于需求分析采用了面向对象的方法因此系统设计采用面向对象的方法非常自然这样结合面向对象的开发工具就可以实现整个软件生命周期的可追踪性尽管面向对象的系统设计是非常艰辛的但一旦完成他对处理大量复杂单元所带来的益处要多于采用其它设计技术1.3.3 软件构造采用面向对象方法建立系统最长考虑的质量要素是可重用性可靠性健壮性可可扩展性和可维护性等1可重用性面向对象方法在类的级别上而不是在各子程序级别上提高代码重用来改进软件的可重用性可以通过开发和建立合适的类库进行重用这种方法实际上是一种新的符合特定需求的非常高层的语言实际上对象类是一个足够复杂的有机体可以作为独立的软件单元从公司中的一个应用移植到另一个应用2可靠性可靠代码的运行具有可重复性和一致性仅当能用某种方法证明代码的正确性时代码才可以达到这些质量要求面向对象的代码采用类的不变式可以断言借助自身进行验证类的不变式是指给定类中的每一个对象必须满足条件例如类Person的不变式可能为dateOfBirth<=todaysDate类的不变式使得彻底地验证代码成为可能在静态分析或检查中可以验证设计或其结果代码是否满足设想的不变式条件虽然不可能证明代码绝对正确但面向对象确实使检查代码的行为变得更加容易3健壮性软件的健壮性是指软件发生故障时的完全恢复能力典型故障为语句错误内存错误外部设备错误及算法溢出健壮的软件可以捕获异常并执行故障恢复程序许多现代的面向对象语言和环境都支持错误检测和处理功能因此有利于开发健壮的软件获得健壮的面向对象代码的有效方法是将推断和恒定条件的概念和异常处理的概念相接合4可扩展性软件的可扩展性简单地描述为说明域与实现域之间是同构的用通俗的话来说就是解决问题的模型应该满足问题的模型为此应该用户的一些小的改变不会导致主要系统灾难性的后果当修改面向对象代码时很少会引发其它部分产生的莫名奇妙的问题由于面向对象基于更高层次上建立软件单元它更接近与生活的抽象因此比传统的技术更容易建立同构可扩展性经常和继承性一起使用用户常在已经声明的主题中增加变量对系统进行扩展使用面向对象技术可以在已由的超类下增加继承子类的方法实现扩展5维护性前面四个特性是可维护性的基础面向对象的方法可以提高前四个方面的质量因此能够在以下一个方面降低系统的维护开销可重用性降低了企业整个代码维护的费用可靠性减少了用户的不满意和对修改问题的抱怨健壮性确保了软件可维护而不致于在桌面上瘫痪可扩展性迎合了用户修改系统的渐近式倾向因此用户可以不断地对软件寻求更多的较小的修改1.3.4 分布式对象1989年面向对象管理组织OMG承担了一个十分艰巨的任务将几十个主要硬件和软件厂商统一在面向对象的可互操作标准上其最为显著的成果是公共对象请求代理体系结构(CORBA)这种软件体系结构支持分布在多个平台上的面向对象系统CORBA可以使对象互相交谈不仅可以在类似的机器上而且可以运行在不同操作系统或连接不同网络的机器上进行通信在CORBA环境中甚至可以用不同的语言编写类然后用不同的编译程序编译的方式建立对象此外最重要的是CORBA提供了各种标准服务这样省去了编写许多分布式系统必须的冗长代码Microsoft公司也推出了类似的标准叫作COM和DCOM但是目前只能运行在WINDWS平台1.3.5 面向对象的数据库建立任何面向对象应用面向对象的数据库系统都非常有用特别是对存储非格式化的数据例如声音图像是更为重要因为这些数据不适合用标准的表格形式存储面向对象的数据库系统可以存储任意的对象类而且还提供面向对象的封装继承多态及其它重要的面向对象特征大多数面向对象数据库系统提供查询语言1.3.6软件使用图形应用一直是面向对象的主要选择通常人们通过面向对象实现图形用户界面GUI这样做有两个原因其一是概念其二是实现在概念上面向对象的隐喻较好地符合典型的窗口/鼠标/图形界面多态性也可以出现在用户界面上在实现上允许用户可以建立窗口/鼠标/图标界面的许多商用软件库都是面向对象语言编写的由于窗口本身具有许多面向对象的属性因此大多数窗口界面的开发工具都有通过窗口运行面向对象的痕迹如果说面向对象本身增加了软件的易用性不太准确但可以准确地说好的图形用户界面增加了软件的易用性而面向对象的方法是建立支持GUI软件库的最佳途径1.3.7 软件项目管理一般人们都认为面向对象的方法只是针对软件没技术人员的其实面向对象的技术对于软件管理者也是非常重要的例如降低维护开销的技术可以释放管理者的资源将其投入到待处理的应用中从软件管理者的角度来看面向对象的方法不是纯技术的面向对象的方法既能给组织机构也能给其管理者的工作带来变化当一个组织机构采用了面向对象的方法其组织将发生变化类的重用需要类库和类库管理人员每个程序员都要加入两个组中的一个一个是设计和编写新类组另一个是应用类创建新应用程序组面向对象不太强调编程需求分析相对地将变得更加重要作为转向面向对象方法的组织机构的管理者应该意识到组织的变化让职员适应新的角色在这些角色中需要管理参与工作的人员鼓励重用而不主张重复编码需要给技术人员充足的时间考虑类的设计使得构造的类可以满足重用的要求总之应该使用不同的术语不同的工具和不同的生命周期以及新的目标来管理项目如果管理者将面向对象作为一种方法而不是作为一种目标会取得良好的效果而面向对小二的可维护性可扩展性健壮性等特点会减少交付时间等诸多益处作为软件管理者应始终确立目标并将面向对象作为一种技术来达到预定的目标如果在头脑中没有目标那么面向对象所有事物开销似乎都是昂贵的代价如果管理者不仅知道做什么而且知道为什么这样做则一定能实现所追求的面向对象目标。
UML基础与Rose建模实用教程课后习题及答案第1章面向对象概述1. 填空题(1)软件对象可以这样定义:所谓软件对象,是一种将状态和行为有机结合起来形成的软件构造模型,它可以用来描述现实世界中的一个对象。
(2)类是具有相同属性和操作的一组对象的组合,即抽象模型中的“类”描述了一组相似对象的共同特征,为属于该类的全部对象提供了统一的抽象描述。
(3)面向对象程序的基本特征是抽象、封装、继承和多态。
2. 选择题(1)可以认为对象是ABC。
(A)某种可被人感知的事物(B)思维、感觉或动作所能作用的物质(C)思维、感觉或动作所能作用的精神体(D)不能被思维、感觉或动作作用的精神体(2)类的定义要包含以下的要素ABD。
(A)类的属性(B)类所要执行的操作(C)类的编号(D)属性的类型(3)面向对象程序的基本特征不包括B。
(A)封装(B)多样性(C)抽象(D)继承(4)下列关于类与对象的关系的说法不正确的是A。
(A)有些对象是不能被抽象成类的(B)类给出了属于该类的全部对象的抽象定义(C)类是对象集合的再抽象(D)类用来在内存中开辟一个数据区,并存储新对象的属性3. 简答题(1)什么是对象?试着列举三个现实中的例子。
对象是某种可被人感知的事物,也可是思维\感觉或动作所能作用的物质或精神体,例如桌子.椅子.汽车等。
(2)什么是抽象?抽象是对现实世界信息的简化。
能够通过抽象将需要的事物进行简化、将事物特征进行概括、将抽象模型组织为层次结构、使软件重用得以保证。
(3)什么是封装?它有哪些好处?封装就是把对象的状态和行为绑在一起的机制,使对象形成一个独立的整体,并且尽可能地隐藏对象的内部细节。
封装有两个含义;一是把对象的全部状态和行为结合在一起,形成一个不可分割的整体。
对象的私有属性只能够由对象的行为来修改和读取。
二是尽可能隐蔽对象的内部细节,与外界的联系只能够通过外部接口来实现。
通过公共访问控制器来限制对象的私有属性,使用封装具有以下好处:避免对封装数据的未授权访问、帮助保护数据的完整性、当类的私有方法必须修改时,限制了在整个应用程序内的影响。