logo软件工程小论文题目《面向对象技术》专业班级:小组成员:指导教师:完成时间: 2012 年X月X日XXXX学院目录引言 (1)1、程序设计语言1.1面向对象语言的优点 (1)1.2面向对象语言的技术特点 (2)1.3选择面向对象语言 (4)2 面向对象的程序设计风格2.1 提高可重用性 (5)2.2 提高可扩充性 (7)2.3 提高健壮性 (7)3 面向对象的测试3.1面向对象的单元测试 (8)3.2面向对象的集成测试 (8)3.3面向对象的确认测试 (8)4 小结个人感想 (9)参考文献 (10)摘要面向对象方法学把分析、设计和实现很自然地联系在一起了。
实现的结果和实现成本却在很大程度上取决于实现环境。
因此,直接支持面向对象设计范式的面向对象程序语言、开发环境及类库,对于面向对象实现来说是非常重要的。
为了把面向对象设计结果顺利地转变成面向对象程序,首先应该选择一种适当的程序设计语言。
面向对象方法学使用独特的概念和技术完成软件开发工作,因此,在测试面向对象程序的时候,除了继承传统的测试技术之外,还必须研究与面向对象程序特点相适应的新的测试技术。
面向对象测试在测试类时使用的方法主要有随机测试、划分测试和基于故障的测试。
每种方法都测试类中封装的操作。
应该设计测试序列以保证相关的操作受到充分测试。
检查对象的状态(由对象的属性值表示),以确定是否存在错误。
关键词:面向对象语言,测试类,对象引言面向对象实现主要包括两项工作:把面向对象设计结果翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序。
面向对象程序的质量基本上由面向对象设计的质量决定,但是,所采用的程序语言的特点和程序设计风格也将对程序的可靠性、可重用性及可维护性产生深远影响。
目前,软件测试仍然是保证软件可靠性的主要措施,对于面向对象的软件来说,情况也是如此。
面向对象测试的目标,也是用尽可能低的测试成本发现尽可能多的软件错误。
但是,面向对象程序中特有的封装、继承和多态等机制,也给面向对象测试带来一些新特点,增加了测试和调试的难度。
必须在实践中努力探索适合于面向对象软件的更有效的测试方法。
1 程序设计语言1.1 面向对象语言的优点面向对象设计的结果既可以用面向对象语言、也可以用非面向对象语言实现。
使用面向对象语言时,由于语言本身充分支持面向对象概念的实现,因此,编译程序可以自动把面向对象概念映射到目标程序中。
使用非面向对象语言编写面向对象程序,则必须由程序员自己把面向对象概念映射到目标程序中。
所有非面向对象语言都不支持一般-特殊结构的实现,使用这类语言编程时要么完全回避继承的概念,要么在声明特殊化类时,把对一般化类的引用嵌套在它里面。
到底应该选用面向对象语言还是非面向对象语言,关键不在于语言功能强弱。
从原理上说,使用任何一种通用语言都可以实现面向对象概念。
当然,使用面向对象语言,实现面向对象概念,远比使用非面向对象语言方便,但是,方便性也并不是决定选择何种语言的关键因素。
选择编程语言的关键因素,是语言的一致的表达能力、可重用性及可维护性。
从面向对象观点看来,能够更完整、更准确地表达问题域语义的面向对象语言的语法是非常重要的,因为这会带来下述几个重要优点:1.1.1 一致的表示方法从前面章节的讲述中可以知道,面向对象开发基于不随时间变化的、一致的表示方法。
这种表示方法应该从问题域到OOA,从OOA到OOD,最后从OOD到面向对象编程(OOP),始终稳定不变。
一致的表示方法既有利于在软件开发过程中始终使用统一的概念,也有利于维护人员理解软件的各种配置成分。
1.1.2 可重用性为了能带来可观的商业利益,必须在更广泛的范围中运用重用机制,而不是仅仅在程序设计这个层次上进行重用。
因此,在OOA,OOD直到OOP中都显式地表示问题域语义,其意义是十分深远的。
随着时间的推移,软件开发组织既可能重用它在某个问题域内的OOA结果,也可能重用相应的OOD和OOP结果。
1.1.3 可维护性尽管人们反复强调保持文档与源程序一致的必要性,但是,在实际工作中很难做到交付两类不同的文档,并使它们保持彼此完全一致。
特别是考虑到进度、预算、能力和人员等限制因素时,做到两类文档完全一致几乎是不可能的。
因此,维护人员最终面对的往往只有源程序本身。
以ATM系统为例,说明在程序内部表达问题域语义对维护工作的意义。
假设在维护该系统时没有合适的文档资料可供参阅,于是维护人员人工浏览程序或使用软件工具扫描程序,记下或打印出程序显式陈述的问题域语义,维护人员看到“ATM”、“账户”、“现金兑换卡”等,这对维护人员理解所要维护的软件将有很大帮助。
因此,在选择编程语言时,应该考虑的首要因素,是在供选择的语言中哪个语言能最好地表达问题域语义。
一般说来,应该尽量选用面向对象语言来实现面向对象分析、设计的结果。
1.2 面向对象语言的技术特点面向对象语言的形成借鉴了历史上许多程序语言的特点,从中吸取了丰富的营养。
当今的面向对象语言,从20世纪50年代诞生的LISP语言中引进了动态联编的概念和交互式开发环境的思想,从20世纪60年代推出的SIMULA语言中引进了类的概念和继承机制,此外,还受到20世纪70年代末期开发的Modula_2语言和Ada语言中数据抽象机制的影响。
20世纪80年代以来,面向对象语言像雨后春笋一样大量涌现,形成了两大类面向对象语言。
一类是纯面向对象语言,如Smalltalk和Eiffel等语言。
另一类是混合型面向对象语言,也就是在过程语言的基础上增加面向对象机制,如C++等语言。
一般说来,纯面向对象语言着重支持面向对象方法研究和快速原型的实现,而混合型面向对象语言的目标则是提高运行速度和使传统程序员容易接受面向对象思想。
成熟的面向对象语言通常都提供丰富的类库和强有力的开发环境。
下面介绍在选择面向对象语言时应该着重考察的一些技术特点。
1.2.1 支持类与对象概念的机制所有面向对象语言都允许用户动态创建对象,并且可以用指针引用动态创建的对象。
允许动态创建对象,就意味着系统必须处理内存管理问题,如果不及时释放不再需要的对象所占用的内存,动态存储分配就有可能耗尽内存。
有两种管理内存的方法,一种是由语言的运行机制自动管理内存,即提供自动回收“垃圾”的机制;另一种是由程序员编写释放内存的代码。
自动管理内存不仅方便而且安全,但是必须采用先进的垃圾收集算法才能减少开销。
某些面向对象的语言允许程序员定义析构函数(destructor)。
每当一个对象超出范围或被显式删除时,就自动调用析构函数。
这种机制使得程序员能够方便地构造和唤醒释放内存的操作,却又不是垃圾收集机制。
1.2.2 实现整体-部分(即聚集)结构的机制一般说来,有两种实现方法,分别使用指针和独立的关联对象实现整体-部分结构。
大多数现有的面向对象语言并不显式支持独立的关联对象,在这种情况下,使用指针是最容易的实现方法,通过增加内部指针可以方便地实现关联。
1.2.3 实现一般-特殊(即泛化)结构的机制既包括实现继承的机制也包括解决名字冲突的机制。
所谓解决名字冲突,指的是处理在多个基类中可能出现的重名问题,这个问题仅在支持多重继承的语言中才会遇到。
某些语言拒绝接受有名字冲突的程序,另一些语言提供了解决冲突的协议。
不论使用何种语言,程序员都应该尽力避免出现名字冲突。
1.2.4 实现属性和服务的机制对于实现属性的机制应该着重考虑以下几个方面:支持实例连接的机制;属性的可见性控制;对属性值的约束。
对于服务来说,主要应该考虑下列因素:支持消息连接(即表达对象交互关系)的机制;控制服务可见性的机制;动态联编。
所谓动态联编,是指应用系统在运行过程中,当需要执行一个特定服务的时候,选择(或联编)实现该服务的适当算法的能力。
动态联编机制使得程序员在向对象发送消息时拥有较大自由,在发送消息前,无须知道接受消息的对象当时属于哪个类。
1.2.5 类型检查程序设计语言可以按照编译时进行类型检查的严格程度来分类。
如果语言仅要求每个变量或属性隶属于一个对象,则是弱类型的;如果语法规定每个变量或属性必须准确地属于某个特定的类,则这样的语言是强类型的。
面向对象语言在这方面差异很大,例如,Smalltalk 实际上是一种无类型语言(所有变量都是未指定类的对象);C++和Eiffel则是强类型语言。
混合型语言(如C++, Objective_C等)甚至允许属性值不是对象而是某种预定义的基本类型数据(如整数,浮点数等),这可以提高操作的效率。
强类型语言主要有两个优点:一是有利于在编译时发现程序错误,二是增加了优化的可能性。
通常使用强类型编译型语言开发软件产品,使用弱类型解释型语言快速开发原型。
总的说来,强类型语言有助于提高软件的可靠性和运行效率,现代的程序语言理论支持强类型检查,大多数新语言都是强类型的。
1.2.6 类库大多数面向对象语言都提供一个实用的类库。
某些语言本身并没有规定提供什么样的类库,而是由实现这种语言的编译系统自行提供类库。
存在类库,许多软构件就不必由程序员重头编写了,这为实现软件重用带来很大方便。
类库中往往包含实现通用数据结构(例如,动态数组、表、队列、栈、树等等)的类,通常把这些类称为包容类。
在类库中还可以找到实现各种关联的类。
更完整的类库通常还提供独立于具体设备的接口类(例如,输入输出流),此外,用于实现窗口系统的用户界面类也非常有用,它们构成一个相对独立的图形库。
1.2.7 效率许多人认为面向对象语言的主要缺点是效率低。
产生这种印象的一个原因是,某些早期的面向对象语言是解释型的而不是编译型的。
事实上,使用拥有完整类库的面向对象语言,有时能比使用非面向对象语言得到运行更快的代码。
这是因为类库中提供了更高效的算法和更好的数据结构,例如,程序员已经无须编写实现哈希表或平衡树算法的代码了,类库中已经提供了这类数据结构,而且算法先进、代码精巧可靠。
认为面向对象语言效率低的另一个理由是,这种语言在运行时使用动态联编实现多态性,这似乎需要在运行时查找继承树,以得到定义给定操作的类。
事实上,绝大多数面向对象语言都优化了这个查找过程,从而实现了高效率查找。
只要在程序运行时始终保持类结构不变,就能在子类中存储各个操作的正确入口点,从而使得动态联编成为查找哈希表的高效过程,不会由于继承树深度加大或类中定义的操作数增加而降低效率。
1.2.8 持久保存对象任何应用程序都对数据进行处理,如果希望数据能够不依赖于程序执行的生命期而长时间保存下来,则需要提供某种保存数据的方法。
希望长期保存数据主要出于以下两个原因:(1) 为实现在不同程序之间传递数据,需要保存数据;(2) 为恢复被中断了的程序的运行,首先需要保存数据。
一些面向对象语言,没有提供直接存储对象的机制。