第六章面向对象的设计方法
软件工程第六章面向对象方法概述讲解学习
▪ 尽量避免使用多重继承。 ▪ 继承的层次不宜太多
多态性
▪ 对不同的消息表现出不同的行为 ▪ 覆盖与重载
➢ 虚方法 ➢ 参数重载
参数数目不同 参数类型不同 参数类型顺序不同
软件工程
第17讲:面向对象方法
主讲人:阳王东 Email:yangwangdong@
主要内容
▪ 编程的沉思 ▪ 什么是面向对象 ▪ 面向对象的特征 ▪ 对象之间的关系
编程的沉思
▪ 编程存在重复劳动吗
➢ 机器替代了人手工的重复劳动 ➢ 程序则替代了人脑的重复性劳动 ➢ 编程无重复
▪ 程序中的世界
服
提供物品,
务
帐单,入库 、出库
属 商标,型号,
性 计量单位、价
抽象
格、数量
入库、销售 服 ▪ 子类自动地共享基类中定义的数据和方法的机制。
➢ 基类与派生类 ➢ 单继承与多重继承
▪ 继承的优点
➢ 减少原代码,即代码可重用。 ➢ 代码的相互独立性。 ➢ 易于维护。 ➢ 体现自然界之间的关系。
▪ 归纳关系体现为一种继承关 系
归纳关系(续)
组合关系
▪ 组合关系就是“整 体—部分”关系,它 反映了对象之间的构 成关系。组合关系也 称为聚集关系。
▪ 组合关系具有的最重 要的性质是传递性。 也就是说,如果A是B 的一部分,B是C的一 部分,则A也是C的一 部分
组合关系(续)
关联关系
▪ 关联关系反映对象之 间相互依赖、相互作 用的关系。通常把两 类对象之间的二元关 系再细分为一对一 (1∶1)、一对多(1∶M) 和多对多(M∶N)等三 种基本类型,类型的 划分依据参与关联的 对象的数目
软件工程第六章面向对象方法概述
系
人科
车辆
非机动车 机动车
哺乳动物
翼手目
食肉目
猴科
犬科
自行车 人力车 客车 卡车 拖拉机
鲸目
猫科
人
猩猩
狗 狼 狐猫 虎 豹
继承性(续)
▪ 不要滥用继承
➢ 如果类A和类B毫不相关,不可以为了使B的功 能更多些而让B继承A的功能。 人想拥有狗鼻 子的灵敏问题。
➢ 若在逻辑上A是B的“一部分”(a part of), 则不允许B继承A的功能,而是要用A和其它东 西组合出B。 头与眼睛、鼻子、耳朵、嘴巴的 关系。
其中,ID MS DS MI是对象受理的消息名集合(即对外接口)
➢ 对象(Object)是类(Class)的一个实例(Instance)。
面向对象的基本概念(续)
▪ 类的定义
➢ 对具有相同数据和相同操作的一组相似对象的定 义。
➢ 类是对象的程序描述,对象是该程序运行时所创 建的实例。
➢ 对象比作房子,那么类就是房子的设计图纸 。 ➢ 对象比作一个个活人,则人类则是对人这类动物
▪ 对象A向对象B发送消息f就是对象A调用对象B的 方法f
面向对象的特征
▪ 以数据为中心,抑或以行为为中心
➢ 分别用上述两种方式来描述人
▪ 封装性 ▪ 继承性 ▪ 多态性
封装性
▪ 封装性是把对象的属性和方法结合成一个独立的 单元,并尽可能荫蔽对象的内部细节。
➢ Public,private,protected ➢ 避免访问内部数据 ➢ 尽量通过方法访问
归纳关系(续)
组合关系
▪ 组合关系就是“整 体—部分”关系,它 反映了对象之间的构 成关系。组合关系也 称为聚集关系。
▪ 组合关系具有的最重 要的性质是传递性。 也就是说,如果A是B 的一部分,B是C的一 部分,则A也是C的一 部分
面向对象设计主要内容
• 通常用一个名词给代表对象的类命名。一个类代表一个实 体,根据类可以建立程序所需要的任意多个实例。
• 类识别时候还要处理一个问题: 是将某一事物表示为一个 对象还是另一个对象的基本属性。
• 6.2.2 类职责的分派
• 类职责的分派是软件设计工作的一部分,每个类代表一个 具有某些行为的对象,对象的行为由这个类的方法定义。
5-7
• 6.4 类间关系 • 类之间最基本的关系是:依赖、聚合和继承。
• 6.4.1 依赖关系 • 类之间的依赖关系通常体现在一个类的方法调用另一个类
的一个方法。 • 一般而言,如果类A使用类B,则在类A中由一个或者多个
方法调用类B中一个或者多个方法。如果被调用的方法是 静态方法,则类A只需要通过类名引用B,如果被调用的方 法是非静态的,则A必须通过访问类B的实例来调用该方法。 • 一个对象获得对另一个类的对象访问控制的方式,是软件 设计中的重要决策。
面向对象设计主要内容
13
• 一个类也可以实现多个接口,在这种情况下,这个类应提 供所有接口种所有方法的实现代码。
• 使用implements字句声明一个类实现多个接口,接口名 用逗号分隔开。
class ManyThings implements interface1,interface2,interface3
{ =name;
this.acctNumber = acctNumber;
this.balance = balance;
}
面向对象设计主要内容
11
• 6.5 接口
• 接口表示一组公共的方法,通过这组方法可以与一个对象 交互。
• 一个Java接口是一组常量和抽象方法的集合。
• 抽象方法是没有实现的方法,即对于抽象方法没有已定义 的实现代码,包含参数列表的方法声明头后面仅跟这一个 分号。
面向对象程序设计的方法
面向对象程序设计的方法面向对象程序设计(Object-Oriented Programming,简称OOP)是一种程序设计方法,它以对象为基本单位,通过封装、继承和多态等概念来组织和管理代码。
以下是一些常用的面向对象程序设计方法:1.封装(Encapsulation):封装是将数据和操作封装在一个对象中的过程。
通过封装,对象可以隐藏内部实现细节,并提供公共接口供其他对象进行交互。
封装有助于提高代码的可维护性、重用性和安全性。
2.继承(Inheritance):继承是指一个类可以继承另一个类的属性和方法。
通过继承,子类可以拥有父类的特性,并可以在此基础上添加、修改或覆盖功能。
继承有助于代码的重用和组织,同时支持创建层次结构和多态性。
3.多态(Polymorphism):多态是指同一个方法可以根据调用的对象不同而表现出不同的行为。
多态可以通过继承和接口实现。
它允许不同类型的对象对同一个方法进行不同的实现,提高代码的灵活性和扩展性。
4.抽象(Abstraction):抽象是将问题领域的实体和行为抽象化为类和方法的过程。
通过抽象,可以从复杂的现实世界中提取出关键概念和通用行为,以简化设计和实现过程。
抽象有助于构建更高层次的模型和逻辑结构。
5.接口(Interface):接口定义了一组方法的规范,但不提供具体的实现。
通过接口,可以定义对象之间的约定和交互方式,实现了代码的松耦合和可替换性。
接口可以用于实现多态性和组件的独立开发。
6.类(Class):类是对象的蓝图或模板,描述了对象的属性和行为。
通过类,可以创建具体的对象实例,并对其进行操作。
类是面向对象编程的基本单位,用于组织和封装相关的数据和方法。
软件工程—第6章 面向对象设计—OMT介绍
类库中已有 车辆 OTS 车牌 车牌确认
设计结果: 车辆 OTS 车牌 车牌确认
车辆 车牌确认 车牌 颜色 式样 生产日期 产地 车牌确认
2.用户界面部分(HIC)的设计 • 通常在OOA阶段给出了所需的属性和操作,在设计阶 段必须根据需求把交互的细节加入到用户界面的设计 中,包括有效的人机交互所必需的实际显示和输入。
Coad与Yourdon的方法
主题层 类与对象层 结构层 属性层 服务层
人机 交互
问题 域
数据 管理
任务 管理
问题论域部分包括与所面对的应用问题直接有关的所有 类和对象。 在其它的三个部分中,识别和定义新的类和对象。
1.问题域部分(PDC)的设计 – OOA阶段得到的有关应用的概念模型描述了所要解 决的问题 。在OOD阶段,主要是对OOA产生模型 中的某些类与对象、结构、属性、操作进行组合与 分解,或者增加必要的类、属性和联系。
Coad与Yourdon的方法
1)数据管理方法 – 数据管理方法主要有三种 • 文件管理 • 关系数据库管理 • 面向对象的数据库管理 2)数据管理部分的设计 –数据存储管理部分的设计包括数据存放方法的设计 和相应操作的设计
OMT(object modeling technique)
– OMT是美国通用电气公司在总结其内部多年来采用 OO技术开发实践的基础上提出的一套系统开发方 法学。 – OMT最早是由Loomis,Shan和Rumbaugh在1987 年提出的,曾扩展应用于关系DB设计。 – J.Rumbaugh在1991年正式把OMT应用于OO的分 析和设计。 –它以面向对象思想为基础,通过构造一组相关模型 (对象模型、动态模型和功能模型)来获得关于问 题的全面认识(即问题领域模型),是在实体关系 模型上扩展了类、继承和行为而得到的。
VFP第6章面向对象的程序设计
03
Visual FoxPro中的事件 驱动编程
事件驱动编程的概念
事件驱动编程是一种编程范式,它通 过事件来触发程序的执行。在事件驱 动的程序中,事件是由用户操作或其 他系统事件触发的,例如点击按钮、 键盘输入等。
在事件驱动的程序中,程序的状态由 事件和事件处理程序来管理。当某个 事件发生时,相应的事件处理程序会 被调用,以响应该事件。
什么是对象
对象是面向对象程序设计的基本单元,代表了现实世界中的 事物或概念。
对象由属性和方法组成,属性描述对象的状态,方法定义对 象的行为。
对象的属性、方法和事件
属性
描述对象特性的数据元素,如颜色、大小等。
方法
定义在对象上的操作,用于实现特定的功能 或行为。
事件
由用户或系统触发,导致对象状态改变或执 行特定操作。
根据项目需求选择合适的数据访问方式,如直接访问数据 库、使用ORM框架等。
01
数据流控制
设计合适的数据流控制结构,如顺序、 循环、条件等,实现数据的处理和流转。
02
03
数据验证
对输入数据进行验证,确保数据的合 法性和准确性。
THANKS FOR WATCHING
感谢您的观看
为控件编写事件处理程序,以响应用户的操 作或系统事件。
调用方法
通过调用控件的方法来执行特定的操作,如 显示或隐藏控件。
05
面向对象程序设计在 Visual FoxPro中的应用
数据库应用程序的设计
数据库模型选择
根据项目需求选择合适的数据库模型,如关系 型、层次型或网络型。
数据结构设计
定义数据库中的表、字段、主键、外键等,以 及表之间的关系。
事件处理程序
面向对象的开发方法
件
工 程
❖“ 面 向 对 象 ” 就 是 面 向 问 题 空 间 中 的 实
概 述
体。
10
2021/4/9
10
软
件 工
对象
程
➢ 对象——是对客观世界中事物的一种抽象。
是由数据(属性)及其之上的操作(行为)
之
组成的封装体。
或:
软 件 工
类和对象封装了对描述某些现实世界实体的 内容和行为所需的数据和过程的抽象。
述
象。
19 Operation(操作)——说明要进行的操作。
A2r02g1/u4/9ments(变量)——提供操作完成所需的信 19
软
件
工 ➢ 封装——又称信息隐藏。用户只能见到
程
对象封装界面上的信息,对象内部对用
户时隐蔽的。
之
封装的目的是将对象的使用者与设计者
软
件 分开。
工
程 概
封装有效的实现了模块化。
➢ 流行的范型
程
❖ 过程性范型
❖ 逻辑性范型
之
❖ 面向存取范型
❖ 面向对象范型
软
❖ 面向进程范型
件
❖ 函数型范型
工
不同的范型,会导出不同的模块、过程和规
程 概
则。
述
对于不同的问题,应选择更适合的范型作为
解决问题切入点。
5
2021/4/9
5
软
件 工
➢ 过程性范型
程
❖ 产生过程的抽象,将软件视为处理流,并定
A 之
Op1
软 件
Op2 消息
工
程
C
概
述
Op6
Op7
OP8
第六章 对象图-UML面向对象分析、建模与设计-吕云翔-清华大学出版社
对象图的建模技术
为对象结构建模
识别建模机制。建模机制被描述为系统的某些功能或行为,经常会被耦 合为用例,由一组类、接口和其他事物的交互产生。可以创建协作来描 述机制。
识别参与的类和接口等元素,以及这些元素之间的关系。 识别并选择对象。考虑这个机制的脚本在某时刻被冻结时的情况,识别
并选择出各个对象。 按需要显示每个对象的状态。 识别并显示出对象之间的链,即对象的类目之间关联的实例。
对象图使用要点
注重于表达系统静态设计视图或静态交互视图的一个方面。 表示由一个交互图描绘的动态场景的一个画面。 只包含对理解该方面不可缺少的那些元素。 提供与它的抽象层次相一致的细节,应该只显露出对理解是不可缺
对象图的组成元素——对象
对象是类的实例,是一个封装了状态和行为的具 有良好边界和标识符的离散实体。对象通过其类 型、名称和状态区别于其他对象而存在。
对象名:在矩形框的顶端显示。 类型:具体的类目 状态:由对象的所有属性以及运行时的当前值
组成。
表示法:在对象名后跟一个冒号加上类型名, 并且使用下划线与类进行区分。
stu : Student 标准表示法 : Student 匿名表示法 stu 省略类名的表示法
对象图的组成元素——链
链是关联关系的实例,是两个或多个对象之间 的独立连接。因此,链在对象图中的作用就十 分类似于关联关系在类图中的作用。
在UML中,链同样使用一根实线段来表示,如 图6-27所示。
对象图
类图的实例——对象图
对象图概述 对象图的组成元素
对象 链
面向对象程序设计 第六章 多线程
②可以并发工作,例如程序边计算,边录入数据;或 者边接受信息,边处理。例如游戏、视频点播、多 用户交互系统等。
③多线程能够简化编程,可以简化单一程序同时交织 在一起的多个操作处理。同时,多线程是透明的, 不管是一个cpu,还是多个cpu,都是一样的,易于 扩展。
5.6线程调度
④线程同步 ⑴线程同步:一个线程的运行要依赖于外一个线程
的对共享资源的处理结果。 ⑵生产者-消费者模式2:消费者执行的前提条件是生
产者操作已经生产了;生产者操作执行的前提条件是 消费者已经消费了。例子:火车的进站与出站。
⑶线程未同步出错。 ⑷线程同步:通过设定信号量以及wait()和notify()方 法来实现线程同步。 wait():当前线程等待,直到另一线程发出notify()唤 醒。 notify():唤醒线程调度队列中第一个等待线程。
第五章 多线程
目录
进程与线程 多线程的动机 线程的状态 多线程编程:2种创建线程方法、线程优先级 线程同步
5.1进程与线程
⑴进程即独立运行的程序,多进程就是计算机上同 时运行2个或以上的程序。例如:边听歌、边打开Word 编辑,同时IE浏览网页。多进程除非在多处理机(多 个CPU)的情况下,才真正并行,否则就是通过时间片 原理,由操作系统以非常小的时间间隔来交替执行, 给我们一种并发执行的感觉,即并发执行。
②sleep(long millis) 方 法 : 让 线 程 休 眠 millis 毫 秒 , 时 间 一 到 就 进 入 就 绪 状 态 。 sleep方法必须放在try块中,因为其在休眠状 态可能被其他人调用interrupt()方法中断,从 而产生异常。
Python程序设计-清华大学出版社-董付国第6章 面向对象程序设计
6.1 类的定义与使用
>>> class A: def __init__(self, value1 = 0, value2 = 0): self._value1 = value1 self.__value2 = value2 def setValue(self, value1, value2): self._value1 = value1 self.__value2 = value2 def show(self): print self._value1 print self.value2 >>> a = A() >>> a._value1 0 >>> a._A__value2 0
6.1 类的定义与使用
属性有两种,一种是实例属性,另一种是类属性。实例属 性是在伪构造函数__init__中定义的,定义时以self作为前 缀;类属性是在类中方法之外定义的属性。在主程序中 (在类的的外部),实例属性属于实例(对象)只能通过对 象名访问;类属性属于类可通过类名访问。 在类的方法中可以调用类的其它方法,可以访问类属性、 对象属性。 类和对象都可以动态地增加成员
6.3.2 Python3.x中的属性
>>> class Test: def show(self): print(self.value) print(self.__v) >>> t = Test() >>> t.show() 出错信息 AttributeError: 'Test' object has no attribute 'value' >>> t.value = 3 >>> t.show() 3 出错信息 AttributeError: 'Test' object has no attribute '_Test__v' >>> t.__v = 5 >>> t.show() 3 出错信息 AttributeError: 'Test' object has no attribute '_Test__v' >>> t._Test__v = 5 >>> t.show() 3 5
面向对象程序设计方法
面向对象程序设计方法
面向对象程序设计(Object-Oriented Programming, OOP)是一种程序设计思想,它强调将运行时环境中的对象与抽象出来的对象类型(或称为类)进行结合,以此来节约编程的工作量并提高程序的可操作性。
典型的OOP程序中,所有可用的类都可以通过继承,联系和组合组合成更高一级的类,而这些类又可以被用来构建新的对象。
OOP程序设计具有以下特征:
1、封装:封装是指将程序代码和数据结构组合在一起,使得它们可以单独使用,而不必考虑其他编程元素。
2、抽象:抽象是指将共性和特性从复杂的实体中抽离出来,建立一个通用的基类,用于管理、处理及访问某一类对象的相似之处。
3、多态:多态是指不同的对象,对同一操作可以表现出不同的行为。
4、继承:继承是指一个类的子类可以继承父类的特征,然后根据自身的需要,增加新的特征。
OOP程序设计的重要特点是它可以让程序员以可重用的模块来构建应用程序,从而大大降低程序编写及测试的工作量,也能够提升程序的可操作性。
类对象可以被构建成抽象层次结构,以便从可复用的模块中派生出更多新的类。
大量的类可以被组合在一起,形成一个功能更丰富的解决方案。
此外,多态性能让程序维护变得更加容易,因为改变一个类的行为,也不会影响到其他类。
《C++面向对象程序设计》 谭浩强 第六章
C++
先声明基类point类,并调试之; 再声明派生类circle类,调试之; 最后声明cylinder类,调试之。
6- 5
① 先声明基类point
#include <iostream.h> class point //声明类point {public: point (float x=0, float y=0 ); //有默认值的构造函数 void setPoint (float, float); //设置点坐标 float getX ( ) const { return x; } // 读x 值 float getY ( ) const { return y; } // 读y 值 friend ostream & operator << ( ostream &, const point &); protected: float x,y; }; // 下面定义 point类的成员函数 point :: point (float a, float b) // point的构造函数 { x = a; y = b; } void point :: setPoint (float a, float b) { x =a; y = b; } ostream &operator << (ostream &output, const point &p) { // 重载运算符<< output<<“[x=“<<p.x<<“, y=“<<p.y<<“]”<<endl; return output; }
6Hale Waihona Puke 7③ 最后声明cylinder类
软件工程 第6章 面向对象方法学
(a) 屏幕上的圆
(b) 圆对象
★要求Circle1在屏幕上移动,需向其发消息: Circle1.Move(10,19)
软件工程概论教程
常州大学信息科学与工程学院
卢 莹
Circle 1
Center(15,10) Radius(8) Color(Green) Draw( ) Move(△X,△Y)
Circle 2
Center(40,35) Radius(4) Color(Blue) Draw( ) Move(△X,△Y)
(a) 屏幕上的圆
(b) 圆对象
◆客观存在的事物
抽象
Circle Center Radius Color
对象
抽象
类
Draw( ) Move(△X,△Y)
(c) 圆类的定义
软件工程概论教程 常州大学信息科学与工程学院 卢 莹
张三是学生类的一个实例,张三的信息包括:
03319415(学号)、张三(姓名)、19850822(生日)、 计算机科学与技术 (专业)、计算机036、130xxxxxxxx、…… 张三可以进行的操作: 查询个人信息;修改电话号码、……
软件工程概论教程 常州大学信息科学与工程学院 卢 莹
(2)类的实现机制(以C++为例)
①类是一个抽象数据类型:
数据定义(成员变量) 类定义 (class) 可见性: private、protected、 public、friend
操作定义(成员函数)
②类定义中有创建实例、撤消实例的机制:
构造函数(constructor)—— 类名() (C++ 规定,每个类必须有默认的构造函数,没有构造函数 就不能创建对象。) 析构函数(destructor)—— ~类名() (析构函数是特殊的成员函数,只有在类对象的生命期结束 时,由系统自动调用。)
面向对象设计方法
面向对象设计方法
面向对象设计方法是一种用于创建和组织对象的方法论。
它基于面向对象编程的原则和思想,并结合了一些实践中的经验和最佳实践。
面向对象设计方法通常包括以下几个步骤:
1. 分析需求:明确系统的需求,并将其分解成不同的对象和功能。
2. 确定对象:识别出系统中的各个对象,并定义它们的属性和行为。
3. 建立类和对象关系:根据对象之间的关系,设计类和类之间的关系(如继承、组合、关联等)。
4. 设计接口:定义每个对象的公共接口,明确每个对象的职责。
5. 实现对象:基于对象的设计,创建和实现每个对象的代码。
6. 测试和调试:对每个对象进行单元测试和集成测试,确保其功能和交互正常。
7. 优化和重构:根据实际情况对设计进行优化和重构,以提高系统的性能和可维护性。
在面向对象设计方法中,关注点主要集中在对象的抽象、封装、继承和多态等概念上。
通过将系统划分为独立的对象,每个对象负责一部分功能,实现了系统的模块化和可重用性。
同时,通过类和对象之间的关系,可以建立起一种灵活而高效的系统架构。
总的来说,面向对象设计方法是一种以对象为中心的系统设计方法,它通过对象的分解、组合和关联等方式,将系统的复杂性进行有效的管理,从而实现可扩展、可重用和可维护的软件系统。
软件工程第六章
6.4.1、 6.4.1、Booch方法 方法
• 1、类图:类与类之间的相互关系
6.4.1、 6.4.1、Booch方法 方法
• 2、对象图:由对象和消息组成
6.4.1、 6.4.1、Booch方法 方法
• 3、状态图:用于描述某个类的状态空间, 状态的改变和引起状态改变的事件及系统 中类的动态行为
• 1、模块化: • 面向对象的开发方法本身就支持把系统分解 “ 成模块的设计原则 • 2、抽象: • 在面向对象的设计阶段,对象具有极强的抽 象表达能力,类实现了对象的数据和行为的 抽象
6.3.2、 6.3.2、面向对象设计的准则
• 3、信息隐藏: • 信息隐藏即在面向对象的方法中的 “封装 “ 性”,这是保证软件部件具有优良的模块性 的基础。 • 封装性是将对象的属性及操作(服务)结合为一 个整体,尽可能屏蔽对象的内部细节,软件 部件外部对内部的访问通过接口实现
6.3.1、面向对象设计( 6.3.1、面向对象设计(OOD)的概念 )
• OOD 模型的抽象层次较低,但其建模原则和 OOA方法相同。
“ • 它设计出的结果是产生一组相关的类,每个 类都是一个独立的模块,既包含完整的数据 结构(属性),又包含完整的控制结构(服务)。
6.3.2、 6.3.2、面向对象设计的准则
6.2.1、 6.2.1、面向对象分析的特点
• 3、对需求变化有较强的适应性
“
• 构成系统最基本的元素:对象 • 对象的基本特征:封装性
6.2.1、 6.2.1、面向对象分析的特点
• 4、支持软件重用
“
• 面向对象方法的继承性 • 类的完整性、独立性
6.2.2、面向对象分析的基本任务 6.2.2、面向对象分析的基本任务 与务 6.2.2、面向对象分析的基本任务 与分析过程
面向对象设计的方法
面向对象设计的方法
面向对象设计是一种软件设计方法,通过将系统分解为一组对象,并定义它们的属性和方法来描述系统的行为。
以下是一些常用的面向对象设计方法:
1. 抽象:抽象是面向对象设计的核心概念之一。
通过抽象,我们可以将一个对象的共性特征提取出来,形成一个抽象类或接口,用于描述一组具有相似功能的对象。
2. 封装:封装指的是将数据和对数据的操作封装在一个对象中,只对外提供有限的接口来访问和操作数据。
封装可以隐藏对象内部的实现细节,提供更安全和可靠的使用方式。
3. 继承:继承是面向对象编程中的一种机制,通过继承可以在已有类的基础上定义一个新类,新类可以继承并重用父类的属性和方法。
继承可以提高代码的复用性,并且可以实现多态性。
4. 多态:多态是指同一种操作作用于不同的对象,可以有不同的解释和实现。
在面向对象设计中,多态性可以通过继承和接口实现。
多态能够提高代码的灵活性和可扩展性。
5. 关联关系:关联关系用于描述对象之间的联系。
常见的关联关系有聚合关系和组合关系。
聚合关系表示整体和部分之间的关系,整体对象包含部分对象但部
分对象可以独立存在;组合关系表示整体对象包含部分对象,部分对象无法独立存在。
6. 接口:接口是一种抽象的数据类型,它定义了一组方法的规范,而不需要给出具体的实现。
接口可以被多个类实现,通过接口可以实现对象的多态性和松耦合。
以上是一些常见的面向对象设计方法,它们可以帮助开发人员以模块化、灵活和可扩展的方式设计和构建软件系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象分析
2.建立对象模型
确定类与对象
分析类与对象之间的关系 类名 类库 属性 库名,类条目列表 方法 插入条目,删除条目,存储,读出类库
类条目
父类
类名,父类列表,成员函数列表,数据 设置更新类名,添加,删除和更改父 成员列表 类,成员函数,数据成员
父类的名字,访问权,虚基类标志
成员函数 函数名,访问权,虚函数标志,返回值 类型,参数,函数代码 数据成员 数据名,访问权,数据类型 用户
数据管理
6.6 设计数据管理子系统
● 数据库 ● 类和关联映射到数据库表
数据管理
6.6 设计数据管理子系统
● 数据库 ● 类和关系映射到数据库表
数据管理
6.6 设计数据管理子系统
● 数据库 ● 类和关系映射到数据库表
数据管理
6.6 设计数据管理子系统
● 数据库 ● 类和关系映射到数据库表
数据管理
Hale Waihona Puke ● 层次组织把软件系统组织成一个层次系统,每层是一个子系统。每一层内 所包含的对象,彼此间相互独立,而处于不同层次上的对象,彼此 间往往有关联(客户—供应商关系)。分成:封闭式和开放式。
● 块状组织
把软件系统垂直地分解成若干个相对独立的、弱耦合的子系统, 一个子系统相当于一块,每块提供一种类型的服务。 用户界面子系统 数据查询子系统
6.6 设计数据管理子系统
● 数据库 ● 设计相应的服务 被存储对象需要知道访问哪些数据库表,怎样访问所需行,检索对象, 更新对象,ObjectServer类(通知对象保存自身,检索已存储对象)
类中服务
6.7 设计类中的服务
● 确定类中应有的服务 综合考虑对象模型、动态模型和功能模型,动态模型中对象的行为以及功 能模型中的用例,转换成由适当的类所提供的服务 ● 设计实现服务的方法 设计实现服务的算法 算法复杂度 容易理解与容易实现 易修改 选择数据结构 定义内部类和内部操作
优化
6.9 设计优化
● 确定优先级 系统的各项质量指标并不是同等重要的,设计人员必须确定各项质量 指标的相对重要性(即确定优先级),以便在优化设计时制定折衷方案
● 提高效率的几项技术 增加冗余关联以提高访问效率 调整查询次序 保留派生属性
优化
假设公司有2000雇员,平均每名雇员会10种技能,则查找会讲英语的所有 雇员需要遍历2000雇员,对每个雇员遍历10个技能。
人机交互
6.4 设计人机交互子系统
在面向对象分析中已经对用户界面进行了初步分析,在面向对象设计 中,需要确定人机交互的细节。 ● 分类用户 按技能水平分类(新手/初级/中级/高级)。 按职务分类(总经理/经理/职员)。 按所属集团分类(职员/顾客)。 ● 描述用户 应该仔细了解将来使用系统的每类用户的情况,把获得的下列各项 信息记录下来。 · 用户类型。 · 使用系统欲达到的目的。 · 特征(年龄、性别、受教育程度、限制因素等)。 · 关键的成功因素(需求、爱好、习惯等)。 · 技能水平。 · 完成本职工作的脚本。
面向对象分析 1.需求陈述 简化的C++类库管理系统需求描述: 管理用C++语言定义的类 用户能够方便地向类库中添加新类,并建立新类与库中原有类的关系
用户能够通过类名从库中查询出指定的类
用户能够查看或修改与指定类有关的信息(数据成员,成员函数等) 用户能够从类中删除指定的类
用户能够在浏览窗中方便、快速地浏览当前类的父类和子类
建立索引,添加一个额外的限定关联”精通语言”,就可立即查询到精通某种 语言的雇员。只给经常执行并且开销大,命中率低的查询建立索引。
优化
6.9 设计优化
● 提高效率的几项技术
增加冗余关联以提高访问效率
调整查询次序
保留派生属性
假设希望找出既会说英语又会说日语的所有雇员,公司有200雇员会讲英语, 5人会讲日语,则先查找会讲日语的人,然后再从这些人中查找会讲英语的人。
第六章
6.1 概述
面向对象设计
6.6 设计数据管理子系统
6.2 系统分解
6.3 设计问题域子系统 6.4 设计人机交互子系统 6.5 设计任务管理子系统
6.7 设计类中的服务
6.8 设计关联 6.9 设计优化 6.10 例子
概述
6.1 概述
● 任务
● 根据已经建立的分析模型,运用面向对象的技术,进行系统 的软件设计。
● 设计人机交互类
任务管理
6.5 设计任务管理子系统
●分析并发性 如果两个对象彼此间不存在交互,或者它们同时接受事件,则这两个 对象在本质上是并发的。将若干非并发的对象归并到一条控制线中。 控制线:一条遍及状态图集合的路径,在这条路经上每次只有一个对 象是活动的。用任务(进程)实现控制线。
●设计任务管理子系统 确定各类任务(事件驱动型任务、时钟驱动型任务、优先任务、关键 任务和协调任务等)并把任务分配给适当的硬件或软件去执行。
人机交互
6.4 设计人机交互子系统
● 设计命令层次 (1) 研究现有的人-机交互含义和准则 (2) 确定初始的命令层次 (3) 精化命令层次 · 次序:将常用服务放在最前面,或按照用户习惯的工作步骤排序 · 整体—部分关系:寻找服务中存在的这种模式,以便分组组织服务 · 宽度和深度:命令层次的宽度和深度都不宜过大 · 操作步骤:用尽量少的操作来表达命令,为高级用户提供快捷操作
关联
6.8 设计关联
● 关联的遍历 单向遍历和双向遍历 ● 实现单向关联 用属性实现单向关联
(a)关联 (b)实现 设置雇主作为雇员的属性(成员变量)
关联
6.8 设计关联
● 实现双向关联 只用属性实现一个方向的关联,当需要反向遍历时就执行一次 正向查找。
两个方向的关联都用属性实现。
用独立的关联对象实现双向关联。
server subsystem contract
request
peer subsystem request contract contract peer subsystem
总的说来,单向交互比双向交互更容易理解,也更容易设计和修改,因 此应该尽量使用客户—供应商关系。
系统分解
6.2 系统分解
● 组织系统的方案
1+
拥 有
用户
*
* 父类
名字 访问权 虚基类标志
6.10 实例
面向对象设计 设计类库结构 设计问题域子系统 设计人机交互子系统 设计其他类
两种可把类条目组织成类库的数据结构: 二叉树
链表
6.10 实例
面向对象设计 设计类库结构 设计问题域子系统 设计人机交互子系统 设计其他类
对对象模型做补充和细化 类条目(ClassEntry) 类库(ClassEntryLink) 父类(ClassBase)、成员函数(ClassFun)和数据成员(ClassData) 类条目缓冲区(ClassEntryBuffer) 当前处理的类,增加了用于与窗口或类链交换数据的成员函数
OOA阶段建立的类库管 理系统对象模型
类条目 类名 父类列表 成员函数列表 数据成员列表 设置类名 添加父类 删除父类 更改父类 添加成员函数 删除成员函数 更改成员函数 添加数据成员 删除数据成员 更改数据成员
类库
库名 类条目列表 插入类条目 删除类条目 存储类库 读出类库 类条目 类名 父类列表 成员函数列表 数据成员列表 设置类名 添加父类 删除父类 …… * 成员函数 函数名 访问权 虚基类标志 返回值类型 参数 代码 * 数据成员 数据名 访问权 数据类型
优化
6.9 设计优化
● 调整继承关系 抽象与具体 一般先创建一些具体用途的类,然后归纳出通用类,再根据需要 派生出具体类,持续不断的演化过程
为提高继承程度而修改类定义
如果在一组相似的类中存在公共的属性和行为,则抽取出来放在 一个共同的祖先类中;有时现有类的属性和行为相似但不相同, 需要对类的定义稍加修改,才能进行抽取。
典型的面向对象的设计模型
系统分解
6.2 系统分解
● 子系统间交互方式
● 客户—供应商关系(Client_supplier)
作为客户的子系统调用作为供应商的子系统,后者完成某些服务 工作并返回结果。
● 平等伙伴关系(peer_to_peer)
每个子系统都可以调用其他子系统。
request
client subsystem
(1) 确定事件驱动型任务 是由事件驱动的,可能主要完成通信工作。事件通常表明某些数据 到达的信号。 (2) 确定时钟驱动型任务 每隔一定时间间隔就被触发以执行某些处理。例如,某些设备需要 周期性地获得数据。
(3)确定优先任务
优先任务可以满足高优先级或低优先级的处理需求。 · 高优先级:某些服务具有很高的优先级,为了在严格限定的时间内 完成这种服务,可能需要把这类服务分离成独立的任务。 · 低优先级:有些服务是低优先级的,属于低优先级处理(通常指那些 背景处理)。设计时可能用额外的任务把这样的处理分离出来。 (4) 确定关键任务 关键任务是有关系统成功或失败的关键处理,这类处理通常都有严格的 可靠性要求。在设计中可能需要用额外的任务将这样的处理分离出来。
(a)先创建一些具体类 (b) 归纳出抽象类; (c) 进一步具体化; (d)再次归纳 设计类继承的例子
6.10 实例 例1 C++类库管理系统的分析与设计
面向对象分析 需求陈述 建立对象模型 确定类与对象
分析类与对象之间的关系
面向对象设计 设计类库结构 设计问题域子系统 设计人机交互子系统 设计其他类
关联;
实现
关联
6.8 设计关联
● 实现双向关联 只用属性实现一个方向的关联,当需要反向遍历时就执行一次 正向查找。
两个方向的关联都用属性实现。