第10章 面向对象设计
ch10面向对象的设计方法
《边界》 命令窗口
34
命令窗口
2020/11/17
10章 面向对象的设计方法
《控制》
⑶控制类(设计阶段) 用例管理
用例管理
➢控制类:在边界类和实体类中间起协调作用的类, 在域层和可视层之间起开关控制的作用(它包含 了事件的应用逻辑或业务规则)。
➢它负责从边界类对象获取信息,然后发送到适当 的实体类对象,就像是域层和可视层之间的一个 开关或控制器。
➢如果参与者是一个类,也 execute Query( ) 可给其添加属性和操作。 get Connection( )
参与者及其操作
28
2020/11/17
10章 面向对象的设计方法
构造型用《》符号描述
➢域模型展现用户工作环境下的情况及它们间的联 系,类不是特指软件类。创建设计类图,则要定 义软件类。
➢基于一个已存在的模型元素定义一种新的 模型元素。
➢可应用于所有的模型元素(类、节点、组 件、关系、包、操作)
27
2020/11/17
10章 面向对象的设计方法
例:参与者的三种表示形式
Actor
Icon形式
Actor
Label形式
Actor
Decoration形式
➢参与者可用构造型表示。
《Actor》 Bill System
⑴创建设计类图的基础版本,或初步模型:包含 属性名称等基本信息,以便用来设计交互图。
⑵开发交互图,即为每一个用例产生一个交互图: 其决定哪些对象一起工作,及怎样协同工作。 (系统设计的核心)。
⑶根据开发交互图时得到的信息,返回设计类图 并开发方法名称(可视化和特征信息是在设计类 图的迭代中被修改的)。
4
第10章 面向对象分析
第10章 面向对象分析
第10章 面向对象分析
• 面向对象软件开发技术
– 面向对象分析(OOA) – 面向对象设计(OOD) – 面向对象实现(OOP)
面向对象技术是一个有全新概念 的开发模式,其特点是:
(1)方法是对软件开发过程所有阶段进 行综合考虑而得到的; (2)从生存期的一个阶段到下一个阶段 所使用的方法与技术具有高度的连 续性;
取消交易
顾客可在按下选择键前任何一个时刻,拉动退币杆取 消交易收回硬币。
自动售货系统系统
-端1 * -端2
自动售货系统::售货
*
顾客
-端2
-端1 *
自动售货系统::供货
*
供货人
-端1 * -端2
自动售货系统::取货款
*
收银员
自动售货系统系统
-端1 *
-端2
售货
*
<<extends>>
售散装饮料
顾客
• 业务中的执行者扮演什么角色?这些角色可以 看作类,如客户、操作员等。
(2)筛选对象类,确定最终对象类 我们可以用以下选择特征来确定最终的对象: 1) 保留的信息:仅当必须记住有关潜在对象的 信息,系统才能运作时,则该潜在对象在分 析阶段是有用的; 2) 需要的服务:潜在对象必须拥有一组可标识 的操作,它们可以按某种方式修改对象属性 的值; 3) 多个属性:在分析阶段,关注点应该是“较 大的”信息(仅具有单个属性的对象在设计 时可能有用,但在分析阶段,最好把它表示 为另一对象的属性);
定义服务
• 对象=属性+操作(服务) • 因为在动态模型和功能模型中更明确地描 述了每个类中应该提供哪些服务,所以在 建立了这两个模型后才能最终确定类中应 有的服务。 • 事实上,在确定类中应有的服务时,既要 考虑该类实体的常规行为,又要考虑在本 系统中特殊需要的服务。
软件工程-第十章面向对象的设计方法
2
面向对象的设计方法
第十章 面向对象的设计方法
本章采用基于UML的面向对象设计方法将分析模 型转换为设计模型。
面向对象的分析模型主要由顶层架构图、用例与用 例图、领域概念模型构成。
设计模型则包含以包图表示的软件体系结构图,以 交互图表示的用例实现图,完整、精确的类图,以 及针对复杂对象的状态图、用以描述流程化处理过 程的活动图等。
协作图的布局规则
控制类位于中心
主动执行者和作为用户界面的边界类位于左上方
作为外部接口和环境隔离层的边界类位于右上方
辅助类和实体类分别位于控制类的左下、右下方。
2021/3/27
国防科技大学计算机学院
11
协作图
10.1设计用例实现方案
虽然协作图不强调消息传递的时间序,但借助于 序列号可以表达时间序,序列号较大的消息发生较 晚。
消息序列号可以采用线性编号,但采用适当的多 级编号会使消息之间的结构关系更清晰。
如果一个对象在消息的交互过程中被创建,则可 在对象名称之后标以{new}。类似地,如果一个对象 在交互期间被删除,则可在对象名称之后标以 {destroy}。
2021/3/27
国防科技大学计算机学院
3
面向对象的设计方法
第十章 面向对象的设计方法
处理转换过程的任务
(1) 针对分析模型用例,设计用UML交互图表示的实 现方案。
(2) 设计技术支撑设施。在大型软件项目中,往往需 要一些技术支撑设施来帮助业务需求层面的类或子 系统完成其功能。这些设施本身并非业务需求的一 部分,但却为多种业务需求的实现提供公共服务, 例如,数据的持久存储服务、安全控制服务、远程 访问服务等。在面向对象设计中,需要研究这些技 术支撑设施的实现方式以及它们与业务需求层面的 类及子系统之间的关系。
《面向对象设计》PPT课件
类及其依赖性
1. 类
在面向对象的程序设计中,类和接口是程序的基本组成单 元。 一个典型程序需要界面类专门负责表示用户界面信息, 需要数据库类负责与数据库进行交互,需要有业务逻辑类 负责算法计算等。 在计算机程序中,要设计和实现的所有类都具有唯一的 名字,在不同的阶段或从不同的角度可以将它们称为设计 类、实现类、系统类、应用类等。
类及其依赖性
2.继承依赖性
依赖性管理中最棘手的问题是由于继承所引起的依赖 性。继承是一种在父类和子类之间共享属性和行为的方式, 所以运行时可以用一个子类对象代替其父类对象。程序中凡 是使用父类对象的地方,都可以用子类对象来代替。一个子 类对象是一种特殊的父类对象,它继承父类的所有特征,同 时它又可以覆盖父类的方法,从而改变从父类继承的一些特 征,并可以在子类中增加一些新的功能。这样,从客户的角 度看,在继承树中为请求提供服务的特定对象不同,系统的 运行行为可能会有所不同。
类及其依赖性
(1)多态继承 根据为请求提供服务的对象不同可以得到不同的行为,这
种现象称为多态。在运行时对类进行实例化,并调用与实例 化对象相应的方法,称为动态绑定、后期绑定或运行时绑 定。相应地,如果方法的调用是在编译时确定的,则称为是 静态绑定、前期绑定或编译时绑定。
多态并不是伴随着继承而出现。如果在子类中不覆盖父类 中的任何方法,就不会产生多态行为。
二是如果确实需要创建新类,则在设计这些新类的协议时, 应该考虑将来的可重复使用性。
10.2 体系结构模块及依赖性
体系结构设计描述了建立计算机系统所需的数据结构和程 序构件。一个好的体系结构设计要求软件模块的分层及编 程标准的执行。
第10章-面向对象设计PPT课件
第10章 面向对象设计
3
教学重点
⒈架构设计的概念和原则; ⒉常用的架构摸式; ⒊详细设计原则和设计内容; ⒋设计模式。
教学难点
⒈架构设计的概念; ⒉常用的架构摸式; 3.详细设计原则和设计内容。
目录 首页 上页 下页 末页
第10章 面向对象设计
4
10.1 架构设计
一、软件架构与框架
(1)什么是软件架构 软件架构是一种思想,一个系统蓝图,对软件结构组
目录 首页 上页 下页 末页
第10章 面向对象设计
15
10.1 架构设计
四、常用的架构模式
2.黑板模式
黑板模式的思想是,有一系列独立的模块,或者说是 方案,这些方案能解决部分问题的一部分,这些方案进行 协作,使得问题问题能够最终解决。这就像一群人在一 块 黑板前,共同解决一个问题,根据当前问题解决的程度 和状态,不同的人上前到黑板上解决他所能解决的部分, 这样经过多人的协作,最终能够将问题解决。这就是 黑板 模式这个名字的来历。黑板模式的实现分为三个主要的组 件:黑板(Blackboard),知识源(Knowledge Source)和控制 (Control)。。如图下所示。
目录 首页 上页 下页 末页
第10章 面向对象设计
19
• 这种构架具有以下优点:
• 可以创建具有良好隐蔽性和高内聚、低耦合的构件。
• 设计者可以将整个系统的输入/输出行为看成是多个过 滤器行为的简单合成。
第10章 面向对象设计
1
第10章 面向对象设计
10.1 架构设计 10.2 详细设计 10.3 设计模式
目录 首页 上页 下页 末页
第10章 面向对象设计
2
教学目的与要求
面向对象设计
面向对象设计面向对象设计是一种软件开发方法,它将现实世界中的事物抽象为对象,并通过定义对象的属性和方法来描述其特征和行为。
面向对象设计的核心思想是将系统组织为一系列相互协作的对象,每个对象都有自己的状态和行为,并且可以通过消息传递来与其他对象进行交互。
面向对象设计具有以下优点:1. 模块性:面向对象设计将系统分解为多个独立的对象,每个对象负责一部分功能。
这种模块化的设计使得系统易于维护和扩展。
2. 可重用性:面向对象设计鼓励通过继承和多态来实现代码的重用。
通过定义通用的父类和子类的特殊化实现,可以在不改变现有代码的情况下添加新功能。
3. 灵活性:面向对象设计可以应对需求的变化。
由于每个对象都相对独立,因此可以更容易地修改或替换单个对象,而不会影响到整个系统。
4. 可理解性:面向对象设计使用自顶向下的抽象思维模型,将现实世界的复杂性抽象为简单的对象和类的关系,使得系统的结构更加清晰可理解。
为了更好地应用面向对象设计,我们需要遵循一些基本原则和模式:1. 单一职责原则(SRP):一个类应该只有一个引起它变化的原因。
每个类都应该有一个清晰而独立的责任范围,这样可以提高代码的可维护性。
2. 开放封闭原则(OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
通过利用接口、抽象类和多态,可以在不改变现有代码的情况下添加新功能。
3. 里氏替换原则(LSP):子类对象可以替换父类对象,并且其行为不会改变。
这个原则确保继承关系的正确性,避免了代码的混乱和错误。
4. 接口隔离原则(ISP):客户端不应该依赖于它不需要的接口。
接口应该尽可能小,具体到客户端的需求,避免了不必要的代码依赖。
5. 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
抽象类和接口在面向对象设计中起到了关键的作用,通过它们来定义高层模块和低层模块之间的关系。
除了以上原则,还有一些常用的面向对象设计模式,例如单例模式、工厂模式、观察者模式等。
第10章 C++语言的输入与输出-面向对象程序设计(C++语言)(第二版)-程磊-清华大学出版社
设置状态标志flags 清楚状态标志,并返回前状态标志 测试状态标志 设置标志flags, 并返回前状态标志 返回当前的宽度设置值 设置域宽w,返回以前的设置 设置小数位数p,返回以前的小数位数 返回当前的填充字符 设置填充字符ch,返回当前的填充字符
13
下面分别介绍这些成员函数的使用方法;
(1)设置状态标志:
cout<<”x_width=”<<cout.width( )<<endl; cout<<”x_fill=”<<cout.fill ( )<<endl; cout<<”x_precision=”<<cout.precision( )<<endl; cout<<123<<” ”<<123.45678<<endl; cout<<”______________________________\n”; cout<<”*** x_width=10,x_fill=, x_precision=4 ***\n”; cout.width(10); cout.precision(4); cout<<123<<” ”<<123.45678<<” ”<<234.567<<endl;
1. C++的流概述 ❖ 在C++中,输入输出流被定义为类,称为流类。 ❖ I/O 系 统 仍 然 是 以 字 节 流 的 形 式 实 现 的 , 流
(Stream)实际上就是一个字节序列,流总是 与某一设备相联系的,它既可以从输入设备 (如键盘、磁盘等)流向计算机内存,亦可以 从计算机内存流向输出设备(如显示器、打印 机、磁盘等)。 ❖ 输入输出的字节可以是ASCII字符、内部格式 的原始数据、图形图像、数字音频、视频等。
面向对象设计
面向对象设计面向对象程序由对象组成,对象包括数据和对数据进行操作的过程(通常称为方法)。
面向对象设计最困难的部分是将系统分解成对象集合。
因为要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、扩展、复用等等,并且这些因素通常还是互相冲突的。
那么科学地对实体进行分解,合理地设计类与类、对象与对象之间的依赖关系的是至关重要的。
1. 面向对象七大设计原则•单一职责原则:设计目单一的类;•开闭原则(OCP):对扩展开放(对提供方),对修改封闭(对使用方)。
用抽象构建框架,用实现扩展细节。
o当软件需要变化时,尽量通过扩展来实现,而不是通过修改原有的方法。
•里氏替换原则:子类可以对父类进行扩展,但不能改变父类原有功能;o子类尽可能不重写父类的非抽象方法,继承实际是让两个类的耦合性增强了。
运用里氏替换原则可以将父类设计为抽象方法或者接口,让子类继承父类或实现接口,并实现父类中的抽象方法,尽量不要重写父类的非抽象方法。
•依赖倒置原则:要依赖于抽象,而不是具体的实现;针对接口编程;o依赖倒置的三种方式:构造器、接口、set方法;•接口隔离原则:使用多个专门的接口比使用单一的总接口要好;(接口的单一职责,尽量使用最小接口)o即接口的定义要尽量实现单一职责,子类不应实现自己不需要的方法。
同时也要注意接口的粒度,接口不能过小,过小会导致接口泛滥,不利于代码维护。
•组合重用原则:要尽量使用组合/聚合,而不是继承来达到重用的目的;•迪米特法则(最少知识法则):一个对象应当对其他对象尽可能少的了解;2. 设计模式(一)设计模式的基本概念设计模式:是对软件设计中普遍存在的(反复出现)的问题,所提出的解决方案。
主要关注软件系统的设计,与具体实现语言无关;•架构模式:软件设计中的高层决策(如C/S架构就属于架构模式);•惯用法:与语言相关,是最底层的模式,关注软件系统的设计与实现,实现时通过特定的编程语言来描述构件与构件之间的关系。
面向对象设计
面向对象设计面向对象设计(Object-oriented design,简称OOD)是一种软件设计方法,强调将现实世界中的事物抽象成对象并建立对象间的关系来解决问题。
面向对象设计是面向对象编程(OOP)的基础,它通过封装、继承和多态等机制,提供了一种灵活、可扩展和易于维护的软件设计方法。
面向对象设计的基本原则是封装、继承和多态。
封装将数据和操作封装在一个对象中,通过接口暴露对象的行为,隐藏内部实现细节。
继承通过派生新的类扩展或修改现有类的功能,提高代码的复用性和扩展性。
多态通过定义一组相同的接口,不同的对象可以根据自身的类型实现不同的行为,提高代码的灵活性和扩展性。
在面向对象设计中,首先要分析问题,确定问题空间中的对象及其关系。
然后,根据对象的属性和行为,设计对象的类。
类是对象的抽象,包含了对象的属性和方法。
接着,定义对象间的交互方式和协作关系,包括对象之间的消息传递和方法调用。
最后,实现类的具体代码,通过创建对象、调用对象的方法来解决问题。
面向对象设计有许多优点。
首先,它提供了一种自然的方式来描述问题空间,使得软件设计更加直观和易于理解。
其次,面向对象设计具有高内聚、低耦合的特点,可以减少软件的复杂性,提高代码的可维护性和可扩展性。
此外,面向对象设计也能够提高代码的重用性,通过继承和多态的机制,可以更好地复用已有的代码。
然而,面向对象设计也存在一些挑战。
首先,面向对象设计需要进行全局的系统分析和设计,涉及多个对象和类的交互,需要耗费大量的时间和精力。
其次,面向对象设计需要合理地划分对象和类的职责,避免出现职责不清晰和耦合度过高的情况。
最后,面向对象设计需要谨慎地选择继承和多态的使用方式,以避免出现冗余的代码和复杂的继承关系。
综上所述,面向对象设计是一种强调对象和类的关系和交互的软件设计方法,通过封装、继承和多态等机制,提供了一种灵活、可扩展和易于维护的软件设计方法。
面向对象设计能够提高代码的可维护性、可扩展性和重用性,但也需要进行全局的系统分析和设计,并且需要合理地划分职责和选择继承和多态的使用方式。
第10章05(面向对象设计)精品PPT课件
用UML建模
▪ 最后,模型被实现为某种原型,用于评估实际方案中的所有 不足之处。这些不足包括功能遗漏、性能低劣或开发费用太 高。如果出现这些不足,开发人员应该返回到相应的步骤, 以消除它们。如果问题比较严重,那么开发人员可能不得不 返回到最初的集体讨论和草案拟定阶段,重新开始上述过程。 如果问题比较小,那么开发人员或许只需要改变部分组织结 构或模型的规格说明就可以了。这里,应注意,在完成了一 个UML图的绘制之后,并不能立即着手进行建立原型这一步 工作,而是应该在多个UML图可以一起建立原型时才能够开 始进行这项工作。这种原型可以是临时利用的东西,用完就 可丢弃,它仅仅是为了评估才建立的;如果建立原型这一步 是成功的,那么它就成为系统实际开发过程中的一个迭代过 程。
在图10.3中(P234)“1.1 msg2”表明msg2是“对象 1”为了处理“1.msg1”而发送的第一条消息;“1.2msg4” 表明msg4是“对象1”为了处理“1.msg1”而发送的第二 条消息;“1.1.1msg3”表明msg3是“对象2”为了处理 “1.1msg2”而发送的第一条消息依此类推。
消息类型注解 ▪ 在UML图中,简单消息和同步消息可以组合成一条线,线的
一端是同步消息箭头,而另一端则是简单消息的返回箭头。 这表明控制的返回实际上是非常快捷的(在操作调用之后几 乎马上返回)。
图3 消息类型注解
10.1.2 协作图
功能: 协作图用于描述相互合作的对象间的交互关系和 链接关系。
面向对象设计
面向对象的设计概述OOA和OOD之间有紧密的衔接关系,从OOA到OOD是一个慢慢扩充模型的进程。
分析处置以问题为中心,能够不考虑任何与特定运算机有关的问题,而OOD 那么把咱们带进了面向运算机的“实地”开发活动中去。
通常,OOD分为两个时期,即高层设计和低层设计。
高层设计成立应用的体系结构。
低层设计集中于类的详细设计。
(1) 高层设计高层设计时期开发软件的体系结构,构造软件的总体模型。
在那个时期,标识在运算机环境中进行问题解决工作所需要的概念,并增加了一批需要的类。
这些类包括那些可使应用软件与系统的外部世界交互的类。
现在期的输出是适合应用软件要求的类、类间的关系、应用的子系统视图规格说明。
通常,利用面向对象设计取得的系统框架如图所示。
①高层设计模型一个典型的高层设计模型即客户-效劳器模型,它构造起应用软件的整体模型,那个模型导出的体系结构既可在进程性系统中利用,又可在面向对象的系统中利用。
客户-效劳器模型的方式是让系统的一个部份(效劳器子系统)提供一组效劳给系统的另一个部份(客户子系统)。
请求效劳的对象都归于客户子系统,而同意请求提供效劳的部份确实是效劳器。
图 OOD设计导出的体系结构②高层设计的规那么▪最小化各构件间的通信:在子系统的各个高层构件之间的通信量应当达到最小。
一个用户界面应当能够自行处置交互、错误更正和硬件操纵,而不需打搅主应用。
▪隐藏复杂性:子系统应当把那些成组的类打包,形成高度的内聚。
▪逻辑功能分组:尽管输入和输出设备可能彼其间不通信,但逻辑上把它们归组到一个处置输入/输出的子系统中。
如此比较容易识别并定位问题论域中的事件。
类与通过概念封装的子系统十分类似。
事实上,每一个子系统都能够被当做一个类来实现,那个类聚集它的构件,提供了一组操作。
类和子系统的结构是正交的,一个单个类的实例可能是不止一个子系统的一部份。
高层设计时期增加了一批必要的类,要紧包括了那些可使应用软件与系统的外部世界交互的类。
软件工程 第10章 面向对象的方法
第10章例题分析与解答作者:不详来源:2006年9月4日发表评论进入社区一、填空题1.面向对象方法认为系统是由应用域的___对象___组成。
2.对象具有状态,描述对象的状态用它的_属性值_____。
3.对象的抽象是_类_____。
4.类之间有两种结构关系,它们是分类关系和__组装____关系。
5.面向对象程序设计语言与其他程序设计语言的最主要差别是它具有_继承性_____。
6.动态模型描述了系统的__动态行为____。
二、选择题1.火车是一种陆上交通工具,火车和陆上交通工具之间的关系是( D)关系。
A.组装B.整体成员C.has aD.一般具体2.面向对象分析阶段建立的三个模型中,核心的模型是( C )模型。
A.功能B.动态C.对象D.分析3.对象模型的描述工具是( C)。
A.状态图B.数据流图C.对象图D.结构图4.在有多重继承的类层次结构中,它的类层次结构是(B )层次结构。
A.树型B.网状型C.环型D.星型5.描述类中对象的行为,反映了状态与事件关系的是( B )。
A.对象图B.状态图C.流程图D.结构图6.在确定属性时,所有( C)是候选的属性。
A.动词B.名词C.修饰性名词词组D.词组三、应用题1.建立窗口系统的对象模型。
问题陈述如下:窗口分为对话窗、图形窗、滚动窗三种;对话窗中有若干对话项,由唯一的项名字来确定,对话项分为按钮、选择项、正文项三种,选择项中有若干对话项入口;图形窗中有若干形状元素,形状元素分为一维形状和二维形状,一维形状又分为直线、圆弧、折线;二维形状分为圆、椭圆、矩形、多边形,其中多边形和折线由若干有序顶点组成,正文窗是滚动窗的一种,而图形滚动窗既是一种图形窗又是一种滚动窗。
2.在学校教学管理系统中,学生查询成绩就是系统中的一次交互,请用状态图来描述这种查询的交互行为。
答案:一、填空题1.对象2.属性值3.类4.组装5.继承性6.动态行为二、选择题1.D2.C3.C4.B5.B6.C三、应用题1.2.第10章自测题及参考答案作者:不详来源:2006年9月1日发表评论进入社区一、名词解释1.对象2.类3.属性4.操作5.消息6.消息传递7.方法8.关系9.关联10.一般具体关系 11.整体部分关系12.继承13.单重继承 14.多重继承15.多态性 16.角色17.受限关联 18.封装19.对象模型20.动态模型21.功能模型 22.事件23.状态24.事件追踪25.状态图26.动作27.活动28.处理29.数据流30.动作对象31.数据存储对象 32.重用性二、填空题1.对象具有封装性,实现了__数据与操作____的结合。
第10章面向对象设计
第10章 面向对象设计
(3) 明确精练的定义。如果一个类的任务简单了,则它的 定义就明确精练了,通常任务简单的类可用几个简单语句描述。
(4) 简化对象间的通信。每个对象应该独立完成任务。也 就是说,对象在完成任务时,尽量不要依赖于其他对象的配合 (帮助),对象之间过多的依赖会破坏类设计应该尽量小而简单,便于开发和管理。定义很大的 类,它所包含的属性和服务相对就多,会给开发和使用带来困 难。实践表明,简单类一个类的定义在50行左右(或两屏)。简 单类可按照下列的策略定义。
(1) 避免包含太多的属性。一个类包含的属性多少将决定 类的复杂程度。一个类包含太多的属性表明该类过于复杂了, 因此,就可能有过多的作用在这些属性上的服务。
虽然,遵循上述设计策略能设计出明确精练的较小的类, 但在开发大型软件系统中,必定会有大量较小的类设计出来, 这将会导致类间的通信变复杂。采用划分“主题”的方法,可 以解决这个问题。
第10章 面向对象设计
4. 设计简单的协议 消息中的参数越多表示对象之间传递的消息越复杂,同样 表明对象之间的依赖关系越复杂,即对象间的耦合度越高。一 般来说,简单消息中的参数不要超过三个。过多的参数会导致 对象的修改较复杂,因为对一个对象的修改往往导致其他对象 的修改。
第10章 面向对象设计
6. 可重用
在面向对象设计中,一个类的设计应该具有通用性,为开 发相似的系统提供软件重用可能。软件重用可以提高软件开发 生产率,确保目标系统质量。可重用是面向对象开发方法的一 个重要特性,也就是说,用面向对象的概念和方法比较容易实 现重用。因此,在软件开发过程中,为了实现重用,既要尽量 重用已有的类,又要创建可重用的新类。
软件工程——10.面向对象的设计
软件工程——10.面向对象的设计软件工程——10、面向对象的设计在软件工程领域,面向对象的设计(ObjectOriented Design,简称OOD)是一种重要的方法,它为我们构建复杂、可维护和可扩展的软件系统提供了有力的支持。
面向对象的设计核心在于将现实世界中的事物和概念抽象为对象,并通过对象之间的交互来实现系统的功能。
这一方法使得软件系统更贴近现实,更容易理解和维护。
首先,让我们来谈谈对象的概念。
在面向对象的世界里,对象是具有特定属性和行为的实体。
比如说,一辆汽车可以被视为一个对象,它具有颜色、型号、速度等属性,同时还具有启动、加速、刹车等行为。
通过将复杂的系统分解为一个个相互独立又相互协作的对象,我们能够更好地管理系统的复杂性。
类是对象的模板,它定义了对象的属性和行为。
多个具有相似特征和行为的对象可以归为一个类。
例如,所有的汽车都可以属于“汽车”这个类。
类的存在使得我们可以方便地创建和管理对象,同时也促进了代码的复用。
在面向对象的设计中,封装是一个重要的原则。
它将对象的属性和行为封装在一起,外部只能通过定义好的接口来访问对象的内部状态。
这样做不仅提高了代码的安全性,还降低了模块之间的耦合度。
比如说,我们不需要知道汽车内部发动机的具体工作原理,只需要通过踩油门和刹车踏板等操作来控制汽车的行驶。
继承是另一个关键概念。
通过继承,子类可以继承父类的属性和方法,并在此基础上进行扩展和修改。
这大大减少了代码的重复,提高了开发效率。
例如,跑车是汽车的一个子类,它继承了汽车的基本属性和行为,同时又具有自己独特的加速性能和外观特点。
多态性则使得同一个方法在不同的对象上可以有不同的实现。
这增加了代码的灵活性和可扩展性。
比如,不同类型的汽车在刹车时的具体表现可能会有所不同,但它们都实现了“刹车”这个方法。
在进行面向对象的设计时,我们需要清晰地定义对象之间的关系。
常见的关系有关联、聚合和组合。
关联表示对象之间的简单联系,比如学生和课程之间的关联。
cc程序设计第10章面向对象程序设计课件
void Work ( int days ) // 函数重载
{ cout << name << "已经工作了" << days << "天!" << endl ; }
};
10.3.2 类的成员函数
3. 带默认形参值的成员函数
#include <iostream>
#include <string>
using namespace std ; class Person { private :
}; double Circle:: Peri ( ) // 在类体外实现的函数
{ return 2 * 3.14 * r ; }
void main ( )
直接引用公有的成员
{ Circle c ;
c.r = 3.78 ; // 对数据成员 r 的写操作
cout << "圆的半径是:" << c.r << endl ; // 对数据成员 r 的读操作
函数的形参带 有默认值。
string name ; // 姓名
char sex ; // 性别
int age ;
// 年龄
public :
// …… …… // 其他成员函数省略
void Input ( string n = "zhang" , char se = 'F' , int a = 20 )
:: 域操作符
类外格式 函数的原型声明写在
类体中的格式同C中
对比 C中的函数声明:
的函数
返回值类型 函数名(参数表)
《面向对象程序设计》第10章在线测试
《面向对象程序设计》第10章在线测试剩余时间:59:51答题须知:1、本卷满分20分。
2、答完题后,请一定要单击下面的“交卷”按钮交卷,否则无法记录本试卷的成绩。
3、在交卷之前,不要刷新本网页,否则你的答题结果将会被清空。
第一题、单项选择题(每题1分,5道题共5分)1、throw后面的表达式不可以是()A、常量B、变量C、对象D、数组2、关于异常的说法,正确的是()A、异常就是错误B、有了异常处理机制,出现错误也没有关系C、异常在C++中以消息的形式传递D、程序中出现的错误都可以用catch块来捕捉处理3、关于catch(。
)的说法错误的是()A、catch(。
)可以捕捉所有类型的异常B、catch(。
)必须放在所有catch块的后面C、catch(。
)可以避免出现没有被捕捉的异常D、catch(。
)不能单独使用4、C++中异常处理的默认模式是()A、终止模式B、恢复模式C、挂起模式D、暂停模式5、关于重新抛出错误的说法是()A、重新抛出是指抛出原来的异常B、用throw语句再次抛出原来的异常C、只能在catch块中抛出D、重新抛出时不能改变异常信号的值第二题、多项选择题(每题2分,5道题共10分)1、关于异常处理的说法正确的是()A、将异常的检测与处理分离B、异常就是错误C、异常由函数调用引起D、在上层调用函数中使用try检测函数调用是否引发异常2、try子句的作用是()A、代码的保护段B、如果预料某段程序代码可能发生异常,就将该段代码放在try子句之后C、try子句产生异常D、try子句中的throw表达式产生异常3、catch子句的说法正确的是()A、catch子句后的复合语句是异常处理程序B、catch子句捕获throw表达式抛出的异常C、catch子句的异常类型说明只能是类型,不能是数值D、catch子句的异常类型不能是自定义类4、异常处理的执行过程是()A、程序执行try语句块内的保护段,如果发现异常则退出B、如果在try语句内的程序段抛出异常,程序控制转入try块后的catch块C、throw抛出的异常对象如果与catch子句异常类型的值一致,则执行对应的异常处理程序D、如果没有匹配的catch子句,自动调用terminate终止程序5、关于catch(…)语句的说法正确的是()A、catch(…)语句可以捕获任何异常B、catch(…)语句可以放在catch子句的任何位置C、catch(…)语句必须放在catch子句的最后D、catch(…)语句捕获空的异常第三题、判断题(每题1分,5道题共5分)1、异常(Exception)是程序运行过程中,由于环境变化、用户操作失误以及其它方面的原因而产生的运行时不正常的情况.正确错误2、抛出异常的模块只是报告某个地方存在错误,这个报告可以帮助异常处理器解决这个错误。
第十章面向对象设计
尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建 的类),
如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重 复使用性。
软件工程(Software Engineering)
沈阳工业大学信息科学与工程学院
魏东
Slide 5
10.2 启发规则
设计结果应该清晰易懂 一般\特殊结构的深度应适当 设计简单的类 使用简单的协议 使用简单的服务 把设计变动减至最小
在类或构件的协作时说明消息的细节 为每一个构件确定适当的接口 细化属性并且定义相应的数据类型和数据结构 详细描述每个操作中的处理流
4:说明持久性数据源(数据库和文件)并确定管理数据源所需要的 类
5:开发并且细化类或构件的行为表示 6:细化部署图以提供额外的实现细节 7:考虑每一个构件级设计表示,并且时刻考虑其他选择
软件工程(Software Engineering)
沈阳工业大学信息科学与工程学院
魏东
Slide 10
10.4构件级设计
基于类的构件设计原则
开闭原则(The Open-Closed Principle, OCP):模块应该对外延具有开放性 ,对修改具有封闭性。
替换原则(Subsitution Principle, SP):子类可以替换它们的基类。
一个类只有一个实例,并提供对该实例的全局访问
创造者模式如字符串建造者 StringBuilder
将一个复杂对象的创建与它们的表示分开
原型模式:如进程建造者ProcessBuilder
通过复制原型实例创建新的对象
软件工程(Software Engineering)
软件详细设计第10章面向对象设计
方法
选择设计模式的方法包括场景分析、问题识别和模式匹配。场景分析是对应用场景进行 深入理解,确定问题的范围和约束条件;问题识别是明确应用中的核心问题,找出问题 的本质;模式匹配是根据问题的特点,从已知的设计模式中选择最合适的一种或多种。
设计模式在面向对象设计中的实践案例
详细描述
类是对象的模板或蓝图,它描述了对 象的共同属性和方法。属性通常指的 是对象的状态,而方法则定义了对象 的行为。
对象的行为与关系
总结词
对象的行为是指通过类的方法来实现的特定操作,而对象之间的关系则描述了 不同对象之间的交互和通信。
详细描述
对象的行为是通过类中的方法来实现的,这些方法定义了对象可以执行的操作。 对象之间的关系可以是关联、聚合、组合或继承等,这些关系描述了对象之间 的依赖和交互。
提高软件可扩展性
提高软件健壮性
通过封装,可以更容易地添加新功能而不 影响现有代码,提高了软件的可扩展性。
封装可以隐藏内部实现细节,减少因误操 作或错误使用而导致的问题,提高了软件 的健壮性。
05
关联与聚合的设计
关联的定义与类型
关联的定义
关联是一种关系,表示两个或多个对象之间 的依赖或连接。
组合
表示整体与部分之间的关系,部分与整体之 间存在相同的生命周期。
软件详细设计第10章 面 向对象设计
• 面向对象设计概述 • 类与对象的设计 • 接口与抽象类的设计 • 封装与数据隐藏 • 关联与聚合的设计 • 依赖与注入的设计 • 设计模式在面向对象设计中的应用
01
面向对象设计概述
面向对象的基本概念
对象
现实世界中的事物或概念在软 件中的表示,具有状态和行为
软件工程――10面向对象设计PPT课件
《软件工程》
Software Engineering (An Introduction)
重用设计 把问题域专用类组合在一起 通过增添一般类而建立协议 调整继承的支持级别 改进性能 增加低层的类和对象
06.11.2020
J. Yu, 计算机学院
21
一.问题域部分的设计
调整继承的支持级别
如OOA的一般/特殊结构包括 多继承, 在使用只有单继承或 无继承性的编程语言时,需对 OOA的的结果进行修改。
06.11.2020
J. Yu, 计算机学院
37
OOD遵循的原则
(五)强内聚
2. 类的内聚性:设计类的原则是,一个 类应该只有一个用途,类中的属性和操作应 该全都是完成该类的任务所必需的,其中不 包括无用的属性和操作。如果某个类有多个 用途,通常应该把它分解成多个专用的类。
3.层次结构的内聚性:对象之间通过继承
06.11.2020
J. Yu, 计算机学院
32
OOD应遵循的原则
继承耦合:如果一个类出现以下两种情况:
– (1)一个类明显地拒绝了它的一般类中的许多 属性和服务,它和它的一般类之间就不是强耦 合的。
– (2)特殊类从它的一般类中继承了许多属性, 但是完全没有使用它们。
在这样两种情况下设计者都应寻找另外的一 般-特殊结构,使每个特殊类都继承并使用 其一般类中的属性和服务,使之高耦合。
从废弃 型开发
实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第10章面向对象设计
10.1 软件模块之间的依赖性可以从哪些角度和抽象层次进行分析?
在面向对象软件中,常见的软件模块有类、接口、包、构件。
因此,分析软件模块之间的依赖性就可以从类、接口、包和构件的角度和层次进行分析。
10.2 消除包之间循环依赖性的方法是什么?
本质上,两个包之间的依赖性来自于两个包中类之间的依赖性。
类之间的循环依赖性是个特别棘手的问题,好在大多数情况下可以通过重新设计避免循环依赖性。
具体方法是增加新包。
举例说明如下:
在下图中,包A依赖于包B,反过来包B又依赖包A,构成了循环依赖。
具体解决办法是:将包B依赖的包A中的元素从包A中分离出来,组成包C,使得包B不再依赖包A,而是依赖包C。
10.3 请给出构件的一般性定义,然后给出传统的软件工程环境及面向对象的软件工程环境中构件的定义,最后选择你熟悉的编程语言说明怎样定义一个构件。
软件构件是一种组装单元,它具有规范的接口规格说明和显式的语境依赖。
软件构件可以被独立部署,并由第三方任意组装。
OMG UML规范中将构件定义为“系统中某一定型化的、可配置的和可替换的部件,该部件封装了实现并暴露一系列接口”。
在传统的软件工程环境中,一个构件就是程序的一个功能要素,程序由处理逻辑和实现处理逻辑所需的内部数据结构以及能够保证构件被调用和实现数据传递的接口构成。
传统的构件也称为模块,是软件体系结构的一部分。
在面向对象的软件工程环境中,面向对象技术已达到了类级复用,而构件级复用则是比类级复用更高一级的复用,它是对一组类的组合进行封装(当然,在某些情况下,一个构件可能只包含一个单独的类),并代表完成一个或多个功能的特定服务,也为用户提供了多个接口。
一个构件可以是一个编译的类,可以是一组编译的类,也可以是其他独立的部署单元,如一个文本文件、一个图片、一个数据文件、一个脚本等。
选择你熟悉的编程语言说明怎样定义一个构件。
(略)
10.4 典型的面向对象设计模型在逻辑上由哪几部分组成?对每一部分进行设计时所包含的主要内容是什么?
典型的面向对象设计模型在逻辑上将系统划分为4个部分,分别是问题域部分、人机交互部分、任务管理部分及数据管理部分。
1)问题域部分的设计
在面向对象设计过程中,可能要对面向对象分析所得出的问题域模型进行补充或调整。
例如,调整需求、复用已有的类、把问题域类组合在一起、增添泛化类以建立类间的协议、调整继承的支持级别、改进性能等。
2)人机交互部分的设计
人机交互界面的设计质量直接影响到用户对软件的使用。
在设计阶段,必须根据需求把交互细节加入到用户界面设计中,包括人机交互所必需的实际显示和输入。
3)任务管理部分的设计
任务管理主要包括任务的选择和调整。
常见的任务有事件驱动型任务、时钟驱动型任务、优先任务、关键任务和协调任务等。
设计任务管理子系统时,需要确定各类任务,并将任务分配给适当的硬件或软件去执行。
4)数据管理的设计
在采用面向对象方法进行软件开发时,数据的存储还是普遍使用关系数据库。
在面向对象设计中,可以将UML类图看作是数据库的概念模型,一个类可以映射为一个表或多个表,此外,还要考虑类之间的关联关系、继承关系的映射。
10.5 用面向对象方法设计网上购书系统的软件结构,网上购书系统的业务如下:
某书店为方便客户通过Internet购买相关图书,开发一个“网上购书系统”,客户可以通过Web页面注册并登录“网上购书系统”,通过Web页面查看、选择图书,系统根据用户选择的图书单价、数量,系统自动生成订单,并计算总价格。
客户在提交订单之前,必须填写关于寄送地址和发票及付款方式等细节,一旦订单被提交,系统显示确认信息,并附上订单的详细信息。
客户可以在线查询订单的状态。
系统管理人员查看客户的订单,验证客户的信用和付款方式,向仓库请求所购图书,打印发票并发货。
答:本系统从逻辑结构上分为三层,Web页面层,业务逻辑层和数据库层。
Web页面层负责接收用户的请求,业务逻辑层在获知用户请求后,执行相应的业务逻辑,向数据库层发出数据请求,获得所需要的数据后,通知Web页面层将数据呈现给用户。
10.6 对10.5中的网上购书系统设计其问题域的类图。
问题域类包括客户类、系统管理员类、购物车类、订单类、图书类和发票类。
用户分为客户和系统管理员两种,所以是泛化关系。
客户和系统管理员都要对订单进行操作,所以和订单的关系是依赖关系。
购物车中存放的是用户选购的图书,是聚集关系。
具体见下图:
10.7 一所大学下设多个系,每个系包含多个教研室和多个学生班级。
每位教师只能归属于一个教研室。
学生分为本科生和研究生两种。
每位教师可以承担多门课程的教学任务,每个学生可以选修多门课程。
请根据以上问题描述画出类图。
从问题描述中,可得到大学、系、教研室、学生班级、教师、学生、教学任务、课程、本科生和研究生这10个类。
大学与系、系与教研室、学生班级、教研室与教师、学生班级与学生都是聚集关系,也可以看做关联关系。
学生同本科生、研究生之间是泛化关系。
具体见下图:
10.8 如何将含有继承关系的类图映射为关系数据库?针对10.6中设计的类图设计关系数据库。
通常使用以下两种方法来映射继承关系:
1)将基类映射到一张表,每个子类映射到一张表。
在基类对应的表中定义主键,而在子类对应的表中定义外键。
2)将每个子类映射到一张表,没有基类表。
在每个子类的表中包括基类的所有属性。
这种方法适用于子类的个数不多,基类属性比较少的情况。
在10.6题的类图中,共有7个类。
其中,用户同客户和系统管理员类是泛化关系,可映射为两个表——客户信息表和系统管理员信息表;如果客户类和系统管理员类二者的属性基本相同,也可以映射为一个表,只需在表中添加一个新属性来区分客户和系统管理员即可。
购物车、图书、订单和发票可分别映射得到一个表。