软件工程面向对象设计方法与法则
软件工程 第八章 面向对象的设计方法

第八章面向对象的设计方法本章采用基于UML的面向对象设计方法的将分析模型转换为设计模型。
如第五章所述,面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成;设计模型则包含以包图表示的软件体系结构图、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。
为完成这一转换过程,设计人员必须处理以下任务:(1)针对分析模型中的用例,设计实现方案。
实现方案用UML交互图表示。
(2)设计技术支撑设施。
在大型软件项目中,往往需要一些技术支撑设施来帮助业务需求层面的类或子系统完成其功能。
这些设施本身并非业务需求的一部分,但却为多种业务需求的实现提供公共服务。
例如,数据的持久存储服务、安全控制服务和远程访问服务等。
在面向对象设计中,需要研究这些技术支撑设施的实现方式以及它们与业务需求层面的类及子系统之间的关系。
(3)设计用户界面。
(4)针对分析模型中的领域概念模型以及第(2)、(3)两个步骤引进的新类,完整、精确地确定每个类的属性和操作,并完整地标示类之间的关系。
此外,为了实现软件重用和强内聚、松耦合等软件设计原则,还可以对前面形成的类图进行各种微调,最终形成足以构成面向对象程序设计的基础和依据的详尽类图。
面向对象的软件设计过程如图8-1-1所示。
图8-1-1 面向对象的软件设计过程第一节设计用例实现方案UML 的交互图(顺序图、协作图)适于用例实现方案的表示。
因此,本节首先介绍交互图的语言机制,然后探讨用例实现方案的设计方法。
该设计方法包含如下3个步骤:(1)提取边界类、实体类和控制类;(2)构造交互图;(3)根据交互图精华类图。
一、顺序图顺序图用来描述对象之间动态的交互关系,着重表现对象间消息传递的时间顺序。
在顺序图中,参与交互的对象位于顶端的水平轴上,垂直轴表示时间,时间推移的方向是自上而下的。
顺序图中的对象一般以“对象名:类名”的方式标识,但也可以仅采用缩写形式“对象名”或者“:类名”。
软件工程第十一章面向对象设计

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

• 信息隐藏:对于类而言,其内部信息如属性的表示方法和操作的实现算法,对 外界是隐藏的。外界通过有限的接口来访问类的内部信息。
17
9.3.2 面向对象设计的原则
• 低耦合:在面向对象设计中,耦合主要指对象之间相互关联的紧密程度,低耦 合有利于降低一个模块改变对其他模块的影响。
• 高内聚:内聚与耦合密切相关,低耦合往往意味着高内聚,高内聚有助于提高 系统独立性。
但随着需求理解的加深,以及对系统认识程度的逐步 提高,设计人员还要对模型进行修正和完善。 • 设计任务管理子系统包括确定任务,分配任务,还包 括权衡一致性、成本、性能等因素以及未来可扩充性。 • 设计数据管理子系统,需要设计数据格式以及相应的 服务,设计数据格式的方法与所用的数据存储管理模 式密切相关,不同数据存储管理模式时,属性和服务 的设计方法是不同的。
9.2 面向对象设计与面向对象分析的关系
• 设计阶段的任务是及时把分析阶段得到的需求转变成符合各项要求的 系统实现方案。与传统的软件工程方法不同的是,面向对象的方法不强调 需求分析和软件设计的严格区分。实际上,面向对象的需求分析和面向对 象的设计活动是一个反复迭代的过程,从分析到设计的过渡,是一个逐渐 扩充、细化和完善分析阶段所得到的各种模型的过程。严格的意义上来讲, 从面向对象分析到面向对象设计不存在转换问题,而是同一种表示方法在 不同范围的运用。面向对象设计也不仅仅是对面向对象分析模型进行细化。
• (2)人机交互子系统包括有效的人机交互所需的显示和输入,这些类在很大程度上 依赖于所用的图形用户界面环境,例如Windows、Delphi、C++,而且可能包括“窗 口”、“菜单”、“滚动条”、“按钮”等针对项目的特殊类。
25
9.5.1 系统分解
软件工程第9章 面向对象方法学

9.1 面向对象方法学概述
9.1.1.面向对象方法学的要点
面向对象方法学的要点面向对象方法学的出发点和基本原则, 是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程 尽可能接近人类认识世界解决问题的方法与过程,也就是使描 述问题的问题空间(也称为问题域)与实现解法的解空间(也称为 求解域)在结构上尽可能一致。
9.2 面向对象的概念
3.消息(massage) 例如,MyCircle是一个半径为4cm、圆心位于(100,200)的
Circle类的对象,也就是Circle类的一个实例,当要求它以绿 颜色在屏幕上显示自己时,在C++语言中应该向它发下列消 息:
MyCircle.Show(GREEN); 其中,MyCircle是接收消息的对象的名字,Show是消息选择 符(即消息名),圆括号内的GREEN是消息的变元。当 MyCircle接收到这个消息后,将执行在Circle类中所定义的 Show操作。
面向对象的软件技术以对象为核心,用这种技术开发出的软 件系统由对象组成。对象是由描述内部状态表示静态属性的 数据,以及可以对这些数据施加的操作(对象的动态行为), 封装在一起所构成的统一体。
面向对象的设计方法基本原理是,使用现实世界的概念抽象 地思考问题从而自然地解决问题。
面向对象方法学的基本原则是按照人类习惯的思维方法建立 问题域的模型,开发出尽可能直观、自然地表现求解方法的 软件系统。面向对象的软件系统中使用的对象,是对客观世 界中实体的抽象。
9.2 面向对象的概念
4.方法(method)
方法就是对象所能执行的操作,也就是类中所定义的服务 。方法描述了对象执行操作的算法,响应消息的方法。在 C++语言中把方法称为成员函数。 5.属性(attribute)
软件工程面向对象软件开发方法

软件工程面向对象软件开发方法引言在当前的软件开发领域中,面向对象编程(Object-oriented programming,简称OOP)是一种主要的软件开发方法。
面向对象软件开发方法基于面向对象的程序设计理念,通过将问题分解为对象,并通过对象之间的交互来解决问题。
本文将介绍面向对象软件开发的概念、特性以及在软件工程中的重要性。
面向对象软件开发概述面向对象软件开发是一种以对象为核心的软件开发方法,其中一个对象可以是一个类的实例或一个类本身。
对象在面向对象软件开发中被视为具有状态、行为和标识的实体。
该方法通过将问题分解为对象,并定义对象之间的关系和交互来解决问题。
面向对象软件开发方法有以下几个基本特征:1.封装(Encapsulation):通过封装将数据和相关操作组合在一起,只暴露必要的接口给外部使用。
封装可以使得对象的内部实现对外部不可见,提高了代码的可维护性和安全性。
2.继承(Inheritance):通过继承,在已有类的基础上创建新的类。
继承可以促使代码重用和层次化设计。
3.多态(Polymorphism):多态允许同一操作作用于不同类型的对象上,并产生不同的结果。
这种特性增加了代码的灵活性和可扩展性。
面向对象软件开发方法的优势包括:•提高开发效率:通过封装和抽象的机制,可以更好地管理和组织大型项目的代码,减少开发时间和维护成本。
•提高代码复用性:通过继承和多态的机制,可以避免重复编写相似的代码,提高了代码的复用性和可维护性。
•提高软件的可扩展性:面向对象软件开发方法的灵活性使得系统易于进行修改和扩展,能够快速适应变化的需求和技术。
面向对象软件开发流程面向对象软件开发方法通常包括以下几个主要步骤:在需求分析阶段,软件工程师与客户交流,确保准确理解客户的需求和问题。
通过讨论和分析,确定系统的功能需求、非功能需求和约束条件。
领域建模领域建模是通过抽象和建模来描述问题领域的过程。
通过识别实体、属性和关系,构建领域模型,这些模型将在后续的设计和实现阶段中使用。
软件工程课本讲解面向对象的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) 检验状态图中共享事件旳一致性和完整性。 最终得到:动态模型 = 状态图 + 全局事件流图。
《软件工程实用教程》第6_章_面向对象的软件设计

第6 章 面向對象的軟體設計
例:
第6 章 面向對象的軟體設計
2.部署圖 部署圖描述了處理器、設備和軟體構件運行時 的體系結構。 ( 1 )結點:是某種計算資源的物理對象,包括電 腦、設備(如印表機、通信設備)等 (2) 連接:連接用一條直線表示,它指出結點之間 存在著某種通信路徑,並指出通過哪條通信路 徑可使這些結點間交換對象或發送消息
第6 章 面向對象的軟體設計
2.詳細設計 (1)細化、補充類的屬性和操作 (2)設計類操作的實現演算法 (3)優化數據訪問路徑 (4)實現外部互動式的控制 (5)調整類結構,增加繼承性 (6)設計類之間的關聯的實現方式 (7)確定對象屬性的精確表示 (8)把類和關聯打包歸納到模組中
第6 章 面向對象的軟體設計
第6 章 面向對象的軟體設計
3)依賴倒置原則:指的是依賴關係應該是儘量依賴介面 (或抽象類),而不是依賴於具體類。在面向對象 的設計中,高層的類往往與領域的業務有關,這些 類只依賴於一些抽象的類或介面,當具體的實現細 節改變時,不會對高層的類產生影響。 4)介面分離原則:指的是在設計時採用多個與特定客戶 類有關的介面比採用一個通用的介面要好。即一個 類要給多個客戶類使用,那麼可以為每個客戶類創 建一個介面,然後這個類實現所有這些介面,而不 要只創建一個介面,其中包含了所有客戶類需要的 方法,然後這個類實現這個介面。
第6 章 面向對象的軟體設計
2.設計基於類的構件 (1)基本設計原則 2)Liskov替換原則:指的是子類可以替 換父類出現在父類能出現的任何地方。 例如,類ClassA要使用ClassB,ClassC 是ClassB的子類。如果在運行時,用 ClassC代替ClassB,則ClassA仍然可以 使用原來ClassB中提供的方法,而不需 要做任何改動。
软件工程 软件设计方法

软件工程软件设计方法
软件工程软件设计方法
软件设计方法是软件工程中的重要组成部分,它是指在软件开发过程中,通过采用一定的方法论和技术,对软件系统进行设计的过程。
1. 结构化设计方法
结构化设计方法是指将软件系统划分为多个模块,在每个模块中定义合适的数据结构和算法,以实现系统的功能需求。
典型的结构化设计方法包括层次设计、数据流图和结构图等。
2. 面向对象设计方法
面向对象设计方法是基于面向对象编程思想的软件设计方法,它以对象作为软件开发的基本单位,通过定义对象之间的关系和交互,实现系统的功能需求。
常用的面向对象设计方法包括UML建模和设计模式等。
3. 原型设计方法
原型设计方法是通过快速构建系统原型来验证和改进需求,从而指导软件的设计和开发过程。
原型设计方法可以快速获取用户反馈,识别和修复潜在问题,缩短开发周期和降低开发风险。
4. 数据驱动设计方法
数据驱动设计方法强调以数据为中心进行软件设计,通过分析和理解数据的结构、特征和关系,设计出合适的数据模型和处理逻辑,以实现数据的有效管理和利用。
5. 敏捷设计方法
敏捷设计方法是一种迭代、协作和自适应的软件设计方法,其核心理念是响应变化、积极交付和持续改进。
敏捷设计方法通常采用迭代开发模式,强调团队合作和高效沟通,以快速、灵活地满足用户需求。
以上是几种常用的软件设计方法,不同的方法在不同的场景下有其适用性和优劣势。
软件工程师需要根据具体项目需求和团队情况,选取合适的设计方法,并结合实践经验进行不断改进和优化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
➢ 根据引用(By reference) ➢ 根据值(By value)
组合的优点和缺点
▪ 优点
➢ 容器类仅能通过被包含对象的接口来对其进行访问。 ➢ “黑盒”复用,因为被包含对象的内部细节对外是不可见。 ➢ 对装性好。 ➢ 实现上的相互依赖性比较小。(译者注:被包含对象与容器对象
▪ 开放-封闭法则认为我们应该试图去设计出永远也 不需要改变的模块。
▪ 我们可以添加新代码来扩展系统的行为。我们不 能对已有的代码进行修改。
▪ 符合OCP的模块需满足两个标准: ▪ 可扩展,即“对扩展是开放的”(Open For
Extension)-模块的行为可以被扩展,以需要 满足新的需求。 ▪ 不可更改,即“对更改是封闭的”(Closed for Modification)-模块的源代码是不允许进行改 动的。
Java接口。 ▪ Java接口构造方式更加易于表达和实现那些专注
于对象接口的设计。
接口的好处
▪ 优点
➢ Client不必知道其使用对象的具体所属类。 ➢ 一个对象可以很容易地被(实现了相同接口的)的另
一个对象所替换。 ➢ 对象间的连接不必硬绑定(hardwire)到一个具体类
的对象上,因此增加了灵活性。 ➢ 松散藕合(loosens coupling)。 ➢ 增加了重用的可能性。 ➢ 提高了(对象)组合的机率,因为被包含对象可以是
▪ 组合
▪ 继承
▪ 示例分析
▪ 练习
组合的定义
▪ 定义
➢ (对象)组合是一种通过创建一个组合了其它对象的
对象,从而获得新功能的复用方法。 ➢ 将功能委托给所组合的一个对象,从而获得新功能。 ➢ 有些时候也称之为“聚合”(aggregation)或“包
容”(containment),尽管有些作者对这些术语赋 予了专门的含义
针对接口编程,而非(接口的)实现
▪ 接口的特征 ▪ 实现继承和接口继承 ▪ 接口的好处 ▪ 示例分析 ▪ 练习
接口的特征
▪ 接口是一个对象在对其它的对象进行调用时所知道的方
法集合。 ▪ 一个对象可以有多个接口(实际上,接口是对象所有方
法的一个子集)
▪ 类型是对象的一个特定的接口。
▪ 不同的对象可以具有相同的类型,而且一个对象可以具 有多个不同的类型。
任何实现了一个指定接口的类。
▪ 缺点
➢ 设计的复杂性略有增加
接口定义
▪ 抽象的交通工具的定义
接口实现
练习
▪ 画图类的设计
➢ 实现画图功能 ➢ 可以画线、圆、长方形、正方形、三角形等。
类的封闭性原则
▪ 完备性。一个类要完成一个独立的业务过 程,该类的内部应该定义了这个业务的整 个过程,尽量不要在这个类定义了一些过 程,而在另一个类中又定义了另外一些过 程。
➢ 子类的一个实例永远不需要转化(transmute)为其 它类的一个对象。
➢ 子类是对其父类的职责(responsibility)进行扩展, 而非重写或废除(nullify)。
➢ 子类没有对那些仅作为一个工具类(utility class)的 功能进行扩展。
➢ 对于一个位于实际的问题域(Problem Domain)的 类而言,其子类特指一种角色(role),交易 (transaction)或设备(device)。
示例分析
▪ 火车票售票系统
➢ 乘客是人所扮演的一种角 色。代理人亦然。
➢ 随着时间的发展,一个 Person的子类实例可能 会从Passenger转变成 Agent,再到Agent Passenger。
组合设计1
组合设计2
总结
▪ 组合与继承都是重要的重用方法 ▪ 在OO开发的早期,继承被过度地使用 ▪ 随着时间的发展,我们发现优先使用组合可以获
▪}
▪}
▪ Car bmw=new Car(); ▪ bmw.go();
最终调用者只需 知道一个开动汽
车的方法
通过抽象方法来实现逻辑关系的复用
▪ public class abstract Vechile{
▪ private void roll{
▪ //实现滚动功能
▪ ……
▪}
▪ //抽象的驱动方法
▪ public class Vechile{ ▪ protected void roll(){ ▪ //滚动的实现代码 ▪ …… ▪}
▪ public class Car extends Vechile{
▪ public void driver()
▪{
▪
……
▪}
▪}
最终调用者需 要知道开动汽
车的所有操作
之间的依赖关系比较少) ➢ 每一个类只专注于一项任务。 ➢ 通过获取指向其它的具有相同类型的对象引用,可以在运行期间
动态地定义(对象的)组合。
▪ 缺点
➢ 从而导致系统中的对象过多。 ➢ 为了能将多个不同的对象作为组合块(composition block)来
使用,必须仔细地对接口进行定义。
继承的特点
▪ Car bmw=new Car(); ▪ bmw.driver();
方法
▪ bmw.roll();
调用父类的方法构成自己的方法实现复用
▪ public class Car{ ▪ public void go(){
子类中需要知 道汽车开动的
操作流程
▪ //实现驱动功能代码
▪ ……
▪ roll();//调用父类的轮子滚动方法
结果如何
▪ 如何改进
练习
练习
▪ 课后把课堂练习进行设计实现
▪ 设计要求
OCP示例
➢ Purchase类的calculate方法要求在制订的部 件数组中计算各个部件价格的总和。
➢ 部件有显示器、CPU、内存、主板、硬盘、光 驱、机箱、键盘、鼠标等
▪ 初步设计
➢ 定义一个基类Part表示部件,所有具体部件都 从Part继承下来的子类
➢ Part的定义为:
计算总价的实现
得重用性与简单性更佳的设计 ▪ 当然可以通过继承,以扩充(enlarge)可用的
组合类集(the set of composable classes)。 ▪ 因此组合与继承可以一起工作 ▪ 但是我们的基本法则是:
➢ 优先使用对象组合,而非(类)继承
练习
▪ 设计下列类的关系
➢ 人、学生、教师 ➢ 本科、研究生 ➢ 大一学生、大二学生、大三学生、大四学生 ➢ 讲师、教授
▪ (类)继承是一种通过扩展一个已有对象 的实现,从而获得新功能的复用方法。
▪ 泛化类(超类)可以显式地捕获那些公共 的属性和方法。
▪ 特殊类(子类)则通过附加属性和方法来 进行实现的扩展。
继承的优点和缺点
▪ 优点
➢ 容易进行新的实现,因为其大多数可继承而来。 ➢ 易于修改或扩展那些被复用的实现。
软件工程
第21讲:面向对象设计方法与法则
主讲人:阳王东 Email:yangwangdong126
主要内容
▪ 优先使用(对象)组合,而非(类)继承 ▪ 针对接口编程,而非(接口的)实现 ▪ 类的封闭性原则 ▪ 开放-封闭法则(OCP) ▪ Liskov替换法则(LSP)
优先使用(对象)组合,而非(类) 继承
▪ //实现父类的抽象的驱动方法 ▪ public void drive(){ ▪ //具体特有的驱动功能代码
子类只需要做 自己的驱动就
行了▪ ……Fra bibliotek▪}▪}
▪ Vechile vechiletest = new Car(); ▪ //调用车辆行驶功能 ▪ vechiletest.go();
开放-封闭法则(OCP)
▪ 但是在计算总价格时,若财务部颁布主板和内存应使用额外费用
改进方案1
▪ 子类重载父类的方法:每当计价策略发生 改变,我们就修改Part的每个子类!
改进的方案2
▪ 采用一个PricePolicy类,通过对其进行继 承以提供不同的计价策略
改进部件类
练习
▪ 计算住房按揭
➢ 房屋类的设计 ➢ 还款金额计算
实现继承和接口继承
▪ 实现继承(类继承):一个对象的实现是根据另
一个对象的实现来定义的。
▪ 接口继承(子类型化):描述了一个对象可在什
么时候被用来替代另一个对象。 ▪ C++的继承机制既指类继承,又指接口继承。 ▪ C++通过继承纯虚类来实现接口继承。 ▪ Java对接口继承具有单独的语言构造方式-
Liskov替换法则(LSP)
▪ 使用指向基类(超类)的引用的函数,必 须能够在不知道具体派生类(子类)对象 类型的情况下使用它们。
▪ 使用基类的地方,用该基类的所有子类替 换基类,都应该保证程序是正确的。
▪ 长方形和 正方形的 面积计算
▪ 长方形类 的定义
示例
正方形类的定义
计算面积存在的问题
▪ protected abstract void driv汽e()车; 的开动过程在这里
▪ //车辆的行驶逻辑方法
完全定义,符合完备性
▪ public void go(){ ▪ //驱动
原则
▪ drive();
▪ //滚动
▪ roll();
▪}
▪}
▪ public class Car extends Vechile{
▪ 一个对象仅能通过其接口才会被其它对象所了解。 ▪ 某种意义上,接口是以一种非常局限的方式,将“是一
种…”表达为“一种支持该接口的…”。 ▪ 接口是实现插件化(pluggability)的关键 ▪ 接口表示“…像…”(LikeA)的关系,继承表示“…
是…”(IsA)的关系,组合表示“…有…”(HasA)的 关系。