面向对象的分析和设计
软件工程(第三版,钱乐秋等著)7-8章有所省略版
面向对象的基本概念
用下列等式认识面向对象方法:
面向对象 =类(class)+ 对象(object)
继承(inheritance)
多态(Polymorphism)
通过消息的通信(communication with messages)
(终于有点熟悉的面孔了 - -)
采用四个概念开发的软件系统是面向对象的
面向对象方法成为20世纪90年代的主流开发方法。其原因:
- 从认知学的角度来看,面向对象方法符合人们对客观世界的认识规律
- 面向对象方法开发的软件系统易于维护,其体系结构易于理解、扩充和修改
- 面向对象方法中的继承机制有力支持软件的复用
-
对象(object):一个对象通常可由对象名、属性和操作三部分组成。
- 对象是指一组属性以及这组属性上的专用操作的封装体(getset)。
- **属性(attribute)**通常是一些数据,有时它也可以是另一个对象。每个对象都有它自己的属性值,表示该对象的状态。对象中的属性只能通过该对象所提供的操作来存取或修改。
- 操作(operation)(也称方法或服务)规定了对象的行为,表示对象所能提供的服务。
- **封装(encapsulation)**是一种信息隐蔽技术,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。封装的目的是使对象的使用者和生产者分离,使对象的定义和实现分开。
-
类(class)
- 类是一组具有相同属性和相同操作的对象的集合。一个类中的每个对象都是这个类的一个实例(instance)
- 类是创建对象的模板,从同一个类实例化的每个对象都具有相同的结构和行为。
-
继承(inheritance)
- 继承是类间的基本关系,它是基于层次关系的不同类共享数据和操作的一种机制。
- 父类中定义了其所有子类的公共属性和操作
- 子类中除了定义自己特有的属性和操作外,可以继承其父类(或祖先类)的属性和操作,还可以对父类(或祖先类)中的操作重新定义其实现方法(overview)。
多重继承:如果一个子类只有唯一一个父类,这个继承称为单一继承。如果一个子类有一个以上的父类,这种继承称为多重继承。
-
消息(message)
- 消息传递是对象间通信的手段,一个对象通过向另一个对象发送消息来请求其服务。
- 消息通常包括接收对象名、调用的操作名和适当的参数(如果有必要的话)。
- 消息只告诉接收对象需要完成什么操作,但并不指示接收者怎样完成操作。
- 消息完全由接收者解释,接收者独立决定采用什么方法完成所需的操作。
(就是调用对象方法呗- -)
-
多态性(polymorphism)
- 多态性是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。
- 例如“画”操作,作用在“矩形”对象上,则在屏幕上画一个矩形,作用在“圆”对象上,则在屏幕上画一个圆。也就是说,相同操作的消息发送给不同的对象时,每个对象将根据自己所属类中定义的这个操作去执行,从而产生不同的结果。
-
动态绑定(dynamic binding)
- 动态绑定是指在程序运行时才将消息所请求的操作与实现该操作的方法连接起来。
- 静态绑定:传统的程序设计语言的过程调用与目标代码的连接(即调用哪个过程)放在程序运行前(即编译时)进行,称为静态绑定,而动态绑定则是把这种连接推迟到运行时才进行。(静态绑定应该是static代码块中运行的方法调用)
- 动态绑定是一种在运行时确定被执行代码的技术
面向对象的分析和设计过程
面向对象分析
面向对象分析的一般步骤如下:
- 获取客户对系统的需求:包括标识场景(scenario)和用况(use case,也称用例),以及建造需求模型
- 用基本的需求为指南,来设计类和对象(包括属性和操作)。
- 定义类的结构和层次。
- 建造对象—关系模型。
- 建造对象—行为模型。
- 利用用况/场景来复审分析模型。
获取客户对系统的需求
需求获取必须让客户与开发者充分地交流
- 标识使用该系统不同的角色(管理者、客户)
- 角色的使用场景(管理端、app端)
- 角色完成的功能(增删查改)
- 所有执行者提出的所有用况构成系统的完整的需求
标识类和对象
类和对象来自问题领域。
可以先标识候选类,然后进行筛选。
定义类的结构和层次
类的结构主要有两种:一般——特殊(generalization-specialization)结构和整体——部分(whole-part)结构
一般——特殊结构:是一种分类结构,反映了类间的一般与特殊的关系。一般类和特殊类之间是一种“Is a”的关系,如:汽车是一种交通工具。同样,特殊类还可以分为更特殊的类,这样可形成类的层次结构。(这不是抽象类吗- -)
整体——部分结构:反映了类间的整体与部分关系。值得注意的是,整体——部分关系是对对象而言的,而不是对类的。整体——部分关系是一种“has a”的关系,如“汽车”有“发动机”。同样,整体——部分结构也具有层次结构。(像是对象中的属性?)
建造对象——关系模型
对象–关系模型描述了系统的静态结构,它指出了类间的关系(relationship)。类之间的关系有关联、依赖、泛化、实现等。
建造对象——行为模型
对象–行为模型描述了系统的动态行为,它们指明系统如何响应外部的事件或激励(stimulus)。
面向对象设计的一般步骤如下:
-
系统设计
- 选择实现数据管理、界面支持和任务管理的设计策略
- 为系统设计合适的控制机制
- 复审并考虑权衡(折衷)
-
对象设计
-
在过程级别(procedural lavel)设计每个操作,即设计每个操作的实现细节
-
定义内部类
-
为类属性设计内部数据结构
-
-
消息设计
使用对象间的协作和对象–关系模型,设计消息模型
-
复审
复审设计模型并在需要时迭代。
UML概述(Unified Modeling Language)
- 为何研究UML—结束方法大战
- 发展历史
- 1994年Booch在Rational Software Corporation开始了UML的工作,其目标是创建一个“统一的方法”;
- 1995年OOSE的创始人Jacobson加盟到这项工作中,工作重点转移到创建一种统一的建模语言UML
- 1996年6月、10月、1997年1月、11月分别推出了UML0.9、 UML0.91、 UML1.0、 UML1.1
- 1997年11月,OMG(Object Management Group)批准把UML1.1作为基于面向对象技术的标准建模语言;
- UML进行了持续的修订和改进,先后产生了UML1.2、1.3、1.4、1.5版本
- 2004年推出了UML2.0,UML2.0对UML1.x作了重大的修改。
模型元素的定义
模型元素指模型中的实体以及实体间相互联系的关系
视图与图
- 静态视图:静态视图对应用领域中的概念以及与系统实现有关的内部概念建模,主要由类以及类之间的相互关系组成
- 设计视图:设计视图对应用自身的设计结构建模,设计视图由内部结构图、协作图和构件图实现。
- 用况视图:用况视图是列出系统中的用况和执行者,并显示哪个执行者参与了哪个用况的执行。用况的行为用动态视图,特别是交互视图来表示。
- 状态机视图:图对一个类的或对象的可能生命历程建模。当一个事件发生时,它会导致触发对象的一个状态向另一个新状态的迁移,附加在迁移上的动作或活动也同时被执行。
- 活动视图:活动展示了包含在执行计算或工作流中的计算活动的控制流。一个动作是一个基本的计算步,一个活动可描述顺序的和并发的计算。
- 交互视图:交互视图描述系统各部分中消息交换的顺序。交互视图提供了系统中行为的整体视图,也就是说,它展示了多个对象间交叉的控制流。
- 部署视图:部署视图描述了运行时结点上“制品”的分布。
“制品”是一个物理实现单元,如一个文件,它也可以表示一或多个构件的实现(一种表现形式)。
结点是运行时表示计算资源的物理对象,如,计算机、设备或内存。部署视图允许对分配的结果和资源分配进行评估。 - 模型管理视图:模型管理视图对模型自身的组织建模。一个模型由一组保存模型元素(如类、状态机、用况)的包组成。
- 剖面(profile):UML是用一个元模型(metamodel)定义的,元模型是指描述建模语言自身的模型。UML包含三个主要的可扩展结构:约束(constraints)、版型(stereotypes)和标签值(tagged values)。
用况建模
创建用况模型的步骤
- 定义系统
- 确定执行者
- 确定用况
- 描述用况
- 定义用况间的关系
- 确认模型
确定执行者
- 谁使用系统的主要功能(主执行者)?
- 谁需要从系统中得到对他们日常工作的支持?
- 谁需要维护、管理和维持系统的日常运行(副执行者)?
- 系统需要控制哪些硬件设备?
- 系统需要与哪些其他系统交互?
- 哪些人或哪些系统对系统产生的结果(值)感兴趣?
确定用况
- 执行者需要系统提供哪些功能?执行者需要做什么?
- 执行者是否需要读、创建、删除、修改或储存系统中的某类信息?
- 执行者是否要被系统中的事件提醒,或者执行者是否需要提醒系统中某些事情?从功能观点看,这些时间表示什么?
- 执行者的日常工作是否因为系统的新功能(尤其是目前尚未自动化的功能)而被简化或提高了效率?
用况的描述
- 用况通常用正文(text)来描述,也可用活动图来描述。
- 用况的正文描述应包括以下内容:
- 用况的目的:用况的最终目的是什么?它试图达到什么?
- 用况是如何启动(initiate)的:哪个执行者在什么情况下启动用况的执行?
- 执行者和用况之间的消息流:用况与执行者之间交换什么消息或事件来通知对方改变或恢复信息?描述系统与执行者之间的主消息流是什么?以及系统中哪些实体被使用或修改?
其他需求
-
在用况中还可描述一些特殊的需求,这些需求常常是非功能需求,如可用性、安全性、可维护性、负载、性能、自动防故障、数据需求等。如:
前置条件
事件流
特殊需求:系统必须在一秒内响应客户的输入
后置条件
静态建模
- 类和对象模型的基本模型元素有类、对象以及他们之间的关系。系统中的类和对象模型描述了系统的静态结构,在UML中用类图和对象图表示。
- 类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛化、实现等。类图是一种静态模型,它是其它图的基础。一个系统可以有多张类图,一个类也可出现在几张类图中。
- 对象图是类图的一个实例,它描述某一时刻类图中类的特定实例以及这些实例之间的特定链接。对象图使用了与类图相同的符号,只是在对象名下附加下划线,对象名后可接以冒号和类名,即: object-name:class-name
类之间的关系
关联
关联描述了系统中对象之间或其他实例之间的连接。
关联的种类主要有二次关联,多元关联,受限关联,聚集(aggregation)和组合(composition)。
二元关联
二元关联表示为在两个类之间用一条直线连接,直线上可写上关联名。
关联的两端可加上重数(multiplicity),表示该类有多少个对象可与对方的一个对象关联。
允许一个类与自身关联
多元关联
三个或三个以上的类之间可以互相关联
受限关联(qualified association)
受限关联用于一对多或多对多的关联。限定符(qualifier)用来区分关联“多”端的对象集合,它指明了在关联“多”端的某个特殊对象 。左图表示一个目录中可以有多个文件,右图通过限定符“文件名”能唯一指定这些文件中的某一个文件。
聚集和组合
聚集(aggregation)是表示整体一部分关系的一种关联,它的“部分”对象可以是任意“整体”对象的一部分。
对象“人”是对象“组”的成员。
组合(composition)一种更强形式的关联。组合关联具有强的物主身份,即“整体”对象拥有“部分”对象,“部分”对象生存在“整体”对象中。
组合表示成一个实心的菱形,背贴到组合类(整体)的关联端点。虽然每个表示部分的类与表示整体的类之间有单独的关联关系,但为了方便期间,常常把它们的连线和在一起,看起来像棵树。
关联类
UML中可以把关联定义成类,该关联的每个链都是这个类的实例 。
泛化
- 泛化指出类间的“一般——特殊关系”
- 一般类定义了它的特殊类的公共属性和操作
- 对一般类扩展一些属性和/或操作后,可以特化(specialize)成特殊类
- 一般类是特殊类的父类,特殊类是一般类的子类
- 特殊类可以继承一般类的属性和操作
- 字类可以定义自己的属性和操作,也可重新定义父类中的操作,但重新定义的操作必须与父类具有相同的操作特征(signature)
实现
依赖
约束和派生
模板(Tamplates)
模板是一个参数化的模型元素,使用它时参数必须在建模时绑定到实际值。模板的同义词是参数化元素。
模板类不是一个直接可用的类,因为它有未绑定的参数,必须将它的参数绑定到实际值,以生成实际的类。
(a)展示了类模板,其中Array类右上角的虚线框指出模板的参数表,每个参数的形式是:参数名:类型=默认值。当类型缺省时表示该参数的类型是类。(a)表示模板Array有两个参数,T是一个类名,n是一个整型表达式,其默认值为2.模板中间的element:T[n]描述了这个模板是一个由n个类组成的一维数组。使用模板生成实际类的方法有两种。(b)表示通过《bind》<'T->color,n->50>生成一个实际类colorArray。(c)表示通过在类中标记绑定Array<'T->car,n->100>生成一个匿名的实际类。
动态建模
- 动态建模用来描述系统的动态行为,显示对象在系统运行期间不同时刻的动态交互。
- UML中用状态机图、活动图、顺序图、通信图和协作图来建立动态模型
- 状态机图通常是对类描述的补充,它说明该类的对象所有可能的状态,以及哪些事件将导致状态的改变。
- 状态机图描述了对象的动态行为,是一种对象生存周期的模型。
画状态图的步骤
-
列出对象具有的所有状态
状态分为起始状态、结束状态和中间状态。一张状态机图可以有一个起始状态和若干个(可以为0)结束状态。
-
标识导致状态转换的事件
当一个对象接收到某个事件时,会导致从一个状态转换到另一个状态,称为状态迁移(transition)。
-
为状态和迁移定义状态变量和动作
在状态迁移和/或处于某个状态中时都可能需要执行一些相应的动作,综合这些动作,使得对象完成相应的功能。
当状态机图中相应的迁移上未指明事件时,表示当位于迁移箭头源头的状态中的内部动作(包括entry、exit、do以及用户定义的动作)全部执行完后,该状态迁移被自动触发
还有其他图看书吧- -
太多了。
物理体系结构建模
- 类和对象物理上位于哪个程序或进程?
- 程序和进程在哪台计算机上执行?
- 系统中有哪些计算机和其它硬件设备?它们如何相互连接?
- 不同的代码文件之间有什么依赖关系?如果一个指定的文件被改变,那么哪些其它文件要重新编译?