跳至正文
wyaaaattwhoAI RESEARCH & ENGINEERING
← 返回首页

数据抽象与封装概述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,只能够调用开放的接口