面向对象程序设计方法和思想-第3章.ppt
文本预览下载声明
第三章 面向对象程序设计方法和思想 面向对象程序设计的基本方法 面向对象程序设计的3种基本方法: 抽象 信息隐藏和数据封装 概括 抽象 抽象举例 信息隐藏与数据封装 概括 使用函数的程序设计——内聚问题 使用函数的程序设计——耦合问题 使用函数的程序设计——数据封装 数据封装举例 使用函数的程序设计——信息隐藏 信息隐藏举例 用函数实现信息隐藏与数据封装的不足 随堂练习 抽象是指从现实世界实体中抽取最本质的与特定应用相关的特性加以描述的过程 抽象主要是针对实体的属性和行为。属性是实体的性质和特征,行为是指实体能够执行的所有动作 对象的属性经过抽象在程序中用数据表示,而对象的抽象行为用函数来实现 C++的类能够将抽象后的对象属性和对象行为聚集在一起 注册,选专 业,交学费 学号,姓名,专 业,学分,学费 现实世界 抽象 class CStudent private id name major credit fees public registerFor pickMajor payFees 信息隐藏是将抽象出来的对象行为的对外具体表现与该行为的具体实现过程隔离开来,也即函数说明不依赖于函数的实现。函数的调用者无需了解函数的具体实现,通过函数说明就可以正确的使用函数 数据封装是指描述对象属性的数据与处理这些数据的函数聚合在一起。描述对象行为的函数是可见的,行为导致属性的变化,而描述对象属性的数据是不可见的,被隐藏起来 图3-3 函数的接口将函数的实现封装起来。 图3-4 实现对象行为的函数将描述对象属性的数据隐藏起来。 对象行为(函数) 对象属性(数据) 可见 隐藏 可见 隐藏 接口 实现 可见 隐藏 实现 概括是确定不同对象的属性和行为的共同点。概括一般有三种方式:层次性,多态性和模式。 层次性概括是按树状结构来组织对象的共性。按层次进行概括体现了后代和前辈的‘is-a-kind-of’关系。在C++中,通过对类的派生来实现继承。 多态性概括是指不考虑对象的类型,而只关心对象的共性。多态性表现为程序员无需考虑算法处理的具体对象类型,而只要知道对象会按适当的方式来执行算法指定的操作。在C++中,多态性是通过函数重载、运算符重载和虚函数等来实现的。 模式概括是指将专家解决某个问题的知识和经验以通用的形式概括成一个可套用的方案框架,供使用者针对具体的细节来引用。在C++中,模式是通过模板来实现的。 使用函数存在的问题——不能保证高内聚低耦合(以程序3-1为例) 程序3-1将从键盘读字符、判断字符是否为换行符、动态分配内存、打印字符串以及释放动态分配的内存等多个操作聚合在getAndPrintLine()一个函数中,使得函数的内聚度较低 为了提高内聚度,对程序3-1作如下改动: 打印一行字符的功能用函数printLine()来实现 读一行字符的功能用函数getLine()来实现,对其进行功能分解,并将分解后的各子功能用函数allocateMemory(),releaseMemory()和testEndofLine()来实现(程序3-2) 程序3-2提高了内聚度,但增加了函数间的耦合度 在程序3-2中,全局指针变量P_Data用于在allocateMemory(),getLine(),printLine()和main()四个函数之间传递信息。allocateMemory()函数对P_Data赋值,printLine()和main()函数都要访问P_Data,而getLine函数既访问又修改P_Data指向的数据。P_Data全局变量将上述四个函数紧紧地耦合在了一起,使其不能独立地重复使用 解决方法是取消全局变量P_Data而改用参数来实现函数之间的通信,使得函数的耦合较松(程序3-3) 但随之带来另一个问题——信息隐藏问题 程序3-3中main()函数有releaseMemory(),与之对称的allocateMemory()却不在main()里,使得信息不对称 数据封装的基本思想是将程序看成由主函数和其它函数两大部分组成 主函数体现解决问题的方法和步骤,与程序抽象的高层功能相关。主函数中不能出现直接对程序所涉及的数据进行处理和操纵的代码 主函数外的其它函数则根据问题的具体求解算法按照高内聚低耦合的原则实现对数据的处理。这些函数将数据的类型、格式和组织形式等数据结构细节与数据处理的算法封装在一起,封装后与主函数高度独立 图3-4 实现对象行为的函数将描述对象属性的数据隐藏起来。 在程序3-4中,主函数main()直接访问变量c1,c2的成员数据。数据设计和数据操纵混合在一起。如果数据设计发生变化,则main()函数内操纵数据的每一条代码都
显示全部