面向对象(共12篇)
面向对象 篇1
1 问题的提出
面向对象和面向过程的程序设计技术现在再来谈论,似乎是一个过时的话题。但是,教学中至今针对两者的关系理解不够透彻的学生不在少数。在Java、C++等面向对象的程序设计语言的很多教材里,面向过程的自顶向下逐步求精结构化的程序设计的三种控制结构占据了一定的章节数,其中很多例题是对三种控制结构使用方法的巩固,学生也常常是模仿着这种例题来练习,这常常造成学习面向对象的编程语言,而设计出面向过程的软件的局面,掌握不好面向对象的程序设计方法。20世纪80年代提出的面向对象的程序设计方法之后,对于程序设计的面向对象和面向过程两种方法,大部分教材偏重于讨论它们的区别,产生两种方法是对立的,互无关联的想法大有人在,似乎有了面向对象的技术,就可以不用面向过程。实际上,面向对象的技术是在面向过程的基础上,为程序设计提供了更多的手段和方法,两种技术不是非此既彼的对立关系,不能说面向对象的技术替代了面向过程,如果用面向对象的技术就要把一个软件任务划分成两个层次,第一个层次是做什么,第二层次是怎么做,那么面向对象技术是解决第一个层次的问题,面向过程则是解决第二个层次的问题,只有在两个层次上的任务都完成之后,才能说完成了整个程序设计任务。也就是说这两种程序设计方法只是从不同的层次来完成程序设计的任务,面向对象的技术是在面向过程的自顶向下逐步求精最终将软件分解成为具有三种控制结构的若干方法过程或函数基础之上,又提供了抽象、封装、继承、多态技术手段,从而能够设计出更好更复杂的软件。可以说面向对象技术中存在着面向过程,或者说面向对象技术就是抽象、封装、继承、多态加上顺序、条件、循环三种控制结构的使用。
2 两种技术的包含性
面向对象可以认为又提供“四”种技术:抽象、封装、继承、多态,面向过程有“三”种控制结构:顺序、条件、循环。以Java语言为例,用求1到n的简单问题来分析两种设计方法:
2.1 面向对象的技术是“四”加“三”的技术
(1)建立对象模型(类)———应用“四”的技术
(2)方法的具体实现———应用“三”的技术
2.2 面向过程的技术———仅仅应用“三”的技术
(1)分析出若干函数或过程并给出具体实现的细节
从上述简单的问题可以看出在用面向对象技术设计类后,一个类中就会有若干方法,每个方法完成一个特定的功能,在考虑类的行为功能实现时,显然是面向过程的思维方式,只是这些方法不再独立,而是与数据一起形成了一个有机的整体。面向过程技术存在于经过面向对象方法分析之后的形成的若干类的行为设计中也就是类方法实现之中。
面向对象的设计包含了面向过程,面向对象比面向过程站到了一个更高的层次上,主要进行总体结构模型设计(构建类),对数据和方法进行封装,面向过程主要是写函数或过程也就是确定类中的方法的实现,这也是类中的方法必须要做的步骤;就象我们建一个居民小区,先把围墙建好,决定好里面要做什么,然后还是要在里面进行盖房子的过程一样,要建好居民小区两个步骤缺一不可。所以说用面向对象的技术设计软件时包含了面向过程。
2.3 两种技术的同一性
对于一个方法要讨论的问题的关键问题是数据从哪里来,运算操作之后到哪里去的问题。方法也就是对输入数据进行处理从而得到结果输出,可以说是由三个部分:输入、操作、输出完成的,输入数据可以体现为的两种形式:无参数和有参数;输出数据同样体现为两种形式:无返回值和有返回值;简单的方法可以是无参数和无返回值的,例如:
讨论一下面向对象技术设计的类中的方法的输入和输出的情况。众所周知,无论是面向对象还是面向过程在描述问题时总是围绕着两个方面:方法和数据,教材中常提到面向对象是方法和数据合并或封装,面向过程是方法和数据分开或隔离,这个特性对类中的方法设计有什么影响?直接地具体地在程序设计时能带来什么好处?事实上,由于面向对象实现了数据和方法的封装,它的好处就是使得类中方法的输入数据多了一个来源,也就是输入数据有了两个来源,一个是类中的属性变量,另一个是方法的形式参数,例如上例中的getSum()方法,它是无参数的,那么它运算的数据来源于何处?实际上就是使用了本类中的数据----属性变量,也就是说当类中的属性能够满足类中的方法输入数据的需要,就可以无参数,虽然无参数,但具备有参数的功能,原因是类中的属性是可以随时变化的,这归功于面向对象的封装技术。当然,也可使用方法本身的数据----形式参数,设计出getSum(int n)方法,这就形成了同一方法的两种不同的实现,面向对象技术中的多态性,使这两种方法能够共存于一个类中,增加了类的可适应性和简洁性。如果用面向过程的技术只能设计出一个独立的过程或函数:getSum(int n),因为面向过程的程序和数据是分开的,每个过程也都是独立的,所以过程或函数在设计时没有别的数据来源,只有依赖于自身的形式参数,无法从别处获取数据,只能在方法内部构建形式参数做为伪数据以求得将来真实的数据———实际参数的传递。同理,类中方法处理的数据结果也变成了有两个去处:一个是类中的属性变量,一个是方法的返回值。这就是数据和方法封装在一起的好处,它使得输入输出有了更多的选择,这也是设计方法时解决算法之后要解决的重要问题。
再看下例:
面向对象的继承技术,使得类中面向过程的方法有了更多的功能。就单纯的面向过程的设计方法,没有实现封装、多态,继承等技术做支撑,也就是说缺乏一个可靠的围墙来做保护,使之不能在围墙之内随着问题的变化而变化,所以软件的可维护性、重用性,复杂度具有劣势。而面向对象的技术中也包含了面向过程的设计,面向对象的封装、多态和继承技术又允许同一个类中的面向过程的同一方法设计有更多的实现方式和更多的功能的扩充,如:getSum(),getSum(int n);getMul(),getMul(int n)。面向对象类中的方法的实现可以等同于在封装、多态、继承技术下的结构化程序设计中的函数设计,它使得类中的面向过程的方法设计有更多的实现,具有同一性。只是这些函数都有自己的归属———某一个类。
3 总结
应该看到,很多面向对象语言的教材中的例子严格说来都是用面向对象的语言写出的面向过程的程序,再加上学习程序设计言时大多是以先模仿例题为主,它带来的负面影响就是更加分不清楚两种技术的关系。另外,为什么教材中的例子是用面对象的语言写出的面向过程和程序呢?原因是大部分例题是属于简单的程序,实际上,对于简单和程序也是没有必要一定用对象的方式来思考问题,面向过程反而适用。用对象来理解和分析问题,并设计和开发出由对象构成的软件系统,是面向对象技术的核心,如果用这种方法设计软件它是离不开面向过程的,它是在面向过程的结构化程序设计所运用的三种控制结构之上又增加了类、封装、继承、多态等技术可以说是“四”加“三”技术来构造、测试、重构软件,因此,就有了比面向过程更多的软件设计和实现手段。这些技术能实现复杂系统的设计与开发,可大大提高软件的规范化程度和开发效率,提高软件的可重用性和降低系统的复杂度,这已是不争的事实。关键的问题在于两种思维模式的建立以及对它们包容性、同一性的认识,从而不致于两种方法混淆不清,得到非此既彼的结论,并能根据实际需要正确地选择设计方法。
摘要:面向对象和面向过程的程序设计技术现在再来谈论,似乎是一个过时的话题。但是,教学中至今对两者的关系理解不够透彻的学生不在少数。面向对象和面向过程可以看成“四”和“三”。有了面向对象的技术之后,产生两种技术非此既彼的对立关系的思想是由于过度强调它们的区别造成的。两种思维模式的建立是关键的问题,程序设计中能根据实际需要正确地选择设计方法。
关键词:程序设计,面向对象,面向过程,同一,对立
参考文献
[1]陈志泊.面向对象的程序设计语言C++[M].北京:人民邮电出版社,2009.
[2]刘艺.Java2程序设计大学教程[M].北京:机械工业出版社,2006.
面向对象 篇2
1请解释下列10个shell命令的用途
top、ps、mv、find、df、cat、chmod、chgrp、grep、wc
2、写出下列服务的用途和默认端口
ftp、ssh、http、telnet、https
面向对象
1、写出php的public、protected、private三种访问控制模式的区别
2、写出下列程序的输出结果
class a{
protected $c;
public function
a(){
$this ->c=10;
}
}
class b extends a
{
public function print_data(){
面向对象数据库系统设计 篇3
关键词:面向对象;数据库;系统设计
一、数据查询(OQL)
作为数据库,最重要的估计是数据查询了,面向对象数据同样如此。在这里,我设计了以下查询语法:get(…)if(…),其中get里面是要查询的类,类的属性等,相当于SQL里面的select … where …。比如有类A,A中有一个属性a(数字型,关于类型后面会说)。则获取所有A类实例中所有a的值小于0的实例集合的查询语句是:get(A)if(A.a<0);
执行该语句应该要返回所有类A实例中所有a小于0的实例集合。具体使用方法如下:
(一)单类查询
即在一个类中进行查询。如:get(A)if(A.a<0);就返回是所有类A实例中所有a小于0的实例集合。而不带条件的查询是get(A);这将返回类A的所有实例。
(二)多类查询
如:get(A,B);将返回类A和类B的所有实例的数据。
(三)方法查询(暂不实现)
(四)表达式计算
如:get(3+3);返回的将是6。
(五)复杂查询
如:get(A.a+B.b,C,C.a/A.a)if(A.a
二、数据操作(OML)
(1)插入数据:new 类名(构造函数参数列表);这样即生成了一个实例(即插入一个实例)。举例如下:
Test t = new Test(1,2,3);//假如类Test的构造参数是三个数字类型的参数。
(2)更新数据:直接调用该类实例的引用的属性复制即可实现更新。举例如下:
t.a = 3;//假如类Test有个公有成员a且是数字型的。
可以有更复杂的、有逻辑的更新,如:if(Test.a>3){Test.a = 1;//将所有符合条件的Test类的实例的a字段复制为1,是集合操作。}
又如:while(t.a>0){Test.a——;//只要实例t的字段a的值还大于0,则所有Test的实例的值继续减一。}
(3)删除数据:free(类名)if(删除条件表达式)。如果没有if,则删除此类的所有实例。free(Test)if(Test.a>0);这将删除类Test的实例t。
(4)数据定义(ODL)
定义语言包括类的定义和对象的定义。语法模仿的Java的语法。具体如下:
定义类:
class :定义类,语法如下:class 类名{
属性定义:其中包括变量权限声明,值定义,类型声明,目前仅支持三种类型,字符串型,数字型和 比特型。
方法定义:方法定义,跟Java类似,但目前仅留接口,不做实现。}
下面是一个实例:
class Test{private num a;//数字型;public str b;//字符串型;protected byte c;//比特型,变长比特型,用来存储大容量数据;public void testMethod(num a){//方法定义,目前暂不实现a++;this.a = a;}“;//”一定要加 “;”号,否则不能结束。
alter:更新类。语法如下:alter 类名.字段名或者方法名 =
{//字段或者方法的新式描述,如果没有任何信息,则表示删除该字段或者方法};举例如下:
alter Test.a {public num a;//如果不是命名为a,而是b,则将删除a字段,新建b字段。
该语句将把字段a的访问权限从私有变为公有。下面是更新方法:alter Test. testMethod {public void testMethod(num a){//方法更新,目前暂不实现a++;this.a = a——};
drop:删除类。此关键字只有一个语法,即:
drop 类名;如:
drop Test;//即表示删除Test类。
(5)数据控制使用try{//行为}catch(){}的语法形式,用来控制事务。在try块中的行为必须全部执行成功数据库才会更改,相当于事务提交。如果发生异常(即不能全部执行成功),则事务回滚。同时还要执行catch块中的信息。一般说来,catch块中留空则只回滚事务。
参考文献:
[1]邢斌、高荣芳、刘予东,《基于JSP的学生就业管理系统》,福建电脑。2006-9
作者简介:
从面向过程到面向对象的变革 篇4
1“软件危机”与面向过程方法
20世纪60年代中期,随着计算机技术的逐步成熟,计算机应用范围的逐渐扩大,软件开发领域急剧膨胀,这时,软件开发人员开始面临一个十分严峻的问题——“软件危机”。
“软件危机”主要表现为三点:第一,开发出来的软件的功能和用户的需求往往“牛头不对马嘴”;第二,软件系统的规模和复杂度的扩大让开发人员力不从心,开发过程中的一些错误已经达到开发人员无法掌控的地步;第三,开发出的软件可维护性很差,要复用已有成果或者对其进行扩展都很困难,软件的进化也很难跟上硬件发展的速度。
追究“软件危机”产生的原因,固然有一部分是因为开发者缺乏对大规模软件的管理经验,缺乏正确的方法学指导或者是开发工具的支持(杨健,张晓玲,周少,2006,135-136),但是最关键的问题在于——当时大多数软件开发工作的全过程,包括分析,设计以及编程实现等,都采用面向过程方法。具体来说,在分析阶段,开发人员根据面临的情况,如用户的需求,软件要求的功能等,做出一个物理模型,其次转换成逻辑模型,再通过数据流分析,把这个模型转化数据流图,记录数据字典。在设计阶段,开发人员根据数据流图划分数据类型,并映射到不同的程序模块类型,通过这样完成分析模型到设计模型的转变,并设计出数据结构图。然后,开发人员在此基础上详细的设计每个程序模块内部的结构和算法。常常是把大模块又分成很多小模块,多次分解,最后再设计完成每个小模块的内容。在实现阶段,利用面向过程的编程语言(如C语言等)进行编程,具体实现整个软件系统。
之所以说这一套方法是导致“软件危机”的关键,是因为它不论是在分析和设计上,还是在编程实现上都存在很大的弊端。
第一,面向过程方法的分析手段是不够妥当的。整个分析和设计阶段可以概括为“需求-数据流-程序模块”的模式,所以对于需要解决的问题,在分析阶段并不能直观的显示出各种事物及其关系,而是映射到数据流中进行分析。因此,当系统比较复杂的时候,很难判断基于数据的分析是否有偏差,是否相对于原本的实际问题有出入,或是否存在理解上的错误。也正是因为所有的分析工作是基于数据流的,开发人员在分析阶段就面临和用户沟通上的困难,他们很难和用户解释数据流图中的内容代表了什么,很难通过沟通发现分析结果和用户需求的差距在哪。并且,如果用户在开发工作的中途想改变一些需求或是外界条件发生了变化,开发人员也不能直接改动分析结果,必须重新映射到数据上再做调整。
第二,从分析阶段到设计阶段的转化是有很大的隐患的。所谓的“数据—程序模块”的转型就是依照一些对应原则,把数据流图转化成程序模块,这两种不同的体系之间的转换是否正确,是否合理是没有保障的。这种“需求-数据流-程序模块”的模式就像多人传话一样,第一个人传话给第二个人,第二个人根据自己的理解把话传给第三个人,第三个人再加上自己的理解,得到的结果和原话已经不是一个意思。原本的内容经每个步骤都被不同的体系“转义”了一遍,这样很可能导致设计出的结果和软件需求的本来面貌相差甚远。
第三,由于面向过程的程序语言本身存在很多不足,导致软件开发的实现阶段出现了很多问题。首先,程序的安全性缺乏保障。很多关键的数据既可以被作用于它们的操作访问,也可以被其他的操作访问。并且,面向过程的程序操作都属于“白盒操作”,所有细节都被暴露在外。一个疏忽的数据修改或者程序调用都可能导致整个系统崩溃。其次,程序员的工作非常繁杂。由于数据和函数是分开来处理的,程序员在编程的时候要考虑的因素就很多,每次编写一个函数都必须把详细的注释添加到数据字典中,对于不同类的数据进行一种操作或者同一类数据进行不同操作都必须写不同的代码。这种编程对程序员的水平要求非常高,仅仅让数据和函数一直保持兼容就已经是程序员沉重的负担。在团体合作中,一个程序员要接手另一个程序员的工作往往需要阅读数十页的数据字典,不同的程序员编写的程序可能还存在着名称重复,风格迥异等冲突,这些问题在复杂的系统中将凭空地加大程序员的工作量。再次,软件的可维护性很差。由于数据和函数代码的分离,每当数据发生改动,所有相关的函数都要重写,想对整个程序进行扩充,升级,或者移植到别的背景下重用都面临着大量的代码修改。
2 面向对象方法
我们可以看到,面向过程方法确实给软件开发工作带来了很多困扰,而面向对象方法正是在这种情况下诞生的。面向对象总的来说有三大特点的:封装性,继承性和多态性。
封装性是面向对象最基本的特点,因为它体现了面向对象最基本的思想:客观世界是由各种对象组成的,复杂的对象可以由比较简单的对象以某种方式组合而成(符于江,2008,451-456)。所有的对象都具有静态属性和动态行为,把相似对象的属性和行为抽象出来,用这些共同的属性(数据)和行为(方法)构成类,作为创建具体对象的模板。封装性就是指把关于一个类的所有数据和方法一起封装在类的内部,只通过一些方法作为对外沟通的接口,外界只能通过这些接口和对象进行联系,而对象内部的很多数据和具体操作是对外不可见的。
继承性是指对于一些具有一般意义的类,可以创建它们的子类,子类可以继承一般类的所有属性和方法,同时可以根据自己的特性,修改继承得来的属性和方法或者添加自己独有的属性和方法。比如对于一般类“亚洲人”,我们可以创建子类“中国人”,“韩国人”等。
多态性有两种形式。第一种是一个类中同名字的方法可以接受不同类型的参数,对于不同类型的参数的处理是不同的。比如在一个类中定义“add”方法实现数的相加,它既可以处理整形的参数,也可以处理浮点型的参数,还可以处理一些自定义类的参数,但是针对每个类型都有各自的处理操作。第二种多态和继承性有关。由于某个父类可以有多个子类,每个子类都可以根据自己的特征修改父类中的属性和方法,当把这些子类当成父类来用的时候(如JAVA中的上转型对象或是接口回调),相同的父类方法就会有不同的实现方式。例如一个JAVA程序中,对于父类“动物”中的方法“叫”,用子类“狗”的上转型对象实现该方法则输出“汪汪”,用子类“猫”的上转型对象实现该方法则输出“喵喵”。
基于以上三大特点,面向对象方法导致了对整个软件开发过程的彻底变革。在软件开发的分析,设计和实现阶段都和面向过程方法截然不同。开发人员首先按照需求分析出软件的每个必备功能。然后归纳属性,确定对象及对象之间的关系。再进一步把功能分配给每个对象,构建对象的行为。接下来对每个对象的方法和对象之间的交互作进一步的细化。再接着确定可重用的类和部件,用结构图画出各个类,部件的结构和相互依赖关系。最后再对软硬件的相互依赖关系进行描述。在以上分析和设计工作完成之后,开发人员利用面向对象程序语言进行编程来达到软件功能的实现。
3 面向对象方法的优越性
面向对象方法之所以能把软件开发带入了一片新天地,是因为它在以下三个方面都有卓越之处。
3.1 整体开发思维
抛开具体操作流程不说,面向对象方法首先对解决问题的整体思维进行了人性化的革新。其人性化主要体现在以下四点:首先,人们生活的现实世界是个体,群体及各种关系组成的,面向对象的系统也是如此。对象代表个体,类代表群体,对象之间,类之间,类与对象之间通过方法调用建立各种关系。其次,从大众个体中总结出一类共同的属性和行为,从而形成类的手段正是人类抽象思维的应用。抽象思维是人类最基本,最习惯的思维之一。再次,面向对象允许开发人员一开始只拟定系统的大致框架,即确定主要的类及其关系,之后再逐步对其进行细化和拓展。这和人类逐步深入的思考习惯是相一致的。最后,面向对象方法大大简化了开发人员思考问题的复杂度。比如对于一个子类,开发人员可以理所当然的认定它已经拥有父类的所有一般特征,只要把精力放在思考子类的特性上就可以了。面向过程要求程序员必须从数据流动的角度思考待解决的问题,而面向对象的这些人性化因素让开发人员摆脱了这种被迫的“机器化”思考的尴尬境地,用自然贴切的思维考虑问题。
3.2 分析和设计
面向对象方法是分析和设计阶段的合理性有了很好的改善。面向对象的分析和设计采用的是“需求-对象-类”的模式,用对象和类直观地描述系统中的事物及其关系,这样就解决了面向过程方法所导致的一系列问题。在分析过程中,这种直观性原本的保留了所有事物及其关系的原貌,因此在构建对象和抽象出类的时候,很容易被发现在理解上的偏差。同时,开发人员也很容易向用户解释各个类和对象的含义,可以及时得到用户的反馈。处理需求的改变或是外部条件的改变时,也可以直接修改相应的类和对象。除此之外,对于问题的描述和对于问题的解决都应用同一套类和对象系统,因此软件开发的分析工作和设计工作是连续的,甚至是部分重叠的,不存在面向过程中从数据流到程序模块的转化,不用担心因为一个系统到另一个系统的映射不当导致结果和目标的偏离。
3.3 编程实现
面向对象编程语言的应用使得软件工程的实现过程有了很大的改进。
首先,程序的安全性有了明显的提高。由于类的封装,对象中只有少数的成员和方法可以被外接直接调用,对象内部的实现细节也是被隐藏的。这样有效降低了程序各部分间的依赖性,整个系统一般不会因为某处变动而引发整体混乱。
其次,面向对象把开发人员的编程工作变得比较轻松和方便。每个对象的数据和操作都被封装在一起,因此开发人员很容易保持数据和方法的兼容性,并且编程时只需要对每个类进行说明,不需把对于每个数据,每个方法的描述都写进数据字典。对于被封装的方法,只要依据访问规则就可以使用,不必了解实现细节。类中描述了一类个体的共有特征,在创建对象的时候这些描述不需要一遍又一遍的重复。类和对象的设置还易于分类,管理和查找。这些改变都在很大程度上降低了开发工作对程序员编程水平的要求。
再次,面向对象让团体合作的编程更加顺畅。归功与类和对象的直观性,当某程序员利用别人的成果时不必面临复杂的查阅,学习过程。继承性和多态性允许开发团队先行确定主要的类及关系,事先统一编程标准和风格,然后再把具体的细节交给不同的人员实现,这样最终得到的结果不会面临很多麻烦的冲突问题。
最后,面向对象语言最强大之处表现为可复用性和可扩充性。通过继承已有的类可以实现可复用性,让很多类的性质可以被共享。在开发过程中,复用自己或是他人已有的成果,等于是站在巨人的肩膀上,省去了大量的工作,加速了开发进程。另外,被重用过的代码都是经过测试的,这样大大减少了编程中发生错误的机会。面向对象的三大特点使程序具有良好的可扩充性。封装性使程序各部分间的独立性很强,继承性使类程序具有层次结构,多态性是程序能够实现问题的复杂多样。当开发人眼对已有的问题有了新的认识的时候,通过继承和多态的方式,无需修改原来的父类代码,就可以再创建新的子对象类的过程中增加新属性,或删除过时无用的属性,操作或对象,达到高效的功能扩充。可复用性和可扩充性让整个软件有很强的可维护性。在修改程序的过程中,修改某个对象对别的对象影响很小,新增或修改某功能对其他功能的影响很小。同时,开发出的软件也有很好的可移植性。对于不同的使用条件,只要修改很少的代码就可以让软件重装上阵。
4 面向对象方法的局限
虽然说面向对象方法给软件工程带来了很多好处,但是它也存在自己的局限性。第一,面向对象方法对支撑它的工具和环境的要求比较高。第二,利用对象和类对问题的描述存在不足。由于客观世界中很多事物的界限并不是很清晰,这给创建对象和抽象出类的正确性和精准性都带来了困难。并且,对于同一个客观事物,不同的人从不同的角度观察分析可能会映射出不同的对象属性和方法,有的时候开发团队之间或是开发人员与用户之间可能存在分歧。第三,面向对象程序的运行效率可能比较低,由于通过继承引入了层级,过多的祖宗类和父类势必会影响运行效率。所以在实现软件的时候应该遵循“多组合,少继承”的原则。第四,封装性带来的程序内部不可见可能给软件的维护带来不便。
由于这些局限性,在处理问题的时候不能盲目采用面向对象方法,必须先分析要解决的问题类型来决定是采用面向对象方法,面向过程方法还是其他方法,或是几种方法的综合运用。
参考文献
[1]郑莉,董源,张瑞丰.C++程序设计[M].3版.北京:清华大学出版社,2004.
[2]耿祥义,张跃平.Java面向对象程序设计[M].北京:清华大学出版社,2010.
[3]张孝祥.Java就业培训教程[M].北京:清华大学出版社,2003.
[4]杨健,张晓玲,周少云.软件危机及其应对措施探讨[J].电脑知识与技术,2006(35):135-136.
[5]符于江.程序设计中结构化方法和面向对象方法的比较[J].电脑知识与技术,2008(21):451-456.
[6]郭溪川.对比分析面向对象方法与结构化方法[J].农业网络信息,2006(11):100-104.
[7]张莉,裘国永.结构化方法与面向对象方法的比较分析[J].陕西师范大学学报:自然科学版,2006(6):29-32.
面向对象设计的优点 篇5
首先,对象的引入方便了在软件虚拟世界中模拟现实世界。现实世界是由很多独立的抽象或具体物体组成的,比如房子、汽车、空调、书等等。为了构建更真实的虚拟世界,在软件中需要存在用于表达类似现实物体的编程元素,这正是引入对象概念的意义所在。
以对象为设计中心,迫使设计者在关注程序所需实现功能的同时不至于忘记通过抽象去塑造概念,以便用对象表达之。由于抽象获得的对象有助于隐藏复杂度,这在一定程度上简化了通过对象表达和理解软件虚拟世界的难度。也由于对象的存在,使得设计更加的生动和具有更强的自我解释能力。
从软件设计者的角度:如果希望塑造的对象在现实生活中存在,这有助于他借助现实引导自己的设计,他也应尽量将虚拟世界中对象的行为塑造成与现实世界的相近;如果希望塑造的对象在现实生活中并不存在,他只能借助对象的行为和状态去塑造对象(的概念),此时应注意行为、状态与概念间关系的合理性,否则所塑造的对象将令人费解。
从软件维护者的角度:如果对象在现实生活中存在,这有助于他借助生活经验快速掌握设计;如果在现实中找不到对象的影子,他仍可以通过对象的行为掌握对象的概念,这同样有助于他更方便地维护软件,
其次,面象对象设计由于强调以对象为中心,因而具备更强的封装能力。在大多支持面向对象设计的编程语言中,更强的封装能力除了意味着更具信息隐藏能力外,还使得封装的边界既明显又更不易被突破,这有助于在软件的维护过程中维持“形”。某种程度上,面向对象设计强化了软件行业推崇的模块化设计。
再次,面向对象设计中的继承和多态技术除了进一步提高通过软件模拟现实世界的能力外,还能让设计更灵活、易变更和方便复用。
显然,面向对象设计的优势是通过使得设计方法更抽象而获得的,这也解释了为什么掌握面向对象设计比掌握面向过程设计更难。现实中,由于有些工程师难以转变为从对象、继承和多态的角度思考设计,使得运用面向对象设计这一方法举步为艰。
面向对象设计的关键是用对象表达抽象概念,如果抽象出的概念并不清晰,则所获得的设计一定不会好。千万不要误以为运用面向对象设计所获得的设计就一定比面向过程的好。好方法获得好结果的前提仍需要我们运用好。
面向对象的软件工程应用研究 篇6
【关键词】软件工程;面向对象;软件开发
1.软件工程的定义
软件工程是指导计算机软件开发和维护的工程学科。采用工程的概念、原理、技术、方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方面结合起来,经济地开发出高质量的软件并有效地维护它,这就是软件工程。
软件工程运用计算机科学、数学及管理科学等原理,借鉴传统工程的原则、方法,创建软件以达到提高质量、降低成本的目的。其中,计算机科学、数学用于构造模型与算法,工程科学用于制造规范、评估成本及确定权衡,管理科学用于计划、资源质量、成本等管理。
2.软件工程方法的流程
2.1软件计划
在设计任务确立前,首先要进行调研和可行性研究,理解工作范围和所花费的代价,然后做出软件计划。
2.2软件需求分析
对用户要求进行具体分析,确定用户要求软件系统做什么,并用软件需求规格说明书表达出来,作为用户和软件人员之间共同的约定。
2.3软件设计
根据需求说明建立软件系统的“结构”,包括数据结构和模块结构。这部分又分为总体设计和详细设计两个阶段。
2.4软件编码
按软件设计的要求为每个模块编写程序。
2.5软件测试
发现和排除程序中留存的错误,经过测试排错,得到可交付运行的软件。软件测试又分为单元测试和综合测试两个阶段。
2.6软件维护
经过测试的软件仍然可能有错,另外,用户的需求和系统的操作环境也可能发生变化,因此,交付运行的软件仍然需要继续排错、修改和扩充,这就是软件的维护。
3.面向对象的软件工程方法
3.1面向对象的软件工程方法的定义
面向对象技术(OO)是一个非常实用而强有力的开发方法。它是为了提高软件系统的稳定性、可修改性和可重用性创造出来的一种软件工具,具有方法的唯一性、高度连续性等特性,并把面向对象分析、面向对象设计和面向对象编程集成到软件生存周期的相应阶段。
面向对象的软件工程(OOSE)自上至下、自始至终地贯彻面向对象思路,可以用于系统分析、系统设计、程序设计,也可以用于其他环境的开发,如数据结构设计、数据库设计等。
3.2面向对象的软件工程方法的特征和要点
面向对象软件工程方法的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的空间(也称为求解域)在结构上尽可能一致,因此,面向对象方法有以下的基本特征:
(1)封装性:对象是数据和有关操作的封装体。
(2)继承性和类比性:在对象继承结构上,下层对象继承上层对象的特征属性和操作。不同的对象具有某些相同的属性时,常常把它们归并成一类。
(3)动态连接性:对象和对象之间所具有的一种统一、方便、动态地连接和传递消息的能力与机制。动态连接性便于在概念上体现并行和分布式结构。
(4)易维护性:任何一个对象都是把如何实现对本对象功能的细节隐藏在该对象的内部,这就增强了对象和整个系统的易维护性。
概括地说,面向对象方法具有下述四个要点:
(1)把对象作为融合了数据及在数据上的操作行为的统一的软件构件。面向对象程序是由对象组成的,程序中任何元素都是对象,复杂对象由比较简单的对象组合而成。
(2)把所有对象都划分成类。每个类都定义了一组数据和一组操作,类是对具有相同数据和相同操作的一组相似对象的定义。数据用于表示对象的静态属性,是对象的状态信息,而施加于数据上的操作用于实现对象的动态行为。
(3)按照父类(或称基类)与子类(或称派生类)的关系,把若干个相关类组成一个层次结构的系统(也称类等级)。在类等级中,下层派生类自动拥有上层基类中定义的数据和操作,这种现象称为继承。
(4)对象彼此之间仅能通过发送消息互相联系。对象与传统数据有本质的区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体,必须向它发消息,请求它执行它的某个操作以处理它的数据,而不是从外界直接对它的数据进行处理。
3.3面向对象建模
为了更好地理解问题,人们常常采用建立问题模型的方法。通常,模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。更进一步讲,模型是一种思考工具,利用这种工具可以把知识规范地表示出来。
用面向对象方法开发软件,通常需要建立三种形式的模型,它们分别是描述系统数据结构的对象模型,描述系统控制结构的动态模型和描述系统功能的功能模型、这三种模型都涉及数据,控制和操作等共同的概念,只不过每种模型描述的侧重点不同。这三种模型从三个不同但又密切相关的角度模拟目标系统,它们各自从不同侧面反映了系统的实质性内容,综合起来则全面地反映了对目标系统的需求。
3.4面向对象软件开发方法的几个阶段
实际上,用面向对象方法开发软件时,阶段的划分是十分模糊的,通常在分析、设计、实现等阶段间多次迭代。
(1)面向對象分析。面向对象分析(通常缩写为OOA),就是抽取和整理用户需求并建立问题域精确模型的过程。面向对象分析的关键,是识别出问题域内的对象,并分析它们相互间的关系,最终建立起问题域的简洁、精确、可理解的正确模型。在面向对象分析中,主要由对象模型、动态模型和功能模型组成。在用面向对象观点建立起的三种模型中,对象模型是最基本、最重要、最内核的。
(2)面向对象设计。从面向对象分析到面向对象设计(通常缩写为OOD)是一个逐渐扩充的过程。或者说,面向对象设计就是用面向对象观点建立求解域模型的过程。面向对象设计可再细分为系统设计和对象设计。系统设计确定实现系统的策略和目标系统的高层结构。对象设计确定解空间中的类、关联、接口形式及实现服务的算法。
(3)面向对象实现。面向对象实现主要包括两项工作:
第一项工作是把面向对象设计结果,翻译成用某种程序设计语言书写的面向对象程序(通常此阶段缩写为OOP);第二项工作是测试并调试面向对象的程序。面向对象程序的质量基本上由面向对象设计的质量决定,但是,所采用的程序设计语言的特点和程序设计风格也将对程序的可靠性、可重用性和可维护性产生深远的影响。
综上所述,面向对象软件工程方法可概括为如下的过程:分析用户需求,从问题中抽取对象模型;将模型细化,设计类,包括类的属性和类间相互关系,同时考察是否有可以直接引用的已有类或部件,选定一种面向对象的编程语言,具体编码实现上一阶段的设计,并在开发过程中引入测试,完善整个解决方案。■
【参考文献】
[1]钮海燕. 大连:引智趋动软件产业国际化[J]. 中国经济快讯, 2001, (42) .
[2]学术文摘[J]. 西北大学学报:自然科学版,1989, (04).
[3]郭彦坤. 用软件工程方法规范应用软件的管理[J]. 中国金融电脑, 1998, (02).
[4]梁宁利. 利用软件工程基本原理对一个电子信息发布管理平台设计[J]. 科技经济市场, 2007, (10) .
[5]傅智杰.基于构件的软件开发方法在银行业中的应用[J].中国金融电脑, 2006,(01).
[6]崔启亮. 软件国际化与本地化管理[J]. 软件世界, 2006, (23).
[7]刘欣苗. 软件工程方法在MIS开发中的运用[J]. 科技创新导报, 2008, (27) .
[8]吴立明. 面向对象的机械CAD软件工程方法探析[J]. 科技创新导报, 2009, (24) .
面向对象编程思想解析 篇7
面向对象的思想不仅仅局限于软件设计, 它已经拓展到更多的领域, 如分布式系统、应用平台、交互式界面、数据库系统、人工智能、嵌入式软件系统等领域。作为计算机专业的求学者和从业人员, 不管钻研或从事哪个方向的, 都应该对面向对象编程思想有所了解。
通俗地讲, 面向对象编程思想可以概括如下:系统中的一切事物都是对象;将属性和对属性执行的操作封装成为整体, 这个封装体即是对象;属性和操作相同的对象抽象成为类, 对象则是类的实体;发送消息可以使对象执行相应的操作;在现有类的基础上增加属性或操作可以构成另一个类, 这是类的继承。
2 面向过程编程思想所存在的问题
2.1 可维护性差
用传统的面向过程方法所开发出的软件, 由于可修改性较差, 维护时产生的费用仍很高, 造成其可维护性差。
2.2 重用性差
重用性指软件不用修改或略加修改就能重复使用。面向过程程序设计阶段软件重用性极差, 引起软件危机, 软件工程这一学科由此而诞生, 提高重用性是软件工程的重要目标, 而面向对象的继承机制很好地解决了软件重用性这一问题。
2.3 软件功能与用户需求不一致
用传统的结构化方法开发大型软件系统涉及各种不同领域的知识, 在开发需求模糊或需求动态变化的系统时, 所开发出的软件系统往往不能真正满足用户的需要。
3 面向对象的重要概念
3.1 类
类是属性与操作相同的对象的抽象。因此, 类是对象的抽象, 对象是类的实例。例如“人”是所有人的一个抽象的总称, 他是一个类, “鲁迅”是具体的一个人, 这就是个对象。再如“班级”是个抽象的类名, “计算机系13级软件1班”是具体的一个班级对象。
类的属性用来表示对象的各种特征, 用数据结构来描述。如长方体有三个基本属性长、宽、高;时间有三个基本属性小时、分、妙;人的基本属性有姓名、年龄、性别、工作单位等。在不同的处理需求下对于同一事物的属性描述是不一样的。
类的操作是对于对象行为的描述, 包括操作的名称和操作实现过程。
3.2 对象
对象是任何被人类研究的实物, 不管是简单的实数还是结构复杂的核潜艇都可以认为是对象。除了具体的事物, 对象还能表示抽象的规则、计划。
3.3 对象的属性和操作
对象的属性用各类数据描述。如一个餐桌的属性包括长、宽、高、材质和颜色, 前三种属性值用实型数据表示, 后两种属性值用字符串表示。对象的操作用于改变或访问对象的属性。如一个餐桌对象有一个求桌面面积的操作, 这个操作需要访问此餐桌的长和宽。对象将其属性值与操作结合在一起形成一个整体, 将这个整体封装在对象中。
3.4 消息和方法
当要求对象执行某种操作时, 必须由外界向对象发送一条消息, 消息包括对象名和方法名, 有时还要加若干参数。类中操作的实现过程叫做方法, 一个方法有方法名、参数、方法体。
3.5 类与类的特殊关系
在现实世界中存在很多类, 有些类之间是毫无关联的, 但有些类之间具有一定的特殊关系, 有两种这样的关系:继承关系和组合关系。
如果现有一个定义好的类是“人”, 还需要再定义一个“男人”类, 可以不用对“男人”类进行重新定义, 而是选择在“人”这个类的基础上增加一个性别属性即可。“人”称为父类或基类, “男人”称为子类或派生类, 这两个类的关系叫做继承, 可以说这两个类是一种“是”的关系, 即男人是人。
如果现有一个“日期”类, 还要定义一个“学生”类, 属性中要体现出生日期, 那也可以不用在“学生”类中重新定义出生日期这一属性, 可以直接用已有的“日期”类来定义生日, 这两个类的关系叫做类的组合, 可以说这两个类是一种“有”的关系, 即每个学生都有生日, 而生日是日期信息。
4 面向对象的显著特征
4.1 封装
封装很好地实现了信息隐藏, 可以达到数据保护的目的, 即对象的属性一般不被外界直接访问, 而是通过对象的方法来访问, 从而保护了对象的属性, 为软件的模块性提供了保证。另外, 类定义将外部接口 (用户可见) 与内部实现 (外界不可见) 分离, 对象的方法其内部实现细节对外界是不可见的, 用户只管调用外部接口完成对象的一系列操作。
4.2 继承
子类继承父类的所有属性和方法, 避免了许多重复性的工作, 在一个现有类的基础上新增一些属性或方法级大地减少了软件设计的工作量。继承是面向对象编程语言区别于面向过程编程语言的最显著的特点。如果子类只有一个父类称为单继承, 子类存在多个父类叫做多重继承。在软件设计工作中, 继承是信息分类与组织的切实可行的方法, 它简化了创建类的过程, 提高了软件的可重用性, 使得软件的可扩充性大大加强。
4.3 多态
多态指相同的方法作用于类型不同的对象上可以得到不一样的结果。每个对象通过满足自身意愿的方式响应同样的消息。例如在听到统一的上课铃声后, 老师们各自进入自己任课的班级, 而不是进入同一个班级, 并且所讲的内容也都不同。多态性使得软件的可重用性和灵活性进一步增强了。
5 结语
面向对象编程思想以其独特的形式将数据以及在数据之上的操作细节封装在类中, 改变了面向过程编程思路的程序结构和整体格局, 由于其继承性可以加快软件开发速度, 并增强软件可重用性, 便于软件扩充功能, 多态性可提高软件设计的灵活性, 故从过去较长时间至今一直以来仍占据着程序设计的主流地位, 也一直是衡量各层次程序员与计算机从业人员业务素质的标准。
参考文献
[1]彭莉芬、陈俊生.浅析面向对象的三大特征[J].福建电脑, 2010 (05) .
[2]谭大海、刘兴勇.面向对象分析与设计[J].科技信息, 2014 (10) .
面向对象 篇8
关键词:UML,测试用例,类测试,面向对象,状态图
1 引言
面向对象软件测试的主要目标与传统软件测试目标相同,既是用最小的工作量发现最多的错误。由于面向对象所独有的多态、继承、封装等新的特点,使面向对象测试的策略和技术与传统测试有所不同,测试的视角扩大到包括复审分析和设计模型,测试焦点从模块转向类。类是构成面向对象程序的基本成分,类的测试无疑成为面向对象测试的重要环节。基于对象状态的测试是根据被测试的类的对象所处的状态以及状态之间的转移来构造测试用例,它侧重于对象的动态行为,这种动态行为依赖于对象状态。测试对象动态行为能检测出对象成员函数之间通过对象状态进行交互式产生的错误。
2 基于对象状态的测试方法的发展
现在面向对象测试中基于对象状态的测试方法一般是采用扁平状态机和状态迁移图。扁平状态机能很好的提示出一些类中的错误,但是随着类的状态属性的增加,对象状态的数目会迅速膨胀,大大增加测试的复杂度。状态转移图用于刻画对象响应各种事件时状态发生转移的情况,容易借助于自动机理论来选择测试时所用的时间序列和预测对象的状态变化结果序列,但是,它难于描述继承的对象动态行为、并发的动态行为以及由数据成员和成员函数构成的对象状态和对象状态转移。基于UML的状态图可以很好的描述对象动态行为、并发的动态行为,可以把状态的复杂度控制在和状态属性相关的线性级别,下面我们主要介绍利用UML状态图如何描述对象动态行为、并发的动态行为,以及如何产生测试用例。
3 UML状态图
UML状态图(State Diagram)是UML中对系统的动态行为进行建模的表示方法,它包括对反应型对象的行为建模。它展现了对象生命周期内可能处于的状态以及在这些状态间转换的激发条件。UML状态图中引起状态迁移的原因通常有两种,一种是在状态图中相应的迁移上未指明事件,这表示当位于迁移箭头源头的状态中的内部动作全部执行完后,该状态迁移被自动触发;另一种是,当出现某一事件时会引起状态的迁移,在状态图中把这种一起状态迁移的事件标在改前一的箭头上,如图1。
状态迁移的形式化语法为:
event_signsture[guard_condition]/action_expression^send_clause
其中事件特征event_signsture是由事件名后括号括起来的参数表组成,它指出触发迁移的事件以及与该事件相连接的附加数据。guard_condition警戒条件是一个布尔表达式,如果状态迁移中既有事件又有警戒条件,则表示仅当这个事件发生并且警戒条件为真时,触发状态迁移。动作表达式action_expression是一个触发状态迁移时可执行的过程表达式,表达式中可引用该状态所拥有的对象中的属性、操作或事件特征中的参数。发送子句send_clause是动作的一种特殊情况,用来说明在两个状态的迁移期间发送的消息。
UML状态图的优点在于它支持嵌套和并发。UML状态图中包含基本状态(basic state)和复合状态(composite state),复合状态分为或状态(or-state)和与状态(and-state)。或状态的子状态之间是相互排斥的或关系,表示在任一时刻这些子状态中只有一个子状态为真;与状态的子状态之间是并发的非相互排斥关系,与状态表示一个状态可以有多个并发的子状态,并发子状态之间用虚线分隔,用虚线分隔的每个区域表示一个并发的子状态。把状态属性看成并发的子状态,从而可以把状态图的复杂度控制在线性级别上。并发状态图中一个事件可能引起多个子状态的状态迁移。如图2中的CVM就是一个或状态,它的子状态OFF和ON之间是相互排斥的关系,ON状态就是一个与状态,当处于ON状态时,就意味着同时处于COFFEE和MONEY两个子状态。
由于UML状态图支持嵌套和并发,这就使得它比以往的状态转移图能更好的描述继承的对象动态行为、并发的动态行为以及由数据成员和成员函数构成的对象状态和对象状态转移。UML状态图中可以包含复合状态这就使得它可以把状态的复杂度控制在和状态属性相关的线性级别。下面我们讨论如何从UML状态图构造一棵复合状态测试树。
4 构造复合状态测试树
与以往的测试树不同的是复合状态测试树的每个节点代表对象的复合状态既对象的各个属性的集合,边表示状态间的迁移,根节点代表对象的初始属性集合。
构造一个队列queue来存放复合状态测试树的各个节点。
1)把UML状态图的起点读入队列queue。
2)以UML状态图的起点定义根节点Test Tree root,同时把节点标识tree Node置为对象的初始状态,nodelevel置为0,t和child Tree置为NULL,把root放入队列中。
3)取队列头部的节点设为head,搜索从head节点所对应的状态(head.tree Node)发出的状态前移以及前移置的目标状态,分别填充head.t和head.child Tree,即把迁移至的状态作为head的子节点;同时置好各个子节点的属性值,node Level=head.node Level+1,从root节点开始层次遍历测试树(从第0层至head.node Level层),如果在head的子节点中存在某个节点n,其所对应的状态已经在第0层至head.node Level层中出现过,则该节点n不再扩展,即为叶子节点。把其他没有出现过的子节点加入到队列的尾部。
4)head指向队列中的下一个节点,重复第二步,直至队列为空。
在3)中,如果某个迁移对应的目标状态已经在测试树中出现过,就不再考虑这个状态,不加入到队列尾部。这样有效地避免了重复构造节点,同时又不降低测试的覆盖率。通过上述步骤就可以构造出UML状态图对应的测试树。
复合状态树构造算法能很好的支持多个并发的子状态的情况,只是节点表示为并发子状态的合集;如果某个事件触发其他事件从而引起一系列的状态迁移时,只要把最终的状态作为节点加入到测试树中。比以往的插入桩模块更容易实现。
通过测试树可以很容易的构造出测试用例。从根节点开始沿着各个分支往下知道叶子节点,每条这样从根节点开始到某个叶子节点结束的路径上的事件按顺序组合在一起,就成为基于对象状态测试的一个测试用例。如果增加对象属性可以很容易的在复合状态测试树中增加,增加属性后可以把状态的复杂度控制在和状态属性相关的线性级别,测试时不仅可以单独的对对象的每一个属性和所有属行进行测试,也可以对对象的所有属性任意选择组合进行测试。大大增加了测试的灵活性。
5 结束语
UML的状态图支持潜逃和并发,把状态的复杂度控制在和状态属性相关的线性级别;其次UML状态参数图是在面向对象软件开发的生命周期中的早期设计阶段确定的,是对对象状态的完整的描述,并不依赖于源代码,既保证了状态描述的完整性,又可以在开发早期进行测试,尽早发现与状态相关的错误,避免将错误带入到后面的开发阶段。因此可以用UML的状态图来产生有效的测试用例,这大大提高了测试的灵活性和有效性。
参考文献
[1]张克东,庄燕滨.软件工程与软件测试自动化教程[M].北京:电子工业出版社,2002.
[2]刘金艳,蔺娟茹,尹治本.面向对象软件测试的探讨[C]//2002年全国软件与应用学术会议(NASAC)论文集.北京:机械工业出版社,2002:262-266.
[3]杨小平.面向对象软件测试探讨[J].计算机工程与应用,2000,36(1):44-46.
[4]姬莹,罗钧昊,钟联炯.面向对象软件测试主要问题的探讨[J].西安工业学院学报,2001(1).
[5]Fewster M,Graham D.软件测试自动化技术与实例详解[M].舒智勇,译.北京:电子工业出版社,2000.
[6]叶仁召,郑玉墙,鲁汉榕.面向对象软件测试及度量的研究[J].计算机工程与设计.2001,22(4):21-24.
面向对象分析方法的综述 篇9
传统的软件开发方法, 如面向过程方法和面向数据方法, 都只是针对具体问题的功能, 不允许用户需求在开发过程中有所改变。显然, 由此开发的软件系统在可靠性、可维护性和可重用性上就会存在很大的不足。为了克服传统方法的缺点, 人们在实践中创造了接近人们认识过程的面向对象的软件开发方法。面向对象方法包括面向对象分析、面向对象设计和面向对象实现。尽管面向对象方法主要用于应用系统的设计, 但面向对象分析作为一种独立的需求分析方法以及其它分析方法的补充, 目前正逐渐得到发展。
面向对象分析 (OOA:Object Oriented Analysis) 是抽取和整理用户需求并建立问题解精确模型的过程, 其分析的关键是识别出问题域内的对象, 并分析它们相互之间的关系, 最终建立问题域的简洁、精确、可理解的正确模型, 包括对象模型, 动态模型和功能模型[1], 从而为面向对象设计 (OOD) 和面向对象程序设计 (OOP) 提供指导。
近年来, 随着面向对象技术在程序设计语言、软件开发方法学、用户界面、应用集成平台、面向对象数据库、分布式系统、网络管理结构、人工智能领城以及并发工程、综合集成工程的等各领域的发展应用, 也推动了众多OOA方法的出现, 其中得到广泛认同的有Booch方法 (OOD) , Coad/Yourdon (OOA&D) , OMT, 和Jacobson (OOSE) 等方法。
现根据王晓旭划分的OOA分析方法的原则[2]和额尔敦陶克素研究的评估方法[3], 着力对影响比较大、实际中使用比较多的OOA方法进行总结、比较。
2 根据年代划分主要的OOA方法[4,5,6,7,8,9,10,11,12,13,14]
2.1 第一代:80年代
2.1.1 OOD/Booch方法
该方法是Grady Booch从1983年开始研究, 1991年后走向成熟的一种方法。Booch认为面向对象的开发是一个部分生命期的方法, 只涉及面向对象的设计和实现 (OOD和00I) , 而不涉及面向对象分析 (OOA) 。他认为应将面向对象的设计与实现和其他的需求分析方法 (如SA方法, Jackson方法等) 相结合。
Booeh方法的最大特色是将几类不同的图表有机地结合起来, 以反映系统的各个方面是如何相互联系而又相互作用的。Booch方法可分为逻辑设计和物理设计, 其中逻辑设计包含类图文件和对象图文件, 物理设计包含模块图文件和进程图文件, 用以描述软件系统结构。首先, 从逻辑设计转向物理实现的开发过程中, 有种类图表和对象图表描述逻辑设计构成中最关键的抽象及含义, 组件图表和过程图表从物理实现来描述具体的硬软件结构。
Booch方法也可划分为静态模型和动态模型。其中静态模型表示系统的构成和结构;动态模型表示系统执行的行为。动态模型包含时序图和状态转换图。
具有的符号体系:
(1) 对象图 (对象结构-静态视图) :描述实例和对象间传递消息。 (2) 类图 (类结构-静态视图) :描述类与类之间的关系。 (3) 模块图 (模块体系结构) :描述构件。 (4) 进程图 (进程体系结构) :描述进程分配处理器的情况。 (5) 状态转移图 (类结构-动态视图) :描述一个类的状态变化。 (6) 时序图 (对象结构-动态视图) :描述对象图中不同对象之间的动态交互关系。
Booch方法的实施过程如下:
(1) 在一定抽象层确定类。在问题域中, 找出关键的对象和类。 (2) 确定类和对象的含义。从外部研究类, 研究对象之间的协议。 (3) 定义类与对象的关系。 (4) 实现系统中的类与对象。 (5) 说明类的界面与实现。
2.2 第二代:80年代后期-90年代初
2.2.1 OOSA/Shlaer-Mellor方法
该方法是由Shlaer和 Mellor于1988年提出, 主要是从信息模型的经验中得来的。00sA A是以语义数据模型为基础, 因此, 与数据语义模型相似, 继承了语义数据模型详尽的关系定义和属性定义, 但对方法 (操作) 的描述不明确。类是可支持的, 但是缺乏对继承的支持, 仅仅是支持对象属性的继承, 而不支持服务 (操作) 继承, 也不明确支持软件重用。OOSA只是隐含类、继承和封装这3个基本原则。
OOSA 以语义数据模型为基础, 从对象的结构、操作和生命周期角度建立信息模型、过程模型和状态模型, 并在这3种模型的建模活动中得到一系列比较清晰的图表。
实现的步骤:
(1) 定义信息模型:由对象、属性、关系和多个对象结构所组成。 (2) 定义对象的生命周期:分析各个对象的生命周期, 并将生命周期规范化为状态、事件、事务规划和行为的集合。 (3) 定义关系动态:为对象之间的动态关系建立状态模型。 (4) 定义系统动态:该步骤产生系统级的控制模型, 对象-通讯模型用于异步控制, 对象-存取模型用于同步控制。 (5) 定义处理模型:对于每个行为, 建立一个行为-数据流图。行为-数据流图描述对于行为的一切处理, 同时也描述处理中的数据流和数据存储。 (6) 定义范围和子系统:对于一个大的系统, 将其中的主要事件从概念上区分它们的范围并将大系统划分为若干个子系统是非常必要的。
OOSA缺乏对继承的支持, 适用于分析阶段和实时系统;OOSA实际上只是一种分析方法, 因此, 主要用于开发实时系统。
2.2.2 RDD/Wirfs-Brock
该方法是Wirfs-Brock在1990年提出的。其核心在于引入了拟人化的思想, 把对象的行为处理成该对象应负的责任、把对象间的关系处理为人类相互之间的合作形式, 发生相互关系的对象在系统中分别扮演客户与服务者的角色。客户对象以合约的形式向服务者对象提出服务请求, 服务者对象有责任提供客户所要求的服务, 而合约详细地规定了所需服务的操作细节。
RDD 方法先是定义系统的类和对象, 然后在确定系统的责任后将其划分给类, 最后确定对象类之间的合作来完成类的责任。设计过程再按照类的层次、子系统和协议进一步完善。分为探索阶段和精化阶段:
(1) 探索阶段:确定类、每个类的责任以及类间的合作。 (2) 精化阶段:精化类继承层次、确定子系统、确定协议。
RDD按照类层次图、合作图、类规范、子系统规范、合同规范等设计规范来完成实现。
2.2.3 OOAD/Coad-Yourdon方法
由Peter Coad和Edward Yourdon在1991年提出的, 是一种逐步进阶的面向对象建模方法, 适用于小型系统的开发。Coad-Yourdon方法严格区分了面向对象分析和面向对象设计。该方法利用五个层次和活动定义和记录系统行为, 输入和输出。这五个层次的活动包括:发现类及对象、识别结构、定义主题、定义属性和定义服务。
面向对象分析 (主要用于完成系统分析) 。
(1) 定义主题:发现并标识对象与类:进行类及对象的发现及描述。 (2) 标识服务:目的在于定义对象的行为之间的消息链接。 (3) 标识结构:包括上述的一般/特殊结构和局/部分结构。 (4) 标识属性:对于每个对象, 都需要找出在目标系统中对象所需要的属性, 而后将属性安排到适当的位置, 找出实例链接, 最后进行检查。
面向对象设计 (主要负责系统设计) 。
(1) 设计数据管理子系统:核心是数据存储, 常用的存储技术有文件管理、关系数据库管理和面向对象数据库管理。 (2) 设计任务管理子系统:主要是对系统各种任务进行选择和调整的过程。 (3) 构建问题域子系统:对分析的问题域模型进行需求调整、类的重用、增加一般化类建立协议等。 (4) 设计人机交互子系统:包括用户界面风格, 命令结构层次关系等内容的设计。
这种方法, 概念简单, 易于掌握。但是对每个对象的功能和行为的描述不很全面, 对象模型的语义表达能力不是太强。
2.2.4 OMT/Rumbaugh方法
OMT (Object Modeling Technique) 方法提出于1987年, 1991年Jim Rumbaugh正式把OMT应用于面向对象的分析和设计, 这种方法是在实体关系模型上扩展类、继承和行为而得到的。OMT方法的中心思想就在于从三个不同的角度和观点对所要考虑的系统进行建模, 即建立对象模型、动态模型和功能模型。
(1) 对象模型:描述系统的静态结构, 该模型主要关心系统中对象的结构、属性和操作。
(2) 动态模型:描述系统的控制结构, 表示了瞬时的行为化的系统控制性质, 它从对象的时间和状态角度出发, 表现对象的相互行为。
(3) 功能模型:描述了系统的所有功能操作。在该模型中说明对象模型操作的含义、动态模型中动作的意义及对象模型中约束的意义。
OMT方法全面覆盖了软件开发的整个过程, 包括分析、设计和实现几个步骤:
(1) 分析:基于问题和用户需求的描述, 建立现实世界的模型。
分析阶段的产生:问题描述、对象模型=对象图+数据词典、动态模型=状态图+全局事件流图、功能模型=数据流图+约束。
(2) 系统设计:结合问题域的知识和目标系统的体系结构将目标系统分解为子系统。
(3) 对象设计:基于分析模型和求解域中的体系结构等添加的实现细节, 完成系统设计。主要产物包括:细化的对象模型、细化的动态模型、细化的功能模型。
(4) 实现:将设计转换为特定的编程语言或硬件, 同时保持可追踪性、灵活性和可扩展性。
OMT方法通过构造三个模型较全面地描述了系统的需求, 但在功能模型中使用数据流图与其它两个模型有些脱节。
2.2.5 Bailin
Bailin认为从面向过程的分析到面向对象的设计开发需要对数据流图进行重大修改, 因此, 提出了一个面向对象的需求定义方法:使用了一种专门的语言将实体数据流图 (EDFD) 和实体关系图 (ERD) 组合到一起。该方法没有明显的面向对象的术语 (如, 类、对象、属相等) , 但它遵循OO的基本原则:实体关系图中既包含了对象的类和继承的概念, 也包含了OO中封装的既念。
实现过程:
(1) 定义实体:画出数据流程图, 给出出现在处理过程中的实体的名称。
(2) 区别激活的与惰态的实体:区别对系统需求描述重要的或非重要的实体, 构造一个实体关系图 (ERD) 。
(3) 建立激活实体间的数据流:构造一个最高一级的实体数据流图 (EDFD) 。每个激活的实体作为一个处理节点, 每个惰态实体为一个数据流或数据存储。
(4) 分解实体/功能:在各个分解步骤中, 应考虑各个新的子实体是否被包含在新的子功能中。
(5) 修改实体状态:确定新的实体的状态, 并重新组织EDFD。
2.3 第三代:90年代中期
2.3.1 VMT (Visual Modeling Technique)
该方法结合了OMT、OOSE、RDD等方法的优点, 并且结合了可视化编程和原型技术。VMT选择OMT作为整个方法的框架, 并且采用OMT的表示方法, 但抛弃了OMT中的采用数据流图描述的功能模型, 代之以RDD方法中的CRC (Class Responsibility Collaboration) 卡片, 用它来描述对象的操作和对象间的关系。VMT 还引入了OOSE中的使用事例概念, 用来描述用户对系统的需求, 从而获得更准确的用户需求模型。
开发过程:分为分析、设计和实现3个阶段。
(1) 分析阶段:主要任务是建立分析模型, 即, 将用户需求结构化并形式化, 这个阶段的产品描述未来的系统应该做什么, 而不描述怎么去做。
(2) 设计阶段:目标是制定解决问题的策略, 为实现解决方案打下整体基础, 并寻求把设计要素转换成解决方案的切实可行的方法, 该阶段包括系统设计、对象设计和永久性对象设计。
(3) 实现阶段:用某一种环境来实现系统, 完成从对象设计模型到解决方案的影射过程。
IBM公司在提出VMT 的同时, 推出了支持VMT的可视化编程工具VisualAge , 用它可以很容易地实现设计阶段建立的模型。
3 7种面向对象分析方法的比较
3.1 根据抽象原则
每种OOA方法都使用抽象原则, 以便从系统需求获取重要部分而将次要部分忽略掉。然而, 这种原则都有不同的侧重点:
数据抽象侧重于数据方面;
过程抽象侧重于过程方面;
事件抽象侧重于系统的事件方面。
1种OOA方法所采用的抽象原则可以有1个, 2个或3个侧重点。表1列出了7种方法中抽象原则的侧重点。
3.2 比较7种方法的覆盖边界
目前, OOA和OOD方法的边界划分上尚存在着争议。如, 有人认为面向对象软件开发过程可以分为面向对象分析、面向对象设计和面向对象程序设计三个阶段;有人认为分析和设计可以交叉进行不必做严格区分;还有人沿用传统方法进行分析和设计, 用面向对象程序设计语言来实现系统。
现就上述方法的实现过程, 将其边界问题进行尝试性的划分。
4 结语
除上述方法外, 还有Beard、Firesmith、Martin-Odell等面向对象分析的方法, 但OMT方法、Coad-Yourdon方法和Booch方法被列为OO软件开发的三个重要流派。对OOA方法的分类也遵循很多原则, 如, 费翔林[15]就按照以非形式化规格说明为基础、以结构化方法为基础和以语义数据模型为基础综述了OOA方法。
总之, 在前人的基础上对面向对象分析方法进行了简单的分类、比较研究, 以期为选择面向对象方法以及创建新OOA方法提供一些依据。
摘要:将7种主要的OOA方法按照提出的年代进行划分, 并在简单介绍的基础上, 依据抽象原则和边界的划分 (面向对象分析和面向对象设计的划分) , 并对7种方法进行了比较研究, 以期为选择面向对象方法以及创建新的OOA方法提供一些依据。
面向对象方法学概述 篇10
面向对象方法学的出发点和基本原则, 是尽可能模拟人类的思维方式, 使开发软件的方法和过程尽可能接近人类认识世界解决问题的方法与过程, 也就是使描述问题的问题空间与实现解法的解空间在结构上尽可能一致。
2 面向对象方法学的要点
概括地说, 面向对象方法学具有以下4个要点:
⑴认为客观世界是由各种对象组成的, 任何事物都是对象, 复杂的对象可以由比较简单的对象以某种方式组合而成。按照这种观点, 可以认为整个世界就是一个最复杂的对象。由此可见, 面向对象方法用对象分解取代传统方法的功能分解。
⑵把所有对象都划分成各种对象类, 每个对象类都定义了一组数据和一组方法。数据用于表示对象的静态属性, 是对象的状态信息。类中定义的方法, 是允许施加于该类对象上的操作, 是该类所有对象共享的, 并不需要为每个对象都复制操作代码。
⑶按照子类与父类的关系, 把若干个对象类组成一个层次结构的系统。在这种层次结构中, 下层的派生类自动具有和上层的基类相同的特性, 这种现象称为继承。但是, 低层的特性将屏蔽高层的同名特性。
⑷对象彼此之间仅能通过传递消息互相联系。对象与传统数据有本质区别, 它不是被动等待外界对它施加操作, 它是进行处理的猪蹄, 必须发消息请求它执行某个操作, 不能从外界直接对它的私有数据进行操作。
综上所述, 面向对象方法学可以用下列方程概括:
OO=objects+classes+inheritance+communication with messages
面向对象就是既使用对象又使用类和继承等机制, 并且对象之间仅能通过传递消息实现彼此通信。
3 面向对象的概念
3.1 对象
在应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象, 它既可以是具体的物理实体的抽象, 也可以是人为的概念。例如, 一名职工、一家公司、一个窗口、一座图书馆、贷款、借款等, 都可以作为一个对象。对象是对问题域中某个实体的抽象, 设立某个对象就放映了软件系统具有保存有关它的信息并且与它进行交互的能力。
由于客观世界中的实体通常都既具有静态属性, 由于具有动态行为, 因此, 面向对象方法学中的对象是由描述该对象属性的数据以及可以对这些数据施加的所有操作封装在一起构成的统一体。对象可以作的操作表示它的动态行为, 在面向对象分析和面向对象设计中, 通常把对象的操作称为服务或方法。
3.2 类
现实世界中存在的客观事物有些是彼此相似的, 例如每个人的职业、性格、爱好等各有不同, 但是他们的基本特征是相似的, 都是黄皮肤、黑头发、黑眼睛, 于是人们把他们统称为“中国人”。人们习惯于把有相似特征的事物归为一类, 分类是人类认识客观世界的基本方法。
例如, 一个面向对象的图形程序在屏幕左下角显示一个半径为3厘米的红色的圆, 在屏幕中部显示一个半径为4厘米的绿色的圆, 在屏幕右上角显示一个半径为1厘米的黄色的圆。这三个圆心的位置、半径大小和颜色均不相同的圆, 是3个不同的对象。但是, 它们都有相同的数据和操作。因此, 它们是同一类事物, 可以用“Circle类”来定义。
3.3 实例
实例就是由某个特定的类所描述的一个具体的对象。类是对具有相同属性和行为的一组相似的对象的抽象, 类在现实世界中并不能真正存在。在地球上没有抽象的中国人, 只有一个个具体的中国人, 同样, 也没有抽象的圆, 只有一个个具体的圆。
实际上类是建立对象时使用的样板, 按照这个样板所建立的一个个具体的对象, 就是类的实际例子, 称为实例。
3.4 消息
消息就是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。通常, 一个消息由下述3个部分组成。
接收消息的对象;
详细选择符;
零个或多个变元。
例如, My Circle是一个半径为4厘米, 圆心位于 (100, 200) 的Circle类的对象, 当要求它以绿颜色在屏幕上显示自己时, 在c++语言中应向它发下列消息:
My Circle.Show (GREEN) ;
当My Circle接收到这个消息后, 将执行在Circle类中所定义的Show操作。
3.5 属性
属性就是类中所定义的数据, 它是对客观世界实体具有的性质的抽象。类的每个实例都有自己特有的属性值。在c++语言中把属性称为数据成员。例如, Circle类中定义的代表圆心坐标、半径、颜色等的数据成员, 就是圆的属性。
3.6 封装
从字面理解, 所谓封装就是把某个事物包起来, 使外界不知道该事物的具体内容。
在面向对象的程序中, 把数据和实现操作的代码集中起来放在对象内部。一个对象好像是一个不透明的黑盒子, 表示对象状态的数据和实现操作的代码与局部数据, 都被封装在黑盒子里面, 从外面是看不见的, 更不能从外面直接访问或修改这些数据和代码。
使用一个对象的时候, 只需知道它向外界提供的接口形式, 无需知道它的数据结构细节和实现操作的算法。
3.7 继承
广义地说, 继承是指能直接获得已有的性质和特征, 不必重复定义它们。在面向对象的软件技术中, 继承是子类自动共享基类中定义的数据和方法的机制。
面向对象软件技术的许多强有力的功能和突出优点, 都来源于把类组成一个层次结构的系统:一个类的上层可以有父类, 下层可以有子类。这种层次结构系统的一个重要性质是继承性, 一个类直接继承其父类的全部描述。
当一个类只允许有一个父类时, 当类等级为树形结构时, 类的继承是单继承;当允许一个类有多个父类时, 类的继承是多重继承。多重继承的类可以组合多个父类的性质构成所需要的性质, 因此功能更强、使用更方便。有了继承性以后, 还可以用把已有的一般性的解加以具体化的办法, 来达到软件重用的目的:首先, 使用抽象的类开发出一般性问题的解, 然后在派生类中增加少量代码使一般性的解具体化, 从而开发出符合特定应用需要的具体解。
3.8 多态性
多态性指有许多形态, 在面向对象的软件技术中, 多态性指子类对象可以像父类对象那样使用, 同样的消息既可以发送给父类对象也可以发送给子类对象。在类等级的不同层次中可以共享一个行为的名字。不同层次中的每个类却各自按自己的需要来实现这个行为。当对象接收到发送给它的消息时, 根据该对象所属于的类动态选用在该类中定义的实现算法。
在C++语言中, 多态性是通过虚函数来实现的。在类等级不同层次中可以说明名字、参数特征和返回值类型都相同的虚拟成员函数, 不同层次的类中的虚函数实现算法各不相同。虚函数机制使程序员能在一个类等级中使用相同函数的多个不同版本, 在运行时刻才根据接收消息的对象所属于的类, 决定到底执行哪个特定的版本, 这称为动态联编。
多态性机制不仅增加了面向对象软件系统的灵活性, 进一步减少了信息冗余, 而且显著提高了软件的可重用性和可扩充性。当扩充系统功能增加新的实体类型时, 只需派生出与新实体类相应的新的子类, 并在新派生出的子类中定义符合该类需要的虚函数, 完全无需修改原有的程序代码, 不需要重新编译原有的程序。
3.9 重载
有两种重载:函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字;运算符重载是指同一个运算符可以施加于不同类型的操作数上面。当参数特征不同或被操作数类型不同时, 实现函数算法或运算符的语义是不相同的。在C++语言中函数重载是通过静态联编实现的, 在编译时根据函数变元的个数和类型, 决定到底使用函数的哪个实现代码;对于重载的运算符, 同样是在编译时根据被操作数的类型, 决定使用该算符的哪种语义。
4 小结
面向对象 篇11
关键词:中断;Linux;面向对象思想
中图分类号:TP316文献标识码:A文章编号:1009-3044(2007)12-21356-02
Research of Interrupt Design Based On Object-Oriented Thinking In Linux Kernel
FANG Hong,LV Tai-zhi
(Department of Information Engineering,JiangSu Marine Institute,Nanjing 211170,China)
Abstract:This paper introduced the problem of interrupt design and the basic solution under Linux.By applying object-oriented thinking and design model,Top Half and Bottom Half of interrupt mechanism were analyzed on structure and action, Finally,the paper pointed out that the highly performable and flexible framework of interrupt handling was realized in Linux kernel.
Key words:interrupt;Linux;object-oriented thinking
1 引言
中断是计算机系统中不可缺少的工作机制,对系统性能有重要影响。但其与硬件密切相关,作为支持多种硬件平台的Linux操作系统,在中断机制设计方面必须权衡性能和可移植、可扩展性等方面的矛盾。运用面向对象的技术构建高质量的软件体系结构,用高效的c语言来编程实现,将二者的优点有机结合起来,已成为Linux内核设计中的发展趋势。在Linux内核中,出于性能的考虑,将中断的处理分成上半部分[1](Top Half)和下半部分(Bottom Half),因此內核的中断处理机制也被分成两部分,本文基于Linux内核2.6.20,运用面向对象的方法及相关设计模式,对这两部分进行了深入分析。
2 Top Half分析
Top Half已被设计成一个独立的中断处理层。设备驱动通过使用该层提供的接口,使中断处理部分完全独立于硬件,从而大大提高了代码的可移植性;中断硬件驱动则可以实现和使用该层定义的中断硬件接口和中断处理回调接口,对中断处理层提供支持,同时也可以利用该层提供的标准中断处理流程,简化设计和实现。
2.1结构分析
通过分析中断相关内核源代码[2],抽象出Top Half的类图(图1)。类的提取主要来源于相关头文件中的struct结构,也有一些是直接从代码中抽象而来,并没有相应的struct。为了取得一定的对应关系,类的命名尽量采用了与之对应的struct结构的命名。对于包含函数指针的struct,可以有两种观点:第一种将其视为定义了抽象方法的抽象类,第二种将其视为包含了预定义接口的类。本文采用第二种观点,因为它更能体现面向对象设计的基本原则(编程中使用接口,而不是接口实现;优先使用组合而不是继承)。manager主要定义实现上层接口,设备驱动可以进行请求、禁能、释放中断等操作,无需知道中断硬件的细节,从而使设备驱动中断处理相关的代码无需改变就可以方便地移植到不同平台。manager内含一个包含irq_des的线性数组,以此实现全局管理。irq_des与中断号一一对应,是将底层硬件隔离及实现中断处理流程的关键。它包含的irq_chip通过定义一组接口方法,将不同的中断硬件行为统一进行了封装。一方面底层中断硬件驱动只要根据自身功能部分或全部实现这组方法,就可以向上提供满足需要的中断处理功能,方便了底层的设计;另一方面负责中断处理流程的handle_irq,通过使用chip的方法与硬件交互,从而将中断流程处理与硬件细节处理分离。由于不同类型的中断,其中断处理流程不尽相同,不同于以前的在一个函数中处理各种类型中断的方法,內核目前将其细分成6种类型(edge level simple percpu bad fasteoi),并分别提供了标准的实现,这样可以针对特定类型,优化代码,提高处理性能。虽然有多种类型的处理方法可供使用,但内核仍抽象出单一的中断处理接口handle_irq供底层调用,在这里,使用了策略(Strategy Pattern)设计模式[3],6种类型的中断处理方法(具体策略)是handle_irq(策略接口)的不同实现,而irq_des则提供了策略赖以存在的上下文(Context)。策略模式使中断处理更具灵活性、可扩展性。例如可以方便地增加新的中断处理类型以及根据需要重新实现特定类型的中断处理方法,却对使用者没有影响。chip和handle_irq相结合一方面屏蔽了底层中断硬件的变化对上层的影响,另一方面给中断硬件驱动的设计实现带来了便利;而性能却因为优化了不同中断类型的处理代码而得到提高。
图1 Top Half类图
为了有效利用紧缺的中断资源,内核支持中断共享,这主要通过irqaction来实现。irqaction的设计使用了职责链(Chain of Responsibility)模式[3],该模式的设计意图在于使多个对象都有机会处理请求,通过将这些对象连成一条链,并沿着这条链传递该请求来实现,它降低了请求的发送者和接收者之间的耦合。由于中断共享时,有多个中断处理函数,但只有具体的中断处理程序知道是否要处理中断,且要求支持中断处理函数的动态增减,所以非常适合运用职责链模式。action包含一个handler,它定义了处理中断请求的接口,具体的中断处理则由使用中断的设备驱动程序以中断处理函数的方式来实现。在handle_irq的具体实现中,均会调用handle_IRQ_event方法,该方法遍历irqaction链,并依次调用handler接口方法,最终实现中断的处理。职责链模式虽然有诸多优点,但也有缺点:主要是处理效率偏低,因为处理一个请求可能要遍历到最后才能完成,这就要求共享同一中断的设备不能太多,同时要求中断处理程序尽快判断出中断是否需要处理,若不需要应及时返回。
2.2行为分析
中断的实际处理过程是一个软硬件相结合的、异步和并发的复杂过程,虽然内核中断处理层屏蔽了中断处理的细节,但使用中断的设备驱动编写者仍需要理解中断处理的主要过程,特别是中断处理函数被调用的上下文环境,作为一个较高层次的抽象,下面描述了一个中断被处理的基本过程。首先设备驱动使用request_irq申请登记中断处理函数,相应设备触发了一个中断,经过底层软硬件的一系列处理,最终会调用irq_desc的handle_irq方法,该方法又会调用handle_IRQ_event,它遍历irqaction链,调用中断处理函数,中断处理函数在进行必要的处理后,一般会在标识出要延迟处理的工作后返回,最后在判断出没有硬软中断嵌套及有软中断需要处理的情况下,调do_softirq进行下半部分的处理。
3 Bottom Half分析
在内核中,Bottom Half的实现机制主要有软中断(softirq)和任务片(tasklet)[4],tasklet是基于softirq的,二者的主要区别是同一软中断处理函数可以同时运行在多个CPU上,而同一任务片同时只能运行在一个CPU上,不同的任务片可以同时运行在不同的CPU上。因此需要软中断实现者自己处理因多CPU 存取共享数据产生的同步问题,在获得高性能的同时,增大了编程难度。而任务片则在性能和编程难度间找到了一个合理的平衡点,被大多数设备驱动所采用。
3.1结构分析
通过分析与tasklet和softirq相关的源代码,可以抽象出两者的类图(图2),smanager负责提供初始化、请求、触发、处理软中断的方法,其中do_softirq负责实际处理软中断,该方法在软中断层有标准实现,但在某些平台上(如i386平台)则由体系相关部分实现以支持软中断栈,但系统运行时只能使用一种实现,为此内核使用条件编译,在编译时确定使用哪一种实现,这实现了一种编译时的“多态”。smanager内含一个包含32个softirq_action的线性数组,以此实现对软中断的全局管理,数组下标隐含了软中断的优先级,下标越小,优先级越高。softirq_action实际上是软中断相量,设计的相当简单,它包含一个action接口由具体的软中断来实现。内核已实现并装入了几种软中断,这些软中断一经装入就不会被卸下,所以内核目前没有提供释放软中断的方法。一般推荐由内核开发者来实现软中断,而不是设备驱动的编写者。
tmanager通过tasklet_action实现action接口方法成为一种软中断,tmanager负责对外提供创建、调度、禁能tasklet的方法,它内含几个与CPU个数相等的数组,每个数组包含一个tasklet相量链(与CPU一一對应),在这里,再次采用了职责链设计模式,因为与中断共享类似,多个tasklet实际上共用了一个软中断触发标志位,且要求支持tasklet的动态增减,但tasklet的动态性更强,仅执行一次就被从链表中删除。在内核中实现了两类不同优先级的tasklet,其结构和行为基本一致,本文以普通优先级的tasklet为主进行论述。
3.2行为分析
软中断的运行可分为触发和执行两步。触发机制类似于内核中的信号机制,raise_softirq方法设置触发标志位(每个CPU均有一个整型标志字,每位依次与软中断号相对应,置1表示该软中断需要处理);软中断的实际执行由do_softirq方法完成,该方法可以在多CPU上同时执行,首先判断当前CPU是否已运行软中断,若是则退出,以避免重入可能导致的死锁;然后依次遍历软中断数组,对于标志位置1的软中断则调用其action方法,进行实际的软中断处理。
图2 softirq和tasklet类图
tasklet的运行也分为提交和执行两步,提交由tasklet_schedule完成,它会把tasklet插入到与当前CPU所对应的tasklet链中,在插入前会判断tasklet是否已被调度到其它CPU上(通过成员state判断),若是则返回,以此保证某个tasklet在多个tasklet链表中的唯一性,然后调raise_softirq触发软中断;执行由tasklet_action(被do_softirq调用)完成,它遍历与当前CPU对应的tasklet链表,调用func接口方法实现处理,并将处理过的tasklet从队列中删除。在tasklet处于运行状态时,该tasklet可以再次被调度到tasklet链表中,但不能被运行,直到前一tasklet运行完毕。提交和执行机制共同保证了同一tasklet在多CPU上的串行执行以及不同tasklet在多CPU上的并行执行。
4 结论
通过充分运用面向对象的基本设计原则(封装变化;编程中使用接口,而不是接口实现;优先使用组合而不是继承)以及设计模式,Top Half 和Bottom Half被设计实现成了一个中断处理的框架结构,融高效与灵活为一体,本身也可以被抽象提炼出一种设计模式。其设计思想和方法值得学习和借鉴。
参考文献:
[1]陈莉君.Linux操作系统内核分析[M].北京:人民邮电出版社,2000.102-125.
[2]Linux2.6.20内核源码[EB/OL].http://www.kernel.org.
[3]Erich Gamma.等.著.李英军.等.译.设计模式:可复用面向对象软件的基础[M].北京:机械工业出版社,2000.9:147-218.
[4]毛德操,胡希明.Linux 内核源代码情景分析[M].杭州:浙江大学出版社,2001.222-333.
浅析面向对象的建模方法 篇12
面向对象方法学也称为面向对象的开发方法, 它属于软件工程的范畴。面向对象方法学的出发点和基本原则是尽可能模拟人类习惯的思维方式, 使开发软件的方法与过程接近人类认识世界解决问题的方法与过程。也就是说, 面向对象方法是一种崭新的思维方法, 它是把程序看作是相互协作而又彼此独立的对象的集合。由于对象的独立封装, 模块的可构造性、可扩充性、可重用性也大大加强, 从而面向对象的软件工程能够胜任当今大规模复杂、易变软件系统开发应用的要求。
面向对象的软件工程要求首先对系统建立模型是对现实的简化, 它提供了系统的蓝图。一个好的模型只需抓住影响事物发展的主要矛盾, 而忽略那些次要矛盾。每个系统可以从不同方面用不同的模型来描述。因而每个模型都是在语义上闭合的系统抽象。通过建模可以按照实际情况对系统进行可视化模型详细地说明了系统结构或行为, 指导我们构造系统模板。
二、面向对象建模方法
建模是构造软件系统最基本的步骤, 在软件工程学科中提供了多种多样的建模方法和高效的工具, 其目的是为了在软件开发过程的早期就发现设计中可能隐含的缺陷和错误, 对于今日的大型软件系统, 采用一种合适的建模方法, 建立一个良好的模型是成功的关键。在市场上已有一些公司, 如Rationa1, Cayenne, Platinum等开始提供商品化的建模工具, 即通常所谓的CASE工具, 使得建模过程实现了一定的自动化的标准化, 并逐步走向实用, 而这些工具的后面, 便是具有不同特色的建模方法。
(一) Booch方法
Booch方法是由Grady Booch提出的, 是一种主要面向设计的方法, 它通过二维图形来建立面向对象的分析和设计模型, 强调设计过程的不断反复知道满足要求为止。Booch方法特别注重对系统内对象之间相互行为的描述, 注重可交流性和图示表达。但在方法学上并不注重严格的过程, 既不推荐软件设计人员该做什么, 只是指出了其可做的工作。Booch方法把几类不同的图表有机地结合起来, 以反映系统的各个方面是如何可相互联系而又相互影响的。这些图贯穿于逻辑设计到物理实现的开发过程中, 包括类图、状态图、对象图、交互图、模块图和进程图。
(二) OMT方法
OMT (Object Modeling Technology对象建模技术) 是由James Rumbaugh等人提出的。OMT方法包含了一整套的面向对象的概念和独立于语言的图示符号。它可用于分析问题需求, 设计问题的解法以及用程序设计语言或数据库来实现这个解法。OMT方法用一致的概念和图示贯穿于软件开发的全过程, 这样软件开发人员不必在每一开发阶段便换新的表示方法。
OMT方法从对象模型、动态模型、功能模型3个不同但又相关的角度来进行系统建模。这3个角度各自用不同的观点抓住了系统的实质, 全面地反映了系统的需求。其中, 对象模型表示了静态的、结构化的系统数据性质, 动态模型表示了瞬时的、行为化的系统的控制性质, 功能模型则表示了变化的系统的功能性质。在软件开发的周期中, 这3种模型都在逐渐发展:在分析阶段, 构造出不考虑最终设计的应用域模型;在设计阶段, 求解域的结构被加入到模型中;在实现阶段, 应用域及求解域的结构被编码。
(三) OOSE方法
OOSE (Object_Oriented Software Engineering面向对象软件工程) 是由Ivar Jacobson提出的。它可较好的描述系统与其用户之间的信息交换机制, 即用于向软件系统提出需求后, 软件系统完成这项需求的过程。OOSE方法遵循瀑布式的软件开发过程, 首先是描述与系统交互有关的用户视图, 然后建立分析模型, 最后的构造过程则完成交互设计、实现和测试。OOSE开发过程可在规定的顺序步骤指导下完成, 其间允许少量的阶段反复。
三、UML进行系统软件建模的过程
用UML建模之初要描述总体需求。在这一阶段中主要是建立用例模型和静态模型, 以搭建系统体系结构。用例图是系统的高级视图, 要求按照面向对象的原则, 站在功能划分的角度将系统要实现的行为划分为用例;以用例之间的动态交互及交互时间为依据产生顺序图;接下来就在用例图的基础上抽象出系统的类, 明确各模块之间的关系以适当的粒度画出类图, 其中也包括了与用例图的相互迭代修改在分析完模块的静态交互关系后继而要绘制出构件图。以上这些过程中均不考虑系统的具体实现, 如建立什么样的数据库或采用什么语言编码等, 最好是以使用者的眼光去分析系统功能。为建立完整的系统模型, 还要对模块交互和构件细节做进一步分析, 补充状态图、活动图、协作图和实施图等, 从尽可能多的角度对复杂系统进行描述。在模型确定后就可以借助相应的支撑软件将模型导出为相关代码, 形成编码所需的初步框架。
四、结束语
UML用一种统一的基本表示来组织数据和它专有的处理, 能够无痕地支持OOA、OOD各阶段的工作特征, 使传统软件开发的两条鸿沟消失。UML的出现是面向对象技术发展的重要成果, UML成为可视化建模语言事实上的工业标准, 代表了面向对象方法的软件开发技术的发展方向。
参考文献
[1]马光毅等:面向对象方法研究《华南师范大学学报》。