文档介绍:第8章抽象与封装
函数和过程是封装的程序实体,它有数据和操作,
规格说明(型构)和过程体,一体使于人们控制复杂性
Pascal统一的嵌套结构不造于大型程序
数据2
sub1--
sub10
数据4
sub22
--sub28
数据1
sub11--
sub15
数据3
sub16
--sub21
main
续
将相关的数据和操作封装成大模块(若干类型,若干过程/函数) 结构上形成包package或模块 Modula
包是可分别编译。随时连接软件资源,是解决复杂系统的有力手段
包的规格说明和包体显式分开。语义上正好是“作什麽”,“怎麽做”
模块和包
规格说明和体在表示结构上的分离。有利于修改,维护
封装实现数据隐藏,有利于安全
规格说明是程序包的抽象,有利于复杂系统简化
模块(包)封装数据与操作,它有可控界面,外界不能操纵私有数据引出公有(public包的使用者可见)、私有(private本包所有操作可访问,包外不可见)、保护(protected,包外不可见,但本包的子包可见)概念
包只是以封装手段,可有/可没有逻辑语义
--只有数据无操作,数据块BLOCK DATA(FORTRAN)
--只有操作无共享数据如函数包,数学库
--有数据有操作,一口对外可模拟自动机
--有数据有操作,模拟客观世界对象—增加程序表达能力
--封装的包可实现复杂的数据类型ADT
Ada 的复数程序包
PLEX is
type NUMBER is record
REAL_PART:FLOAT;
IMAG_PART:FLOAT;
end record;
function "+"(A,B: in NUMBER) return NUMBER;
function "-"(A,B: in NUMBER) return NUMBER;
function "*"(A,B: in NUMBER) return NUMBER;
PLEX;
package PLEX is
<声明私有数据/操作>
<实现规格说明中定义的每一个过程/函数>
<实现本包私有过程/函数>
PLEX;
有了这个程序包我们可以编出复数应用程序:
PLEX;
PLEX;
procedure MAIN is
COMP_1: NUMBER ∶= (,);--1+2i
COMP_2: NUMBER : =(,); -- 3+4i
W, X,Z: NUMBER;
begin
W ∶= COMP_1 + COMP_2; --W = 4+6i
X ∶= COMP_2 - COMP_1; --X = 2+6i
Z ∶= COMP_1 * COMP_2; --Z = -5+10i
end MAIN;
抽象数据类型
数据抽象
数据抽象是抽象数据类型的方法学
定义一组数据集V,以及其上的操作集Op,构成
ADT(Abstract Data Type)
T=( V , Op )
--什么和怎么做分开(规格说明和体)
--实现数据隐藏(体中声明的数据和操作外界不可见)
--分别开发分别编译(可做大程序)
--简化复杂性便于调试(利用抽象实现分治)
--构造新类型,计算直观方便(面向对象的基础)
构造新类型
PLEY PLEY;
Procedure MAIN is
C1:NUMBER is =(,);
C2:NUMBER is =(,);
W ,X, Z :NUMBER;
begin
W:=C1+C2;
X :=C2-C1;
Z :=C1*C2;
end MAIN
-
*
+
Number
LEX
COMP
构造函数和析构函数
变量—类型 V : integer;以类型指明程序对象
变量—抽象数据类型, 声明时要指明如何构造
C:NUMBER:=(,) 较简单可用赋初值办法,复杂在运行中由构造函数(constructor)完成
C = ADT_Name(<构造参数>) {<构造操作即函数体>}
构造函数(constructor) 和ADT同名
不再使用的程序对象,用析构函数(destructor)显式删除
一般形式是:
ADT_Name() {…} 和ADT同名
~ ADT_Name( ){…}
C语言以文件实现抽象数据类型
C语言4种文件
--头文件“”定义宏和类型声明
--主模块“”给出新类型的数据和操作定义
--其它模块“”实现头文件中声明
--通过makefile指明各文件关系
make SOMETYPE
SOMETYP