1、 过程化的方法与面向对象方法的差别 在过程化的方法中,系统是围绕着过程来组织的,系统的运行通过过程间的数据传送来实现的,在该方法中过程和数据清楚地分开,因此重点分别集中在数据结构、算法和顺序步骤上,因此过程非常难以重用。过程化方法还缺乏强有力的可视化建模技术。该方法在分析和实现不同阶段的概念的差别很大,因此需要进行概念上的转换,因此造成了分析、设计和实现间的范畴移位。设计模型离实现还有很长的一步。 而面向对象的方法中系统是围绕着对象组织的,系统的运行是通过对象间的消息传递而运行的,相关的数据和行为捆绑在对象中。将问题域建模为对象使得在实现时非常自然地反应现实问题。可视化的模型表达能力非常强使得
2、人们易于理解。支持强有力的概念例如抽象、封装、继承、多态等。可视化的问题模型可以演变为问题解决模型。设计模型距离实现只有很小的一步。- 面向对象方法的益处 需求分析结构化技术的过程分析和数据分析之间的边界从未解决。数据流图的过程世界与实体关系图的数据世界难以共存。过程和数据分析在某些场合可以满足要求,而在某些场合就会发生冲突。这种冲突在实时系统模型中尤为突出,如控制过程与数据模型的对应关系经常变得不清晰。面向对象方法在生命周期的早期就将过程和数据融合在一起。尽管不能明确地称为“过程和数据分析” ,但是在谈论面向对象时称“动态和静态分析”更为妥当,使用面向对象概念将这两方面的分析很好地协调起来。
3、 系统设计在系统设计时,面向对象的方法既有优势,又有不足。面向对象的优势是使设计者将软件中棘手的问题利用封装特性隐藏起来,这些问题包括难以理解的数据结构、复杂的组合逻辑、详细的过程和数据间的关系、高深的算法及关键的设备驱动程序等。面向对象方法的缺点是应用封装和继承性是结构本身变得复杂。缺点与优点相比,缺点反而并不是太突出了。由于需求分析采用了面向对象的方法,因此系统设计采用面向对象的方法非常自然,这样结合面向对象的开发工具,就可以实现整个软件生命周期的可追踪性。尽管面向对象的系统设计是非常艰辛的,但一旦完成他,对处理大量复杂单元所带来的益处要多于采用其它设计技术。软件构造采用面向对象方法建立系
4、统最长考虑的质量要素是:可重用性、可靠性、健壮性、可扩展性和可维护性等。(1) 可重用性面向对象方法在类的级别上而不是在各子程序级别上提高代码重用来改进软件的可重用性。可以通过开发和建立合适的类库进行重用,这种方法实际上是一种新的符合特定需求的非常高层的语言。实际上对象类是一个足够复杂的有机体,可以作为独立的软件单元从公司中的一个应用移植到另一个应用。(2) 可靠性可靠代码的运行具有可重复性和一致性。仅当能用某种方法证明代码的正确性时,代码才可以达到这些质量要求。面向对象的代码采用类的不变式可以断言,借助自身进行验证。类的不变式是指给定类中的每一个对象必须满足条件 。类的不变式使得彻底地验证代
5、码成为可能。在静态分析或检查中,可以验证设计或其结果代码是否满足设想的不变式条件。虽然不可能证明代码绝对正确,但面向对象确实使检查代码的行为变得更加容易。(3) 健壮性软件的健壮性是指软件发生故障时的完全恢复能力。典型故障为语句错误、内存错误、外部设备错误及算法溢出。健壮的软件可以捕获异常并执行故障恢复程序。许多现代的面向对象语言和环境都支持错误检测和处理功能,因此有利于开发健壮的软件。获得健壮的面向对象代码的有效方法是将推断和恒定条件的概念和异常处理的概念相接合。(4)可扩展性软件的可扩展性简单地描述为“说明域与实现域之间是同构的” 。用通俗的话来说就是解决问题的模型应该满足问题的模型。用户
6、的一些小的改变不会导致主要系统灾难性的后果。当修改面向对象代码时很少会引发其它部分产生的莫名奇妙的问题。由于面向对象基于更高层次上建立软件单元,它更接近与生活的抽象,因此比传统的技术更容易建立同构。可扩展性经常和继承性一起使用。用户常在已经声明的主题中增加变量对系统进行扩展。使用面向对象技术,可以在已由的超类下增加继承子类的方法实现扩展。(5) 可维护性前面四个特性是可维护性的基础。面向对象的方法可以提高前四个方面的质量,因此能够在以下一个方面降低系统的维护开销。可重用性降低了企业整个代码维护的费用。可靠性减少了用户的不满意和对修改问题的抱怨。健壮性确保了软件可维护而不致于在桌面上瘫痪。可扩展
7、性迎合了用户修改系统的渐近式倾向,因此用户可以不断地对软件寻求更多的较小的修改。- 面向对象方法潜在的缺点 面向对象需要更关注于需求、分析和设计和结构化方法类似,如果要构建出符合用户需要的系统,必须了解用户到底需要什么,因此要做出需求分析,然后根据需求的结构进行分析和实际。利用面向对象的方法必须在分析和实际上下功夫。面向对象需要完全改变每个人的思想系统现在都是由相互作用的对象组成的,这完全和结构化的方法不同。千万不要低估这两种方法之间巨大的差异。面向对象需要改变软件开发文化每个开发人员思想的变化实际上反映了开发文化总体上的变化。每个开发人员都是用新的方法,做更多的分析和设计,与自己的用户进行更
8、多的交流。如果这些变化在你的机构里还没有发生,那么当面向对象引入到开发部门时就会经历巨大的企业文化变迁。面向对象不仅仅是编程在改变开发文化的过程中,应更加注重整个系统的开发过程,尤其是分析和实际工作,需要学习如何正确地使用面向对象的方法。这样做起来不容易也不快。面向对象许多优点是长期的增加重用性和可扩展性有助于减少开发时间和成本,当需要扩展和完善软件系统时面向对象的优点就显示出来了。这意味着有些优点所带来的好处必须等待好几年的时间。面向对象要求先在培训、教育和工具上投资软件开发机构必须对开发人员进行培训,要购买面向对象的开发工具、书籍及杂志。这些都需要预先进行一部分投资。这些短期投资和面向对象
9、带来长期回报。面向对象技术不能保证能构造出正确的系统面向对象提供了增加项目成功的可能性,但这仍依靠参与人员的能力。开发人员、用户和管理者每个人都有义务协同工作,营造出适于面向对象开发的一个氛围。面向对象要求更多的测试工作面向对象开发本质上就是迭代的,因为可能正在使用对象开发复杂的软件,最终结果可能要花更多的时间来测试。迭代开发需要更侧重于回归测试以及验证老软件在改动后仍能正常工作上。软件越复杂就越需要下力气来验证它。面向对象仅是解决方案的一部分面向对象并不能包含一切事情。要使用计算机辅助软件工程来帮助建模,还需要质量保证活动来确保系统达到用户要求,并且还要制作出方便用户有效使用系统的界面出来。
10、面向对象不是包治百病的万灵药,它仅是解决方案的一部分。- 谈谈系统设计时,面向对象的方法的优势和不足。 系统设计在系统设计时,面向对象的方法既有优势,又有不足。面向对象的优势是使设计者将软件中棘手的问题利用封装特性隐藏起来,这些问题包括难以理解的数据结构、复杂的组合逻辑、详细的过程和数据间的关系、高深的算法及关键的设备驱动程序等。面向对象方法的缺点是应用封装和继承性是结构本身变得复杂。缺点与优点相比,缺点反而并不是太突出了。由于需求分析采用了面向对象的方法,因此系统设计采用面向对象的方法非常自然,这样结合面向对象的开发工具,就可以实现整个软件生命周期的可追踪性。尽管面向对象的系统设计是非常艰辛
11、的,但一旦完成他,对处理大量复杂单元所带来的益处要多于采用其它设计技术。- 软件构造时采用面向对象方法建立系统最常考虑的质量要素是:可重用性、可靠性、健壮性、可扩展性和可维护性列出两种支持分布式对象的体系结构:公共对象请求代理体系结构(CORBA) COM和 DCOM J2EE 标准中的 EJB- 对象 对象指是一个实体,它能够保存一个状态(或称信息或数据) ,并且它能提供一系列操作(或称行为) ,这些操作或能检查或能影响对象的状态。 对象能够表示现实或抽象的事物,具有良好定义的责任和良好定义的行为,具有良好定义的接口。对象通常不是太复杂或太大。一个对象可以由多个对象组成,并且与其它对象具有松
12、散耦合。 - 对象具有哪些特征: 对象具有封装性(encapsulation) 。对象将数据及行为封装在一起,并且对象具有信息隐藏的能力,也就是说将其内部结构隐藏起来。具体地说,外界不能直接修改对象的状态,只有通过向该对象发送消息(message)来对它施加影响。对象隐藏了其中的数据及操作的实现方法,对外可见的只是该对象所提供的操作的接口,对象将接口从实现中分离。但某些面向对象程序设计语言中,信息隐藏是有权限的,如 C+。通过封装,可以防止对封装数据未经授权的访问;有助于保证数据的完整性,隐藏起来的执行细节,对其他对象是透明的,因此内部细节的改动不影响向其发送消息的对象。 对象具有自治性(au
13、tonomy)。对象具有独立的计算能力。给定一定的输入,经过状态转换,对象能产生输出,说明它具有计算能力。对象自身的状态变化不是直接受外界干预的,外界只有通过发送消息对其产生影响,因此对象能够提供服务。 对象具有通信性。对象具有与其它对象通信的能力,具体地说就是对象能接收其它对象发来的消息,同时也向其它对象发送消息。通信性反映了不同对象间的联系,通过这种联系,若干对象可以协同完成某项任务。 对象具有被动性。对象的存在和状态转换都是由来自外界的某种刺激(stimulus)引发的,这种刺激就是消息。对象的存在是由外界决定的,而对象的状态转换则是在它接收到某种消息后产生的。 对象具有暂存性,有两层含
14、义,一是指对象的存在是可以动态地引发,不是在系统运行一开始就存在,二是指对象可随时消亡,不是必须存在到系统运行结束。虽然在系统运行过程中,自始至终保存某些对象,但从对象的本质或作用来说它具有暂存性。 对象可具有持久性(persistence),持久对象不随着创建它的进程结束而消亡,并且在外存中存贮,有些基于对象的DBMS增加了持久存贮类声明器declarator,支持对某些语言,如C+,只要简单地为该语言增加一个码keyword,就可做到这一点。这个码可以应用到任何对象的声明,这样的对象在数据库的生命周期中永久存在 。有些对象可由其它对象组成,组成的原因可以依赖于多种因素,它通常依赖于一种使对
15、象详细化、增加易懂性的愿望,并且希望得到可重用的部分 。在面向对象程序设计语言中,对象由若干属性值及方法组成。对象的属性和方法称作对象的特性(property) 。属性值即对象的状态,方法即对象的行为。属性在内部实际上是一组变量。方法是一组函数或过程。在 smalltalk 中,影响对象属性值的唯一方法是否可以直接访问对象的属性及方法。在 C+中,属性称作数据成员,方法称作成员函数。- 复合对象 有些对象可由其它对象组成,组成的原因可以依赖于多种因素,它通常依赖于一种使对象详细化,增加易懂性的愿望,并且希望得到可重用的部分。 复合对象(composite object)是指一个对象的一个属性或
16、多个属性引用了其他对象。有时复合对象也称作复杂对象。换句话说,一个复合对象好像将一个对象嵌套在另一个对象里面一样。- 类 有些对象具有共同的特性,于是根据这些特性将这些对象进行分类。一个类就是这些具有相同或相似行为或数据结构的对象的共同描述,类是若干对象的模板,并且能够描述这些对象内部的构造。属于同一个类的对象具有相同数据结构及行为。:- 类具有性质(1)类的名标识一个类,虽然可以给每个类赋予一个同义词。(2)在同一个系统环境中,类的名能够唯一标识一个类。(3)类必须具有一个成员集合,包括数据结构(称作属性)及行为(称作方法)以及方法的操作接口。(4)类的属性的域可以是基本类,也可以是用户定义
17、的类,如果为后者,则称该属性为复合属性,这样的类也称作复合类。(5)支持信息隐藏。这是通过将类的接口及类的实现隔离而实现的,这种隔离允许将类接口映射到多个不同的实现,同时看起来外部接口的操作符表达了对象可能的行为,这种操作符的责任是提供对对象属性的有控制的访问,这样就将用户和类隔离开,这样使得对象之间具有松散耦合。常言道只有建好围墙,才能成为好的邻居。- 类和型的区别一个型包括:(1)一个操作接口集合。(2)操作的代码。(3)定义对象表达的数据结构。- 实例:属于某个类的对象称为该类的一个实例(instance) ,类和对象间具有 instance-of 关系。一个实例是从一个类创建而来的对象
18、,类描述了这个实例的行为(方法)及结构(属性) 。实例的当前状态由在该实例执行的操作来定义。类是静态的,实例对象是动态的。- 在某些环境下,我们也认为类本身也是一个对象,这个特殊的对象也有其属性和方法,我们称之为类属性和类方法(普通对象的属性和方法称作实例属性和实例方法) 。我们认为任何一个对象都是某个类的对象,因此如果将类看作一个对象,因此该类必定是另一个特殊类的实例,这个特殊类我们称作元类(metaclass)。- 类的实例化功能决定了类及实例具有下面特征:()同一个类的不同实例具有相同的数据结构,承受的是同一方法集合所定义的操作,因而具有相同的行为。()同一个类的不同实例可以持有不同的值
19、,因而可以有不同的状态。()实例的初始状态(初值)可以在实例化中确定。- 对象可以接收到三种类型的消息:报告消息、询问消息及祁使消息。报告消息(informative message)是指对象提供自我更新信息的消息(也称更新、向前或推出消息) 。这是一种“面向过去”的消息,通常通知对象已经发生的事情。例如employee.got(marriageDate:Date),该消息告诉一个职工对象某个职工已经在某个日期结婚。通常报告消息告诉一个对象由该对象表示的在现实世界中已经发生的事情。询问消息(interrogative message)是请求一个对象显示自身一些信息的消息(也称为读、向后或回拉消
20、息) 。例如 e1.age(),向职工 e1 修问他的年龄。这类消息实际上不改变任何事情,通常是向目标对象询问其表示的信息。祁使消息(imperative message)请求对象对本身、另一个对象或系统环境执行某些操作(也称强制或动作消息) 。只是一种“面向未来”的消息,请求对象执行将来的某些动作。例如 e1.retire(),告诉职工 e1.进行退休处理。这种信息通常使目标对象执行一些重要的算法。- 单 继 承 多 继 承继承可分为单继承和多继承,如果一个类只有一个直接超类,则这种继承叫做单继承,如果一个类有多于一个的直接超类,这种继承叫做多继承。- 动 态 联 编 将接收到的消息与实际执
21、行的操作相联系的过程称作联编(binding) 。如果这种联编发生在编译时刻,称作静态联编(static binding)或提前联编(early binding)多态性有时在编译时刻不能确定消息接收对象属于那个类,即不能确定到底执行方法的那个具体操作。这时需在系统运行时刻决定执行的方法到底是定义于那个类的方法,这时就存在运行时方法搜索,进行联编,这就叫动态联编(dynamic binding)- 多 态 一个消息(或称方法)可以用不同的方式来解释,这决定于消息的接收对象属于那个类。多态通常被认为是一种方法在不同的类中可以有不同的实现,甚至在同一类中仍可能有不同的定义及实现。- 多态的分类操作符
22、重载同一操作符可用于不同的变量类型,叫做操作符重载。操作名重载操作名重载指同一操作名可用于不同对象(或同一对象)上并产生不同结果。在 C+中,某个程序可以设计不同的函数体,但有相同函数名的函数。类属类属是支持参数多态的。一种重要设施,其目的是为了得到更灵活的模块结构。类属的概念最早是在 ALGOL68 中引入的,在 Ada 中得到了发展,主要用于定义参数化模块,类属参数通常表示类型参数,也可表示程序。- 重置(overriding)是一个非常重要的概念。重置可以重新修正从超类继承下来的属性及方法。重置是修改利用已存在类的一种简单而灵活的方法,但使得类层次不易理解,因为重置使得具有相同名字的方法
23、在不同类中具有不同的语义。在重定义时,操作的表示和操作的实现体将都改变,而在重置中,只有操作的实现体被改变,而操作的说明及表示仍与以前一样。- 继承是一种使用户得以在一个类的基础上建立新的类的技术。新的类自动继承旧类的属性和行为特征,并可具备某些附加的特征或某些限制。新类称作旧类的子类,旧类称作新类的超类,继承能有效地支持软件构件的重用,使得当需要在系统中增加新的特征时,所需新代码最少,并且当继承和多态、动态联编结合使用时,为修改系统所需变动的原代码最少。继承机制的强有力之处还在于它允许程序设计人员可重用一个未必完全符合要求的类,允许对该类进行修改而不至于在该类的其它部分引起有害的副作用。 -
24、 通过抽取及共享共同特征,可用泛化(generalization)原理将这些共性抽取出作为超类放在继承层次的上端。抽取出的超类称作抽象类(abstract class) ,抽象类一般没有实例。在增加新类时,发现已有类已提供了新类所需的某些特征,则新类可继承旧类的特征。新类作为旧类的子类,这个过程叫做特化(specialization) 。- 对于一个类来说,它的客户(client)可以分成两大类:一是生成类的实例以及用类的方法来操纵实例,这与继承没有什么关系。二是一个类的子类继承这个类的结构和行为。这两类客户分别称作实例化客户及继承客户。- 抽 象 类 在面向对象的方法中,有一个重要的概念,称
25、之为概括(generalization),其含义是通过将若干类的所共享的公共特征抽取出来,形成一个新类,并且将这个类放到类继承层次的上端以供更多的类所重用,这样构造出的类叫做抽象类(abstract class)。通常,抽象类不能创建实例,所以抽象类没有实例。- 1. 替换原则,替换原则指对于类 A 和类 B,如果 B 是 A 的子类,那么在任何情况下都可以用类B 的实例来替换类 A 的实例。 - 类库在宏观上可以分成两层:系统层和应用层。 - 引入元类有如下优点(1) 概念上一致。只用一个概念对象就可表述系统中所有成分。(2)使类成为运行时刻一部分有助于改善程序设计环境,如 开放符号调试程序
26、等。(3)继承的规范化。由于类与元素的继承采用双轨制,继承可严格定义为除非显式说明为私有的情形,子类可以继承其超类的所有 的操作。- 类库的设计应遵循以下原则(1)类库的组织结构应是自顶向下的,即抽象的、公用的类应位于上层。(2)系统层的类与用户层的类之间的界面必须清晰。(3)必须提供相应的类库管理设施,如查询类间关系和显示类的层次结构等。设计一个堆栈类,可以实现入栈、出栈、判断栈空操作。class stockprivate:int list100;int i;public:int push (int value)if (i=100) return 0;listi+=value;int pop
27、 ()if (i=0) return 0;return list-i;int empty () if (i=0) return 1 else return 0;stock()i=0;设计一个队 列 类 , 要 求 实 现 入 队 、 出 队 、 判 断 队 空 操 作。class queueprivate:int list100;int i;public:int push (int value)if (i=100) return 0;listi+=value;int pop ()int x1,j;if (i=0) return 0;x1=list0;if (i1)for (j=1;j=i;j+
28、)listj-1=listj;i-;return x1;int empty () if (i=0) return 1 else return 0;queue()i=0;设计一个计数器类 , 要 求 实 现 初 始 化 、 加 1、 取 数 操 作 。class counterprivate:long i;public:long getvalue ()return i;void add ()i+;counter()i=0;java 语 言 通 过 jdbc 驱 动 程 序 访 问 数 据 库 , 某 些 数 据 库 有odbc 驱 动 程 序 但 没 有 jdbc 驱 动 程 序 ,所 以 需
29、要 用 jdbc-odbc 桥 作 为 数 据 库 驱 动 程 序 ,将 数 据 库 的 odbc 接 口 转 换 为 java 语 言 可 以 访 问 的 jdbc 接 口 。这 是 什 么 设 计 模 式 ? 请 画 出 类 图开 -闭 原 则 软 件 实 体 应 当 对 扩 展 开 放 , 对 修 改 关 闭 可 以 在 不 被 修 改 的 前 提 下 被 扩 展 可 以在 不 必 修 改 源 代 码 的 情 况 下 改 变 模 块 的 行 为不 允 许 修 改 系 统 的 抽 象 层 , 允 许 扩 展 系 统 的 实 现 层优 点 : 通 过 扩 展 提 供 新 行 为 , 满 足
30、新 需 求 提 高 适 应 性 、 灵 活 性已 有 模 块 , 包 括 抽 象 层 模 块 不 能 修 改 , 提 高 稳 定 性 、 延 续 性画 出 类 图 并 回 答 问 题 :矩 形 类 有 方 法 : 取 宽 、 取 高 、 求 面 积 , 正 方 形 类 有 方 法 : 取 边 长 、 求 面 积 , 正 方 形 类 是否 可 以 继 承 矩 形 类 ? 为 什 么 ?如 宽 、 高 可 以 变 化 , 矩 形 类 增 加 方 法 : 设 宽 、 设 高 、 循 环 自 增 宽 直 至 超 过 高 , 正 方 形 类 增 加方 法 : 设 边 长 ,正 方 形 类 是 否 可 以
31、 继 承 矩 形 类 ? 为 什 么 ?见 java 与 模式 第 7 章1. 有如下类层次结构。假设在某段 Java 代码中包含三个重载方法,分别为void draw(Shape s,Circle c)void draw(Rectangle r,Shape s)void draw(Square q,Circle c),各个类分别有实例 aShape,aRectangle,aCircle,aSqure,aEllipse。R e c t a n g l eS h a p eC i r c l eS q u a r e E l l i p s e请叙述下列方法调用所执行的方法:draw(aShap
32、e,aCircle)draw(aShape,aShape)draw(aSquare,aEllipse)draw(aRectangle,aCircle)多 个 方 法 具 有 同 样 的 名 称 和 相 同 数 目 的 参 数 时 ,JAVA 编 译 器 确 定 如 何 匹 配 的 算 法 。说明解 决 重 载 方 法 名 的 算 法 步 骤draw(aShape,aCircle)执行 void draw(Shape s,Circle c)draw(aShape,aShapee)报错draw(aSquare,aEllipse)执行 void draw(Sauqre q,Circle c)draw
33、(aRectangle,aCircle)报错算 法 步 骤 :1、 找 精 确 匹 配 ( 实 参 与 形 参 所 属 的 类 相 同 ), 如 果 找 到 , 执 行 精 确 匹 配 。2、 找 可 行 匹 配 ( 符 合 替 换 原 则 的 匹 配 , 实 参 所 属 的 类 是 形 参 所 属 的 类 的 子 类 ), 如 果 找 不 到 , 报错;如 果 找 到 一 个 可 行 匹 配 , 执 行 这 个 可 行 匹 配 ; 如 果 找 到 多 于 一 个 可 行 匹 配 , 转 第3 步 。3、 多 个 可 行 匹 配 两 两 比 较 , 如 果 一 个 方 法 的 各 个 形 参
34、, 或 者 与 另 一 个 方 法 的 对 应 位 置 形 参 所 属 的 类 相 同 ,或 者 形 参 所 属 的 类 是 另 一 个 方 法 的 对 应 位 置 形 参 所 属 的 类 的 子 类 , 该 方 法 淘 汰 另 一 个 方 法 。 最 后 ,如 果 只 剩 一 个 幸 存 者 , 执 行 这 个 幸 存 者 ; 如 果 剩 下 多 于 一 个 幸 存 者 ,报错。1. 类 A 为使用类 B 的属性和方法,继承了类 B,但是类 A 和类 B 之间不存在 IS-A 关系,请问如何对该不合适的继承关系进行改造?使用类图进行说明。类 A 使用类 B 的属性和方法定义为类 C, 类 A 、类 B 继承类 C依赖倒转原则开-闭原则 dimiteuml 类 对 象 时 序设 计 模 式 3 工 厂 单 态 策 略 油 漆 工 观 察 者 适 配 器