从封装看计算机高级语言的发展规律计算机科学与技术学院邱勇内容•1.高级语言的发展•2.非结构化程序设计•3.结构化程序设计对实现功能的封装•4.相关数据的封装•5.进一步提高封装度•6.面向对象程序设计中类的封装•7.继承也是封装•8.oop中其它封装形式•9.JAVA,C#新一代语言中的封装•10.高级语言的发展总结•11结论1计算机高级语言的发展历程•非结构化程序设计语言•结构化程序设计语言•面向对象程序设计语言1计算机高级语言的发展历程•非结构化程序设计语言•早期出现的高级语言在程序设计时不划分模块,称为非结构化程序设计语言。如ALGOL,BASIC等。•1计算机高级语言的发展历程•结构化程序设计语言••以C语言,PASCAL为代表的语言支持结构化程序设计方法,可以将程序划分为模块,按自上而下,逐步求精的方法设计软件,称为结构化程序设计语言。1计算机高级语言的发展历程•面向对象程序设计语言•是最新一代的程序设计的方法,它的将数据与处理数据的过程作为一个整体——对象•具有三大特点:•(1)封装性和数据隐藏性•(2)继承和重用•(3)多态性1计算机高级语言的发展历程•(1)封装性和数据隐藏性:•通过建立用户定义类支持封装性和数据隐藏。完好定义的类建立后,便可看成是完全封装的实体,作为一个整体单元来使用。同时,类的实际内部工作及相关数据应当隐藏起来,即无须知道其工作原理,只需知道如何使用类便可。1计算机高级语言的发展历程•(2)继承和重用:•程序可以在扩展现有类型的基础上声明新类型(派生类)。新类型继承原类型属性方法,并增加某些特性。•(3)多态性:•一个接口,多种方法:通过继承的方法构造类,采用多态性为每个类指定表现行为。1计算机高级语言的发展历程•从本质上来说,计算机高级语言的发展有什么规律?•新一代的的语言究竟先进在什么地方?•只有理解了这些问题,才能从本质上掌握新一代计算机语言的先进特性,设计出高质量的软件,对开发出新型的程序设计语言也有一定的启发意义。2非结构化程序设计•计算机高级语言发展的初期•如BASIC,ALGOL等。1计算机高级语言的发展历程•BASIC程序例子:•10LETX=2•20LETY=SIN(X)•30PRINTY•RUN•0.0348994961计算机高级语言的发展历程•BASIC语言特点•(1)构成简单。BASIC语言的最基本语句只有17种。•(2)是一种“人机会话”式的语言。•(3)功能较全、适用面广。•(4)执行方式灵活。BASIC语言提供两种执行方式,分别是程序执行方式和命令执行方式。2非结构化程序设计语言•非结构化程序设计的缺点:整个程序不分模块,所有的变量和代码都是全局的.•程序结构={变量1,变量2,...,变量m,代码1,代码2,...,代码n}变量1变量2变量3变量4代码1代码2代码3代码4……程序1程序2变量1代码1变量2代码2变量3代码3……2非结构化程序设计语言•随着计算机应用的发展,当程序稍大一些时,非结构化程序设计语言固有的缺点就会暴露出来:•(1)变量是全局的,所有变量都可以被任何代码所使用;•(2)代码是全局的,可以随意转向到任何位置去执行,容易造成混乱。2非结构化程序设计语言•例如,一个程序有三项功能,每个功能与相应的变量和执行相应的代码的关系可能如下图所示功能1功能2功能3变量1变量2变量3变量4代码1代码2代码3代码4代码5代码6程序功能图1非结构化程序的结构我们会发现,多个功能在一个程序中可互相使用变量,互相执行代码,使程序的结构显得混乱。当功能数不多时不会有太大的影响。而当功能数多于十个乃至几十个时,这样的程序结构将复杂至无法控制的地步,主要表现为程序编码难、调试难和维护难。3结构化程序设计--功能的封装•结构化程序设计语言:•为了解决以上的程序结构混乱问题,以适应开发大程序的要求,产生了结构化程序设计语言,如PASCAL,C等。•结构化程序设计语言支持模块化的设计方法,可以将一个复杂的程序分解为一个个功能相对简单的模块,再通过对这些模块的调用完成原来程序的功能。3结构化程序设计--功能的封装•设计模块的原则是•(1)高内聚:在每个模块中,只含有单一的功能和与该功能相关的变量;•(2)低耦合:模块之间尽量减少联系。模块内的变量被称为局部变量,只在模块内部可见;一个模块也不允许转移到另一个模块内部去。3结构化程序设计--功能的封装•对于上例,只要将这3个功能有关的代码和变量分别设计成模块,再设计一个主模块调用,就可以避免以上的混乱。如图2所示。主控模块模块1模块2模块3将变量与代码放入模块3结构化程序设计--功能的封装可以说,模块如同一个箱子,实现了将一部分程序及变量的封装.主控模块模块1模块2模块33结构化程序设计--功能的封装可以说,模块如同一个箱子,装入了一部分程序及变量.也可以成为---封装.那么,一个模块到底该装入什么样的程序代码和变量?主控模块模块1模块2模块33结构化程序设计--功能的封装模块如同一个箱子,实现了将程序中按功能逻辑相关的代码与变量的封装主控模块模块1模块2模块33结构化程序设计--功能的封装•模块封装的原理是:•程序中逻辑上有关系元素(变量和代码)应当在物理上也放在一起,加以封装.•换句话说,逻辑上相关,物理上也应相关,这就是逻辑物理一致性原理。3结构化程序设计--功能的封装•封装原理:逻辑上有关系元素,应当在物理上也放在一起,加以封装•生活中的封装原理应用.3结构化程序设计--功能的封装•封装原理:•程序中逻辑上有关系元素,应当在物理上也放在一起,加以封装•再考察一下,按照封装原理,程序中还能实现什么封装呢?4、相关数据的封装•程序中的数据(变量与常量)之间是否也可能存在逻辑相关性呢?4、相关数据的封装•考察以下图中变量定义学生信息教师信息变量1变量2变量3变量4变量54、相关数据的封装•学生变量与教师变量交叉在一起,显得混乱。分析其中的逻辑关系,我们会发现与学生有关的变量是逻辑相关的,同样与教师有关的变量也是逻辑相关的。而这些逻辑相关的变量并没有得到封装,因此,跟据封装的原理,也应加以封装。4、相关数据的封装•为解决这个问题,可使用现代程序设计语言中普遍支持的高级数据类型---结构类型.例如,图4所示为用C语言结构定义封装了与学生相关的数据。4、相关数据的封装教师结构变量:教师变量1教师变量2……学生结构变量:学生变量1学生变量2……4、相关数据的封装•另外,程序中的常量之间也同样可能存在逻辑相关性,例如,多个有关色彩的编码常量,是逻辑相关的,应当在物理上放在一起加以封装。而枚举类型就可实现将这种逻辑相关常量的封装。•enumColor{red,black,yellow,blue,white};•enumColorc;5进一步提高封装度•以C,pascal等语言为代表的结构化程序设计语言还有没有可能继续提高封装度?或者说程序中是否还有逻辑物理不一致的问题?要回答这个问题,让我们分析一下客观世界。•客观世界由许许多多事物组成.每个事物都具有数据和功能。5进一步提高封装度•如:一个具体的学生是一个事物•具有数据:姓名,学号,成绩等•具有功能:设置姓名,学号,成绩,显示姓名,学号,成绩等•由此可知,客观世界中一个学生的数据及功能是密切相关的。•而在采用结构化程序设计语言设计的程序中,有关学生的数据和功能在程序中可能被分散在不同地方。5进一步提高封装度•5进一步提高封装度•如图所示,客观对象的一体性在程序中没有得到反映,存在逻辑物理不一致问题。为了解决这一问题导致了面向对象程序设计(OOP)语言的产生。6面向对象程序设计中类的封装•为了使程序中与客观对象取得一致,在面向对象程序设计语言中可以定义类,在类中将与对象相关的变量(在OOP中称为属性)和功能模块((在OOP中称为方法)进行封装。6面向对象程序设计中类的封装••在OOP中对学生对象和教师对象分别进行封装,形成学生类,教师类:publicclassStudent{privateintnum,age;privateStringname,sex;privatefloatscore;Student(intnum,intage,Stringname,Stringsex,floatscore){this.num=num;this.age=age;this.name=name;this.sex=sex;this.score=score;}publicvoidgetnum(){system.out.println(this.num);}......}6面向对象程序设计中类的封装6面向对象程序设计中类的封装•类可以实现将对象的数据与方法的封装,但不同类之间是否存在可封装的内容呢?7继承也是封装的一种形式考察下面的两个类:7继承也是封装的一种形式•我们会发现,这两个类中存在共同的部分,这些共同部分实际上是一般“人”的属性和方法,因些,这些部分是逻辑相关的,有必要进行进一步的封装---封装为基类:人员类,而学生和教师类可以从这个基类继承产生。7继承也是封装的一种形式7继承也是封装的一种形式•将多个类中逻辑上相关的一组方法与属性封装到一起,构成这多个类的共同基类,而原多个类变为从该基类的派生的形式,这就是面向对象的继承性•继承本质上仍是一种高级封装。•当然实际工作中我们可能先设计基类,再设计其派生类。但这也是我们先在头脑中完成了由个别到一般的归纳,在设计中应用了由一般到个别的演绎。8、OOP中其它封装形式•按照封装原理,OOP中还可进行更高级的封装:•(1)类模板•如果在程序中要使用一组类,这组类的功能与结构的相似性的,则这种相似性也是一种逻辑相关,应当进行封装。OOP的类模板可以实现这种封装。••templateclassTclasstarray•{intsize;•T*array;•public:•tarray(intsz=10){size=sz;array=newT[sz];}•tarray(tarrayT&a);•~tarray(){delete[]array;}•intgetsize(){returnsize;}•tarrayT&operator=(tarrayT&a);•int&operator[](Tn);•};8、OOP中其它封装形式••(2)函数模板•如果在程序中存在一组方法在功能与结构是相似性的,这也构成逻辑相关,应当加以封装。OOP的函数模板可以实现这种封装。•templateclassT•TPower(Tbase,intexponent)•{•Ti,product=1;•for(i=1;i=exponent;i++)•product*=base;•return(product);•}8、oop中其它封装形式••(3)函数重载•將逻辑上相关的一组方法采用一个函数名,这种物理上的一致性也构成一种封装,这就是函数重载。函数重载是OOP多态性的一种方式。••voiddisplay(inta)•{•coutTheintis:a\n;•}•voiddisplay(floata)•{•coutThefloatis:a\n;•}•voiddisplay(chartext[])•{•coutThetextis:text\n;•}8、oop中其它封装形式•••(4)方法覆盖•在父类中定义虚方法接口,在派生类中覆盖父类的虚方法,可以实现OOP中的高级多态性:动态联编多态性。这其中父子类中相同的方法接口也是对逻辑相关方法的物理封装。•classshape•{protected:•inthight,width;•public:•shape(inth,intw){hight=h;width=w;}•virtualvoidshowarea(){}•};•classrectangle:publicshape•{public:•rectangle(inth,intw):shape(h,w){}•voidshowarea(){cout