注:这只是我的面向对象技术的一篇作业,随便贴的,大家不要介意:)
摘 要
面向对象程序设计以及数据抽象在现代程序设计思想中占有很重要的地位,在这篇论文中,我将从程序设计语言的发展和程序设计思想的演化之间的关系,来理解和思考面向对象程序设计技术,并逐步讨论如下课题:程序设计语言的演化,程序设计思想的演化,面向对象程序设计所支持的主要思想和概念,以及最后用一个数组的演化来说明面向对象程序设计的优势。
计算机程序设计的本质就是把现实生活中我们遇到的问题,通过抽象然后利用计算机语言转化到机器能够理解的层次,并最终利用机器来寻求问题的解。在此过程中,涉及到两方面问题:一,如何把我们所面对的问题抽象化?使问题能够很好的被抽象语言描叙。二,如何把已经抽象解决了的问题映射到机器能够理解的语言里面去。从第一方面体现了程序设计思想而第二方面则体现了程序设计语言,有此可见,两者是有密切关系的,其中的连接点就是抽象机制。
1 程序设计语言的概论
程序设计语言的发展是一个不断演化的过程,其根本的推动力就是抽象机制更高的要求,以及对程序设计思想的更好的支持。具体的说,就是把机器能够理解的语言提升到也能够很好的模仿人类思考问题的形式。程序设计语言的演化从最开始的机器语言到汇编语言到各种结构化高级语言,最后到支持面向对象技术的面向对象语言,反映的就是一条抽象机制不断提高的演化道路,机器语言和汇编语言几乎没有抽象,对于机器而言是最合适的描叙,它可以操作到机器里面的位单位,并且任何操作都是针对机器的,这就要求人们在使用机器或者汇编语言编写程序时,必须按照机器的方式去思考问题,因为没有抽象机制,所以程序员很容易陷入复杂的事物之中。随着C,PASCAL,FORTRAN,等结构化高级语言的诞生,使程序员可以离开机器层次,在更抽象的层次上表达意图。尤此诞生的三种重要控制结构,以及一些基本数据类型都能够很好的开始让程序员以接近问题本质的方式去思考和描叙问题。随着程序规模的不段断扩大,在60年代末期出现了软件危机,在当时的程序设计范型中都无法克服错误随着代码的扩大而级数般的扩大,以至到了无法控制的地步,这个时候就出现了一种新的思考程序设计方式和程序设计范型-----面向对象程序设计,由此也诞生了一批支持此技术的程序设计语言,比如EIFFEL,C++,JAVA,这些语言都以新的观点去看待问题,即问题就是由各种不同属性的对象以及对象之间的消息传递构成。面向对象语言由此必须支持新的程序设计技术,例如:数据隐藏,数据抽象,用户定义类型,继承,多态等等。
2 程序设计范型的演化
2.1 过程式程序设计
原始的程序设计范型是:
确定需要哪些过程;
采用能找到的最好的算法。
这里所关注的是处理过程-----执行预期的计算所需要的算法,从程序组织的观点看,函数被用于在许多算法里建立一种次序。算法本身通过函数调用和其他语言功能写出,其典型语言是PASCAL。
2.2 模块程序设计
设计程序的着重点已经从有关过程的设计转移到了对数据的组织,这种转移也反映了程序规模增大的情况。相关的过程与他们所操作的数据组织在一起,通称为一个模块,程序设计范型变成:
确定需要哪些模块;将程序分为一些模块,使数据隐藏于模块之中。
在这样的设计范型中,最重要的概念就是数据隐藏原理。
2.3 基于对象程序设计
允许程序员直接定义类型,这种类型的行为方式与内部类型几乎完全一样,这样的类型常常被称为抽象数据类型,其程序设计范型是:
确定需要哪些类型;
为每个类型提供完整的一组操作。
支持这种范型的典型设计语言就是ADA。
2.4 面向对象程序设计
在基于对象程序设计范型的基础上,加入继承和多态这两个组重要的概念就演变出了现在最流行的程序设计方法---面向对象程序设计,其范型是:
确定需要哪些类;
为每个类提供完整的一组操作;
利用继承去明确地表示共性。
支持此范型的典型语言就是EIFFEL,JAVA,C++等。
3. 面向对象程序设计
面向对象程序设计的最基本的概念/机制是对象,对象可以被定义由属性(数据)和操作这些数据的方法(代码)组成的软件单元。数据不能被对象的使用者直接访问,只允许通过由对象提供的方法或者代码访问数据(也就是说,函数调用它的方法)。
封装 对象既包含数据又包含操作或者改变该数据的方法(代码)。
对象的服务定义了其他的对虾感怎样获得对其方法的访问。每一个对象都将愿意提供给所有对象的公共服务公开化。它也提供仅局限与特定对象的其他的服务(保护和私有的)。我提供服务的思想定义了面向对象范型的第二个原则---信息隐藏。
信息隐藏 包含属性(数据)的对象定义什么服务(函数)可被其他对象访问,实际上,其他对象无法访问或者感知数据(属性)及其这样提供服务(方法/代码)。
对象通过使用消息机制发送遵守服务的原型的消息,能够使用另外一个对象的公共服务 。消息机制就构成了面向对象范型的第三个原则--消息传递。
消息传递 对象只能借助消息传递机制才能同其他对象通信,每个消息必须发送个指定的接受者,并且消息的解释以来于接受者。
在面向对象的范型中,通常在运行时才知道给定消息的特定接受者。这样,在消息和用来完成对行为的轻骑的方法之间存在后期连接。命令式程序范型中的函数调用与代码片段存在的是早期连接。对后期连接的支持定义了面向对象范型的第四个原则---后期连接。
后期连接 它能够在运行时对一个消息决定要执行的特定接受者及其相应的方法。
我们不仅将对象组织为类别,而且也将类别整理为从一般到特殊的层次结构。这将我们引入面向对象的第四个原则---泛化。
无多态的泛化 可以用层次性继承结构来组织类。在该机构中,子类将从位于数结构高层的父类中继承属性,
关系和方法,抽象的父类是指仅用来产生子类的超类。这样抽象类就没有直接实例。
有多态的泛化 可以使用层次继承结构组织类,子类可以继承位于树型结构的高层的父类的树型,关系和方法。然而,子类可以产生它自己的方法来代替其他任何超类的方法。
4 数组的演化
数组是相同类型元素的集合,我将通过数组在C/C++语言上形式的演化来具体说明面向对象程序设计的优点和面向对象程序设计的技术上所支持的概念。
4.1 内置数组数据类型
//声明一个整型数组
int fun[];
虽然C++对数组类型提供了内置支持,但是这种支持仅限于“用来读写单个元素”的机制。C++不支持数组的抽象,也不支持对整个数组的操作。例如:我们无法把一个数组复制到另外一个数组,对两个数组进行比较,或者想知道数组的大小。
Int array0[10],array1[10];
//错误:不能直接把一个数组复制到另外一个数组
array0=array1;int fun[];
如果我们希望把一个数组复制到另外一个,则必须自己写程序:
for(int index=0;index<10;++index)
array0[index]=array1[index];
然而数组没有自我意识,它不知道自己的长度,这样的程序设计反映了数据与对其进行操作的算法的分离,任何函数都可以访问一个数组,数组对于函数来说是不受保护的,而这正是过程话程序设计的特征。
4.2 数组类
下面我将使用C++的类机制来设计一个数组抽象
1) 数组类的实现中有内置的自我意识,首先它知道自己的大小。
2) 数组类支持数组之间的复制,比较等操作。
3) 可以查询数组里面的最大植和最小值,以及需要的数值。
4) 可以排序。
class array{
public:
Bool operator==(const array&) const;
Bool operator!=(const array&)const;
array& operator=(const array&);
int size();
void sort();
int min();
int max();
int find(int value);
private:
//……
}
关键字private和public控制地类成员的访问,一般来说公有成员提供该类的接口—即实现这个类的行为的操作的集合。私有成员提供私有实现代码—即存储信息的数据。这种类的公共借口与私有代码的分离称为信息隐藏。
这样我们就可以对数组进行整体操作,实现了数据和算法的捆绑。
4.3 继承的数组基类
一般来说我们的实现也许就是针对特定用户的,而不具有普遍性,也就是说有的用户也许根本不需要排序这样的功能,但是我们却为其加入了,我们如何才能支持各种用户对于我们的数组类的要求呢?面向对象程序设计方法为我们提供了这样的一种能力,即继承机制和多态机制。
我们可以把普遍和共同的属性通过基类来实现,而各种特殊的要求,我们通过继承和多态来表达需要的更多于基类的行为。
4.4 小结
通过一个数组的演化,我们可以清楚的看到面向对象程序设计的核心思想是:抽象数据类型,继承和多态。我们也可以清晰的感受到面向对象程序设计对于过程式程序设计的好处和优点。
面向对象程序设计是一种70年代为克服软件危机而新起的一种程序设计的思想,其核心就是用类来表示各种概念,在这种思想的影响下,诞生了一批面向对象程序语言,通过各种语言和程序设计范型的演化,我们可以清晰看到面向对象程序设计技术的各种优势,以及这种优势产生的根本原因---克服过程式编程里面数据与算法完全分离的弊端,并在此基础上演化出了多种新的组织程序和表达概念的方法,最后我通过一个数组的演化:内置类型—数组类—数组基类的变化深刻的刻画了过程式程序设计到面向对象程序设计的变化—数据封装,算法和数据分离,描叙问题的方式转变(由算法描叙到类描叙)等等。
参考文献:
《C++程序设计语言》 机械出版社 Stroustrup著
《C++ PRIMER 中文版》 中国电力出版社 Lippman著
《Object-Oriented Software Constructure》机械工业出版社 Bertrand.Meyer著