第11章面向对象设计与实现
张海藩《软件工程导论》(第6版)(章节题库 第11章 面向对象设计)【圣才出品】

第11章面向对象设计一、选择题1.()是不需要接收消息就能主动执行的服务。
A.内部服务B.外部服务C.内嵌服务D.上层服务【答案】B【解析】主动服务是不需要接收消息就能主动执行的服务,它在程序实现中是一个主动的程序成分,而外部服务属于主动服务,所以答案选B项。
2.火车是一种陆上交通工具,火车和陆上交通工具之间的关系是()关系。
A.组装B.整体与部分C.has aD.一般与具体【答案】D【解析】火车是一种陆上交通工具,而陆上交通工具不一定是火车,还可以是汽车、自行车等,说明火车是陆上交通工具的具体化,而陆上交通工具是火车的一般化,所以它们之间的关系是一般与具体的关系。
3.()只供对象内部的其他服务使用,不对外提供。
A.外部服务B.内部服务C.内嵌服务D.上层服务【答案】B【解析】对象的服务分为外部服务和内部服务两种,其中,内部服务只供内部的其它服务使用,不对外提供,外部服务只供对象外部的其它服务使用,不对内提供。
4.对象标识是分配给每个对象的永久性标识(又称作“柄”),它不符合下述条件()。
A.在一定的范围或领域(例如一个应用系统)中是唯一的B.与对象实例的特征、状态及分类(可能是动态的)无关C.在对象存在期间保持一致D.在对象存在之后保持一致【答案】D【解析】对象标识符合如下几个条件:①在一定的范围或领域中是唯一的;②与对象实例的特征、状态及分类无关;③在对象期间保持一致。
5.对象或者类的整体行为(例如响应消息)的某些规则所不能适应的(对象或类的)()。
A.状况B.情态C.条件D.问题【答案】D【解析】对象或者类的整体行为(例如响应消息)的某些规则所能适应的(对象或类的)状况、情况、条件、形式或生存周期阶段。
二、填空题1.对象的服务可分为_____、_____。
【答案】外部服务;内部服务2._____不同取值所构成的组合都可看作对象的一种新的状态。
【答案】对象的每个属性3.如果在一个服务中包括了多项可独立定义的功能,则它是_____,应尝试把它分解为多个服务。
软件工程第十一章面向对象设计

THANKS
感谢观看
01
抽象类是一种不能被实例化的 类,它只能被其他类继承。
02
抽象类可以包含抽象方法和具 体方法。抽象方法是没有具体 实现的方法,需要在继承抽象 类的子类中实现。
03
通过继承抽象类,子类可以继 承抽象类的属性和方法,并且 可以重写或实现抽象类中的方 法。
接口与抽象类的选择
在设计软件时,选择使用接口还是抽象类取决于具体需求和设计目标。
关系
关系描述了对象之间的交互和联系。 常见的关系包括关联、聚合和继承。
继承与多态的设计
继承
继承是一种实现代码重用的方式,子类可以继承父类的属性和方法,并可以扩展或覆盖它们。通过继承,可以建 立类之间的层次结构,使得代码更加清晰和易于维护。
多态
多态是指一个接口可以有多种实现方式,或者一个对象可以有多种形态。多态可以提高代码的灵活性和可扩展性, 使得程序更加易于维护和修改。
02
类与对象的设计
类的定义与属性
类的定义
类是对象的抽象,它描述了一组具有相同属性和行为的对象。类定义了对象的结构、行为和关系。
属性
属性是类中用于描述对象状态的变量。每个对象都有其自己的属性值,这些属性值决定了对象的状态 。
对象的行为与关系
行为
行为是类中定义的方法,用于描述对 象可以执行的操作。方法定义了对象 的行为和功能。
高层模块不应该依赖于低层模块,它们都应 该依赖于抽象。
面向对象设计的优势
提高代码可重用性
通过类和继承实现代码重用,减少重 复代码。
提高代码可维护性
面向对象设计使得代码结构更加清晰, 易于理解和维护。
提高开发效率
通过快速原型开发,快速构建软件系 统。
《软件工程导论》课后习题答案

作业及解答(第3章)
• 数据结构的描述 符 号
= +
含 义
x = a+b
举
例
被定义为 与 或
[...,...] 或 [...|...] { ... }或 m{...}n (...) “...” ..
23:59:38
x = [a , b],x = [a | b] 重复 x = {a}, x = 3{a}8 可选 x = (a) 基本数据元素 x = “a” 连结符 x = 1..9
P1 记录存款信息
P2 打印存单 F5存款信息 F3存单 E1 储户 F4利息
F5存款信息 D1存款信息 F7密码 F2取款单
F5存款信息 P3 核算密码
F4利息 F4利息 F6取款信息 P6 设置利率 P4 计算利息
P5 打印利息清单 F8储蓄利率
E2 业务员
23:59:38
F8储蓄利率
F8储蓄利率
23:59:38
重庆工学院计算机科学与工程学院 李梁(liliang@) 李梁
作业及解答( 作业及解答(第3章)
23:59:38
重庆工学院计算机科学与工程学院 李梁(liliang@) 李梁
作业及解答( 作业及解答(第3章)
• 3-6 复印机的工作过程大致如下:未接到复印 命令时处于闲置状态,一旦接到复印命令则进 入复印状态,完成一个复印命令规定的工作后 又回到闲置状态,等待下一个复印命令;如果 执行复印命令时发现没纸,则进入缺纸状态, 发出警告,等待装纸,装满纸后进入闲置状态, 准备接收复印命令;如果复印时发生卡纸故障, 则进入卡纸状态,发出警告等待维修人员来排 除故障,故障排除后回到闲置状态。 • 请用状态转换图描绘复印机的行为。
软件工程导论第11章

【还可以把适配接口再进一步细分为转换接口和扩充接口。转换接口, 是为了克服与表示方法、数据结构或硬件特点相关的操作给重用带来 的困难而设计的,这类接口是每个类构件在重用时都必须重新定义的 服务的集合。当使用C++语言编程时,应该在根类(或适当的基类)中, 把属于转换接口的服务定义为纯虚函数。如果某个服务有多种可能的 实现算法,则应该把它当作扩充接口。扩充接口与转换接口不同,并 不需要强迫用户在派生类中重新定义它们,相反,如果在派生类中没 有给出扩充接口的新算法,则将继承父类中的算法。当用C++语言实现 时,在基类中把这类服务定义为普通的虚函数。】
4. 弱耦合 耦合:指一个软件结构内不同模块之间互连的紧 密程度。 在面向对象方法中,对象是最基本的模块,因此, 耦合主要指不同对象之间相互关联的紧密程度。 弱耦合是优秀设计的一个重要标准。
5
对象之间的耦合分为两大类: (1) 交互耦合: 对象之间的耦合通过消息连接来实现。 使交互耦合尽可能松散,应遵守下述准则: 尽量降低消息连接的复杂程度。 应该尽量减少消息中包含的参数个数,降低参数的复 杂程度。 减少对象发送(或接收)的消息数。 (2) 继承耦合 与交互耦合相反,应该提高继承耦合程度。 通过继承关系结合起来的基类和派生类,构成系统中 粒度更大的模块。设计时应该使特殊类尽量多继承并 使用其一般化类的属性和服务,从而更紧密地耦合到 其一般化类。
13
2. 软件成分的重用级别 (1) 代码重用 源代码剪贴:最原始的重用形式。 复制或修改原有代码时可能出错,存在严重的配臵 管理问题,人们几乎无法跟踪原始代码块多次修改 重用的过程。 源代码包含:许多程序设计语言都提供包含库中 源代码的机制。配臵管理问题有所缓解,修改了库 中源代码之后,所有包含它的程序自然都必须重新 编译。 继承:利用继承机制重用类库中的类时,无须修 改已有的代码,就可以扩充或具体化在库中找出的 类,基本上不存在配臵管理问题。
软件工程课本讲解面向对象的OMT方法

化旳动态模型 + 细化旳功能模型。
16
第11章 面向对象的OMT方法
对象模型化技术OMT 对象模型化技术把分析时搜集旳信息构造在三类
模型中,即对象模型、功能模型和动态模型。
这个模型化旳过程是一种迭代过程。
17
第11章 面向对象的OMT方法
图11.4 三元关联 29
第11章 面向对象的OMT方法
角色为关联旳端点,阐明类在关联中旳作用和角 色。不同类旳关联角色可有可无,同类旳关联角色不 能省。角色旳表达如图11.5所示。
教师
讲授
课程
主讲
内容
图11.5 关联旳角色旳表达
30
第11章 面向对象的OMT方法
2) 受限关联
受限关联由两个类及一种限定词构成,限定词是 一种特定旳属性,用来有效地降低关联旳重数,限定 词在关联旳终端对象集中阐明。
技术之上旳,OMT措施旳基础是开发系统旳3个模型,再 细化这3种模型,并优化以构成设计。对象模型由系统中 旳对象及其关系构成,动态模型描述系统中对象对事件旳响应及对 象间旳相互作用,功能模型则拟定对象值上旳多种变换及变换上旳
约束。
6
第11章 面向对象的OMT方法
11.1.2 系统分析
分析旳目旳是拟定一种系统“干什么”旳模型,该模型经过 使用对象、关联、动态控制流和功能变换等来描述。分析过程是 一种不断获取需求及不断与顾客磋商旳过程。
8
第11章 面向对象的OMT方法
3. 构造动态模型
构造动态模型旳环节如下: (1) 准备经典交互序列旳脚本。 (2) 拟定对象间旳事件并为各脚本安排事件跟踪。 (3) 准备系统旳事件流图。 (4) 开发具有主要动态行为旳各个类旳状态图。 (5) 检验状态图中共享事件旳一致性和完整性。 最终得到:动态模型 = 状态图 + 全局事件流图。
C++铁道第2版-11

程序运行结果如下: 请输入三角形的三个边长(a、b、c): 3 4 5↙ a=3,b=4,c=5 三角形的面积=6 请输入三角形的三个边长(a、b、c): int main() 2 2 4↙ { double a,b,c; a=2,b=2,c=4 这三条边不能构成三角形,异常发生,结束! try //检查异常 { cout<<"请输入三角形的三个边长(a、b、c):"<<endl; cin>>a>>b>>c; if (a<=0||b<=0||c<=0) throw 1; // 语句throw抛出int型异常 while (a>0&&b>0&&c>0) { cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl; cout<<"三角形的面积="<<triangle(a,b,c)<<endl; cout<<"请输入三角形的三个边长(a、b、c):"<<endl; cin>>a>>b>>c; if(a<=0||b<=0||c<=0) throw 1; }} //语句throw抛出int型异常 catch(double) // 捕获异常,异常类型是double型 { cout<<"这三条边不能构成三角形,异常发生,结束!"<<endl; } catch(int) // 捕获异常,异常类型是int型 { cout<<"边长小于或等于0,异常发生,结束!"<<endl;} return 0;}
第11章 Windows 编程初步-面向对象程序设计(C++语言)(第二版)-程磊-清华大学出版社

❖ 第一种方法的特点是可以使应用程序更精炼,运 行效率更高,编写程序时有较大的自由度,但难 度较大;
❖ 第二种方法的特点是采用MFC提供的类库编写程 序,这些类中已经封装了大部分的Windows API 函数,还提供了编写不同程序类型的模版和框架, 所以编写程序比较容易,而且还允许直接调用 Windows API 函数来实现一些特殊的功能。
第三部分 Visual C++环境下Windows程序 开发概述
第11章 Windows 编程初步 第12章 MFC库和应用程序框架 第13章 综合设计实例– 简单绘图程序
第11章 Windows 编程初步
本章要点:
❖简单的Windows程序框架 ❖自定义类和Windows程序框架结合
在编写Windows 应用程序时,常采用两种方法: ❖ 一是使用Windows SDK ( Software development Kit,即
图11.5 向解决方案中添加新项
图11.6 添加main.cpp文件
(6)可以看到在“解决方案管理器”视图中的“源文件” 栏目中被添加了一个main.cpp文件,同时可以看到 Visual Studio开发工具的中间编辑窗口也打开了一个空 白的文件编辑窗口,在这里输入例11.1的源程序,然后保 存,如图11.7所示。
❖ Windows程序一般是一个可视化的窗口程序,通过操作 系统发送的消息来处理用户输入的数据,然后通过在窗口 上绘制或者把数据发给窗口上的组件来显示数据。
❖ 句柄就是一个标识符,用来区别同类对象或者资源的唯一 标志,可以认为它是个无符号整数或者一个指针均可。
第11章-面向对象与Java程序设计 (第3版)-微课视频版-朱福喜-清华大学出版社

第6页
11.1.3 JDBC的实现及其驱动程序
源的SQL请求。数据库驱动程序可修改应用程序的请求,使 得请求符合相关的DBMS所支持的文法。 ·数据源:由用户想要存取的数据以及与它相关的操作系统、 DBMS和用于访问DBMS的网络平台组成。
第5页
11.1.2 从ODBC到JDBC
2. JDBC的诞生
Java 刚诞生时,由于没有数据库API,编程人员不得不在 Java程序中加入C语言的ODBC函数调用。这就使Java的很多 优秀特性无法充分发挥,如平台无关性、面向对象特性等。
第4页
11.1.2 从ODBC到JDBC
1. ODBC的结构模型
ODBC包括4个主要部分: ·应用程序接口:屏蔽不同的ODBC数据库驱动程序之间函数
调用的差别,为用户提供统一的SQL编程接口。 ·驱动程序管理器:为应用程序装载数据库驱动程序。 ·数据库驱动程序:实现ODBC的函数调用,提供对特定数据
("jdbc:odbc:wombat", "login", "password"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM
Table1"); while (rs.next())
System.out.println(rs.getString("a") + " " +rs.getString ("b") + " " + rs.getString("c"));
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
。给处理器分配任务要考虑特定动作、通信限制和计 算限制等。ATM机系统没有任何通信和计算限制的问 题。 如果ATM必须要有自主性,当通信网络出现故障时还 可以运行,那么它就必须要有自己的CPU和程序设计 。
确定物理部件之间的配置和 连接形式
确定物理部件之间的配置和连接形式,包括连接拓扑
、重复部件和通信。比如,进程间的通信调用连接的 单个操作系统内部的任务,这种调用要比同一个程序 中的子程序要慢得多,对于时间要求比较严格的时候 是不实用的。简单的做法是合并任务,运用子程序来 建立连接。 ATM机系统中,多个ATM客户机连接到中心计算机, 然后路由到相应的银行计算机。拓扑结构是星型的, 中心计算机来仲裁通信。
职责与方法
创建者模式
问题:一个对象由谁(哪个对象)创建? 指导原则是:将创建一个对象A的职责分配给对象B的
条件是B“包含”或组成聚集了A、B记录A、B紧密地 使用A或者B具有A初始化数据并且在创建A时会将这 些数据传递给A。简而言之,就是一个对象要由拥有 或者使用其信息的、与其有密切关系的另一个已存在 的对象创建。 例如在POS机系统中的Sale对象是由那个对象类创建?
传统观点:
模块控制构件,协调问题域中所有其他构件的调用; 问题域构件,完成部分或全部用户的需求; 基础设施构件,负责完成问题域中所需要相关处理的功能 。
构件级设计步骤
步骤1:标识出所有与问题域相对应的设计类 步骤2:确定所有与基础设施相对应的设计类 步骤3:细化所有不能作为复用构件的设计类 在类或构件的协作时说明消息的细节 为每一个构件确定适当的接口 细化属性并且定义相应的数据类型和数据结构 详细描述每个操作中的处理流 步骤4:说明持久性数据源(数据库和文件)并确定管理数据源
所需要的类 步骤5:开发并且细化类或构件的行为表示 步骤6:细化部署图以提供额外的实现细节 步骤7:考虑每一个构件级设计表示,并且时刻考虑其他选择
基于类的构件设计原则
开关原则(The Open-Closed Principle, OCP):模块应该对外延
具有开放性,对修改具有封闭性。 替换原则(Subsitution Principle, SP):子类可以替换它们的基类。 依赖倒置原则(Dependency Inversion Principle, DIP):依赖于抽 象、而非具体实现 接口分离原则(Interface Segregation Principle, ISP):多个用户 专用接口比一个通用接口要好。 发布复用等价性原则(Release Reuse Equivalency Principle, REP):复用的粒度就是发布的粒度。 共同封装原则(Common Closure Principle, CCP): 一同 变更的类应该和在一起。 共同复用原则(Common Reuse Principle,CRP):不能一起复 用的类不能被分到一组。
职责。 指导原则是:给对象分配职责时,应该把职责分配给具有完成 该职责所需要信息的那个类。 例如在POS机系统中,销售的总额该如果确定?决定总额的一 些元素应该是属于哪些对象的信息?
按照信息专家的建议,这里应当寻找具有确定总额所需信息的那个
对象类。分析领域模型和设计模型得到,要计算总额应该知道销售 的所有SalesLineItem实例及其小计之和。Sale实例包含了上述信息。 为了确定商品的小计,这里需要SalesLineItem.quantity、和 ProductDescription.price。SalesLineItem知道其数量和与其关联的 ProductDescription。
<Business Object> Title -bookid: string -borrowednum: integer -reservatednum: integer +finde() create() destroy
be reserved in a <Business Object> Reservation -reserveddate: date -noticedate:date -borrowerid:integer -isbn:string +find() create() destroy
11.4 使用设计模式
有经验的软件开发者建立了既有通用原则又有惯用方
案的指令系统来指导他们编制软件。 如果以结构化形式对这些问题、解决方案和命名进行 描述使其系统化,那么这些原则和习惯用法就可以称 为模式。
基于职责设计对象(General Responsibility Assignment
域类模型
<Business Object> Item -id: integer +findonTitle() +findonid() +findonReservation() create() destroy
be loaned in a <Business Object> Loan -id: integer -borroweddate: date -returndate: date -borrowerid: integer create() destroy <Business Object> Borrower -borrowerid: integer -name: string -borrowednum: integer -fine: number +find() create() destroy copy of
11.3 确定并发性
系统设计的一个重要目标就是识别必须是并发获得的
那些对象和具有互斥获得的对象。可以将具有互斥获 得的对象叠加在单线程控制或任务中。
状态机模型可以帮助我们识别并发性。如果两个对象
在不交互的情况下,在同一时刻可以接受事件,它们 就是内在并发的。如果事件不同步,我们就不能将这 两个对象叠加在单线程控制中。
设计模型是系统需求和系统之间的桥梁,是设计构造
本身的一个重要部分。而面向对象设计模型是对系统 中包含的对象或对象类,以及它们之间的不同类型关 系的描述。
领域类模型 包模型
11.1 设计模型
面向对象设计模型是对系统中包含的对象或对象类,以及
它们之间的不同类型关系的描述。 面向对象的设计两类设计模型:
供对象操作来访问对象和修改数据 接口可以用UML中的类图形式来描述 UML的格式标记“interface”中必须包含名字部分
图书馆系统中借书者的接口
interface borrower{ public void borrower(int borrowerid,int bookid); public void setborrower(int borrowerid); public void addload(Load loaditem); public void getload(); public void getnoload(); public void removeload(); public void write(); public void read(); … }//borrower
11.2 构件级设计
构件级设计定义了数据结构、算法、接口特征和分配
给每个软件构件的通信机制。
每个构件的类定义或者处理叙述都转化为一种详细设
计。
设计采用图形或基于文本的形式来详细说明内部的数
据结构、局部接口细节和处理逻辑。 设计符号包括UML图和一些辅助表示。 通过一系列结构化编程结构来说明程序的设计。
静态模型:通过系统对象类及其之间的关系来描述系统的静态
结构。在UML中常用类图、用例图、构件图、包图等描述系 统中元素的关系。 动态模型:描述系统的动态结构和系统对象之间的交互。在 UML中常用时序图、协作图、状态图、活动图等来描述系统 的行为。
域类模型 领域分析 确定域类 包模型:用包图表示
对象的认知职责包括:
职责的粒度会影响职责到类和方法的转换
GRASP
职责不同于方法,职责是一种抽象,而方法实现了职
责。 绘制UML交互图时,就是在决定职责的分配。通过 GRASP中的基本原则来指导如果分配职责给一个对象。 五种基本的GRASP模式:
创建者模式 信息专家模式 控制器模式 低耦合模式 高内聚模式
计算销售总额
控制器模式
根据MVS(Model View Separation)原则,UI对象不应当包含应用逻
has
has
包图
图书流通 《子系统》 图书流通 《子系统》 图书维护 《子系统》 信息查询 管理所有 的与外部 通信 标识借阅 者并更新 信息 《子系统》 交互界面 《子系统》 标识借阅 《子系统》 标识图书
对象接口描述
接口设计中应该避免涉及接口的具体表示
正确的方式是将具体的接口实现方法隐藏起来,只提
构件类
构件是计算机软件中的一个模块化的构造块 在OMG UML规范中将构件定义为“系统中某一定型化的、可
配置的和可替换的部件,该部件封装了实现并暴露一系列接 口”。 面向对象的观点:
构件中的每一个类都被详细阐述,包括所有的属性和与其实现相关
的操作。 从分析模型开始,详细描述分析类(对于构件而言该类与问题域相 关)和基础类(对于构件而言该类为问题域提供了支持性服务)。
责,即对其所作所为进行抽象。 UML把职责定义为“类元的契约或义务”。就对象的角色而言, 职责与对象的义务和行为相关。职责分为以下两种类型:
对象的行为职责包括:
自身执行一些行为,如创建对象或计算 初始化其他对象中的动作 控制和协调其他对象中的活动 对私有封装数据的认知 对相关对象的认知 对其能够导出或计算的事物得认知