数据抽象与封装概述hred
数据抽象与封装概述
- 抽象与封装是两个重要的程序设计手段,主要是用来驾驭程序的复杂度和提高程序的安全性,便于大型程序的设计、理解与维护。
- 对于一个程序实体而言,
- 抽象是指该程序实体外部可观察到的行为,使用者不考虑该程序实体的内部是如何实现的。(复杂度控制)
- 封装是指把该程序实体内部的具体实现细节对使用者隐藏起来,只对外提供一个接口。(信息保护)
- 主要的程序抽象与封装机制包括:
- 过程抽象与封装
- 数据抽象与封装
- 过程抽象与封装
- 过程抽象
- 用一个名字来代表一段完成一定功能的程序代码,代码的使用者只需要知道代码的名字以及相应的功能,而不需要知道对应的程序代码是如何实现的。
- 过程封装
- 把命名代码的具体实现隐藏起来(对使用者不可见,或不可直接访问),使用者只能通过代码名字来使用相应的代码。
- 命名代码所需要的数据是通过参数来获得,计算结果通过返回值机制返回。
- 实现过程抽象与封装的程序实体通常称为子程序。在C/C++语言中,子程序用函数来表示。
过程抽象与封装是基于功能分解与复合的过程式程序设计的基础
- 数据抽象与封装
- 数据抽象
- 只描述对数据能实施哪些操作以及这些操作之间的关系,数据的使用者不需要知道数据的具体表示形式(数组或链表等)
- 数据封装
- 把数据及其操作作为一个整体(封装体)来进行实现,其中,数据的具体表示被隐藏起来(使用者不可见,或不可直接访问),对数据的访问(使用)只能通过封装体对外接口中提供的操作来完成。
- 与过程抽象与封装相比,数据抽象与封装能够实现更好的数据保护。
- 例子:栈的使用
- 栈是一种由若干具有线性次序关系的元素所构成的复合数据,对栈只能实施两种操作:
- 进栈(push):往栈中增加一个元素
- 退栈(pop):从栈中删除一个元素
- 上述两个操作满足一个重要性质:
对于操作序列:
push(...); ...pop(...); ... ;push(x);pop(y);,它满足:x == y即,增加/删除操作在线性序列的同一端(称为栈顶)进行, 后进先出(Last In First Out,简称LIFO)是它的基本特征。 - 栈的应用
- 隐式:函数调用时局部变量等的内存管理(分配/释放)。
- 显式:应用程序中对一些数据的管理。例如,把表达式的中缀表示转成后缀表示的程序中,要用到一个操作符栈。
- 栈的实现
- 定义一个数据类型来表示栈数据
- 第一种操作:直接操作
- 第二种:过程抽象与封装
- 第三种:数据封装
- 数据表示:定义栈数据类型
数据抽象与封装是面向对象程序的基础,其中的对象体现了数据的抽象与封装
中缀表达式与后缀表达式
中缀表达式:a+b/c-d
后缀表达式:abc/+d-
好处:忽略了对于优先级的判断
可以运用栈来实现
重大隐患:数据定义与操作的定义是分开的,二者之间没有必然的联系,仅仅依靠操作的参数类型把二者关联起来。
例如,下面函数f的参数类型也为Stack,因此用它也能操作栈数据st,从而会破坏st所具有的栈性质。
再者,数据依然是公开的,用户依然可以直接操作😭
如此一来,用户将不再能直接操作top与buffer,只能够调用开放的接口