OO基本概念(12-1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数与数据的关系
– 户籍信息:InputAddr、GetInfo – 学籍信息:InputStu OutputAddr 可访问2数组所有数据 – 实际仅需要注册的学生 – 具有过高的权限
结构化程序设计方法的缺陷
不适应的情况
– 多个函数使用同一组数据 – 有状态、更新次序
存在问题
– 函数调用的次序容易违反应用需求 – 涉及多个模块,出错不易检查 – 因此,全局变量应该避免使用 – 局部变量仍存在这种问题
本课的学习内容
面向对象方法的基本概念 面向对象的封装性、继承性和多态性在 软件系统分析、系统设计和程序设计中 的应用方法 本质上是学习一种分析问题和解决问题 的方法
本课的考核方法
期末考试
– (笔试)
40%
课程设计
40%
– (演示、设计报告) 平时成绩 20% – (讨论题交流、作业抽查) – 课上用飞鸽(http://www.ipmsg.org.cn/) – 课下用邮件(liaohs@bjut.edu.cn)
– 软件自动化(程序变换。。。) – 形式化方法
学科分类与课程体系(续)
软件工程
– 软件项目管理
– 软件工程方法(传统、面向对象、敏捷…)
– 软件体系结构(构件、软件复用、再工程…) – 软件测试、质量管理
本课内容
1. 2. 3. 4. 5.
6.
C++简介与对象概念 对象关联 对象建模初步 Windows编程基础 面向对象范型 使用案例建模
0.3 面向对象程序设计
基本方法
– 将软件划分为多个对象 – 每个对象有自己的数据和方法 – (也称为成员变量和成员函数)
与模块化程序设计的不同之处
– 封装性、继承性、多态性 – 形成面向对象技术的三大特征
封装性
外部模块(对象)
– 只能通过消息传递来激活模块对外提供的方 法 – 不能访问模块内部的属性(数据)
算法的逐步求精
1 2 3
读入并保存所有户籍信息addrInfo 读入并保存所有学籍信息stuInfo 构造学生基本信息表
–3.1 依次从stuInfo中取出一个学生的信息 –3.2 根据其身份证号码,从addrInfo中找出该生 的户籍信息 –3.3 综合该生的户籍信息和学籍信息,构造基本 信息记录,填入学生基本信息表 –3.4 重复 3.1-3.3 的处理,直至处理完所有学生 的数据
7. 8. 9. 10. 11.
静态建模 动态建模 设计案例分析 多态性及其应用 可重用的软件设计
引论:面向对象技术的由来
程序设计方法的发展
– 结构化程序设计 – 模块化程序设计 – 面向对象程序设计
软件工程方法
– 结构化分析、结构化设计 – 面向对象分析、面向对象设计
0.1 结构化程序设计的复习
多态性
不同的对象(不同形态的对象)
– 以不同方法响应相同消息
客观世界中的案例
– 体育比赛中裁判员击发信号枪, – 则短跑运动员起跑, – 而游泳运动员跳入水中
面向对象方法的应用
1、程序设计 OOP:以程序模块为 Object 2、系统分析 OOA:以领域事物为 Object 3、系统设计 OOD:以系统组成元素为 Object 4、软件工程 OOSE:综合OOP、OOA和OOD 5、数据模型 OODB:以数据为 Object
程序组织的作用
– 相互独立的模块(函数) – 便于程序的理解和修改
案例0.1的函数设置
结构化程序设计中
– 模块划分 = 函数设置
划分的原则:独立性 如何设置函数?请提出自己的方案
我的方案
数据结构
InfoAddr: 户籍信息的结构体 InfoStu: 学籍信息的结构体
函数
int inputAddr( InfoAddr info[ ], FILE *fp ); // 从指定输入流读入户籍信息,返回个数 int inputStu( InfoStu info[ ], FILE *fp ); // 从指定输入流读入学籍信息,返回个数
– 类名 变量名(实在参数表);
文件是对象?
– – – – 对象标识: 对象属性: 对象方法: 封装性: fp 文件指针 FILE 的成员(内部数据结构) 所有文件处理函数 只有通过各文件处理函数才能访问文件
因此,文件模块描述了一种文件对象
对象的封装性
文件的封装性
– 程序设计者不需要知道 FILE 内部结构 – p = fp->buf 是合法的 C 语句 – C 语言不支持封装
学籍模块
–变量:InfoStu infoStu[ 256 ] –函数:InputStu、OutputInfo
模块化设计方法的应用
管理信息系统的系统分析和设计
– 典型的数据库应用系统
数据分析
– 实体关系模型 表结构
软件设计
– 为每个实体(表)设置1个模块 – 每个某块设置一组函数 – 负责数据的增删改、查询选择
学科分类与课程体系(续)
软件语言
– 程序设计语言(面向对象等)
– 说明型语言(函数式语言、逻辑型语言)
– 需求定义语言、领域专用语言
软件系统
– 操作系统、语言处理系统(编译) – 数据库系统、分布式系统、人机交互系统
学科分类与课程体系(续)
软件方法学
– 结构化方法、面向对象方法
– 程序设计方法(结构化、过程化、面向对象、 函数式、逻辑式)
结构化设计的基本方法
1. 2. 3. 4.
数据分析 需要保存的数据 功能分析 算法描述
– 伪码、流程图
数据结构的设计
– 结构定义、变量声明
函数(模块)的设计:
– 函数参数、返回值、功能概要
为什么设置函数?
实用软件开发的需求
– 面对复杂逻辑、复杂数据 – 软件维护的需求 – 软件升级的需求
面向对象技术
北京工业大学计算机学院 软件系廖湖声主讲
liaohs@bjut.edu.cn
学时: 48(授课36+上机12)
版权所有,复制必究
计算机软件与理论的学科分类 与课程体系
1、理论计算机科学
– 数值计算
– 离散数学(集合、逻辑、代数、图论)
– 计算理论(算法设计、复杂性、形式语言与 自动机、可计算性) – 程序理论(形式语义、类型理论、程序验证)
系统结构
Main
InputAddr
InputStu
OutputInfo
GetInfo
这种设计方案的依据
来自算法设计
– 分清每个模块的责任、输入和输出
责任的分析
– 哪个模块(函数)承担哪些功能
模块的确认
– 算法中承担哪些功能
原则
– 减少相互依赖关系
该方案的缺陷
目标的唯一性
– 户籍信息数组和信息个数用2个变量标识 – 学籍信息数组和信息个数用2个变量标识
客观世界中的案例
– 洗衣机是对象 – 内部电机和电路是属性(被封装、不可见) – 开关按钮提供方法(外部操作)
继承性
继承性的描述
– 对象(模块)之间的一般特殊关系 – 特殊对象继承一般对象的属性和行为
客观世界中的案例
– 汽车和公共汽车 – 公共汽车具有汽车的所有属性和方法 – 也具有特殊的属性(如:线路) – 和特殊的行为(如:报站、售票等)
第一讲 对象概念及其C++描述
C 语言是 C++ 语言的子集
– 扩充 C 语言 C++ 语言
扩充的目的:
– 支持面向对象程序设计
Байду номын сангаас
扩充的功能:
– 类定义(对象类) – 消息传递(类似函数调用) – 继承、虚函数
1.1 对象与封装
对象 相对独立的实体
– 具有表示其状态、特征的属性 – 具有表示其行为、功能的操作 – 封装性:只有自身操作可访问对象属性
程序中的对象 程序模块描述的实体
– – – – 有对象标识 具有数据成员描述属性、状态 具有方法成员描述功能、服务 封装性:禁止外部操作访问对象属性
程序中对象的案例
C程序中的文件处理模块
FILE *fp; fp = fopen( “file.txt”, “r” ); fscanf( fp, “%d”, &x ); int ch = getc(fp); fclose(fp);
cout << p->GetN( ) << “/” << p->GetD( );
}
程序实例 – 运行中程序实例 = 若干对象实例 + 交互控制 – 程序代码 = 若干对象类定义(描述对象的程序模块) – C++程序代码 = main函数定义 + 若干对象类定义
对象的使用方法
对象实例的创建(由变量名标识) CRation r1( 5, 8 );
数据分析与算法概要
数据对象 变量
–学生户籍数据 addrInfo –学生学籍数据 stuInfo –学生基本信息表可以直接输出(不保存)
算法概要 1. 输入户籍数据(每行输入一个学生的数据) 2. 输入学籍数据(每行输入一个学生的数据) 3. 构造并输出学生基本信息表
(提取户籍和学籍数据,构造并输出学生信息表)
其他函数
InfoAddr *GetInfo( long no, InfoAddr info[ ], int n ); // 从info获得身份证号为no的户籍信息 // 其中,n是数组info中信息个数 // 不存在时,返回空指针 OutputInfo( InfoStu stu[ ], int n, InfoAddr addr[ ], FILE *fp ); // 输出stu中所有学生的基本信息到输出流fp // 其中,n是数组stu中学生信息个数
功能分解、逐步求精
– 面对复杂问题,按照功能分解 – 1个模块负责1个功能,逐步继续分解 – 直到模块足够小(用1个函数可实现)
语言支持
– 控制结构:循环、选择 – (单入口、单出口) – 函数、子例程 模块的实现
例0-1:简易学生管理
任务:
–分别输入学生的户籍信息和学籍信息,打印出学生 基本信息表(假设学生人数<250人) –户籍信息:姓名、身份证号码、出生年月日、住址 ; –学籍信息:学号、身份证号码、所属学院、专业、 班级 –学生基本信息表:学号、姓名、年龄、所属学院、 班级;
0.2 模块化程序设计
基本思路
– 按照数据和函数的依赖关系组织程序的模块
模块 = 数据变量 + 相关函数
– 根据所处理的主要数据,来决定函数属于哪 个模块
设计方法
– 基于数据的模块划分和软件组织
简易学生管理的模块化程序设计
户籍模块
–变量:InfoAddr infoAddr[ 256 ] –函数:InputAddr、GetInfo
信息管理系统的特点
应用需求大
– 政府、企业信息化建设巨大的需求
数据量大、结构简单
– 使用著名的数据库系统
控制逻辑简单
– 算法简单 – 常用网页作为用户界面
模块化程序设计的缺陷
复杂软件
– 数据共享、一致性(多函数) – 访问方法的多样性 – 模块划分的合理性难以保证
维护困难
– 数据结构的修改可能影响多个模块 – 函数调用者和被调用者的约束关系强
# include “stdio.h” # include “CRation.h” main( ) { CRation r1( 5, 8 ); CRation r2( 18, 27 ); CRation *p = r1.Add( r2 );
使用对象的程序例
// 分配空间,调构造函数 // r1 + r2 *p
C++ 语言的支持
– 支持类的定义:描述对象的属性和方法 – 不允许直接访问数据成员(编译错误) – C++程序 = 主函数(main) + 若干类定义
C++语言如何描述对象?
类定义格式:
class 类名 { 数据成员的说明 public: 方法成员的说明 }; 例1-1:有理数类的定义CRation.h class CRation { int n; // 分子 int d; // 分母 int Gcd( ); // 求最大公约数 public CRation( int n, int d ); // 构造 CRation *Add( CRation &r ); // 加法 int GetN( ); int GetD( ); // 输出 };
参考资料
邓正宏等编,面向对象技术,国防工业出版社 李英军等译,设计模式,机械工业出版社
姚淑贞等译,UML和模式应用,机械工业出版社
麻志毅等译,C++ 面向对象开发,机械工业出版社 刘宗田等译,C++ 编程思想,机械工业出版社 面向对象技术网站大全,www.cetus-links.org