四、面对对象方法学介绍
1、简介
传统软件工程方法学适用于中小型软件产品开发;
面向对象软件工程方法学适用于大型软件产品开发;
面向对象方法学方程式:OO=对象+类+继承+传递消息实现通信
对象:具有相同状态的一组操作的集合,对状态和操作的封装。
类:是一个抽象数据类型,它对具有相同状态和相同操作的一组相似对象的定义。
实例:实例是由某个特定类所描述的一个具体对象。
消息:要求某对象执行某个操作的规格说明。
- 接收消息的对象:对象名
- 消息名:函数名
- 0或多个变元:函数值
方法:对象执行的操作,即类中定义的服务。
属性:类中所定义数据,对客观世界实体具体性质的抽象。
继承:子类自动共享基类中定义的属性和方法的机制。
多态性:在类等级不同层次可共享一个方法名,不同层次每个类按各自需要实现这个方法。
- A是基类,B和C是A的派生类,多态函数Test参数是A的指针,Test函数可以引用A、B、C的对象。
重载:在同一作用域内,参数特征不同的函数可使用相同的名字。
运算符重载:同一运算符可施加于不同类型操作数上面。
面向对象方法学与人类习惯思维方法一致,稳定性好软件系统结构根据问题领域模型建立,功能需求变
化不会引起软件结构整体变化,作局部性修改。可重用性好、易开发大型软件产品可维护性好。
2、UML(Unified Modeling Language)统一建模语言介绍
UML 全称为 Unified Modeling Language,是图示化、说明、构造一个软件系统并生成其文档的标准语言。它独立于开发过程,可与大多数面向对象开发过程配合使用。UML独立于程序设计语言,可用C++、Java等任何一种面向对象程序设计语言实现。
UML构成:
九大图:
静态建模
- 用例图(Use Case Diagrams)
- 类图(Class Diagrams)
- 对象图(Object Diagrams)
动态建模
- 顺序图(Sequence Diagrams)
- 协作图(Sequence Diagrams)
- 状态图(State Diagrams)
- 活动图(Activity Diagrams)
物理建模
- 配置图(Deployment Diagrams)
- 构件图(Component Diagrams)
五视图:
- 用例视图:定义了系统的外部行为,是最终用户、分析人员和测试人员所关心。该视图定义了系统的需求,因此约束了描述系统设计和构造的某些方面的所有其他视图。
- 设计视图:描述的是支持用例视图中规定的功能需求的逻辑结构。它由程序组件的定义,主要是类、类所包含的数据、类的行为以及类之间交互的说明组成。
- 实现视图:描述构造系统的物理组件,这些组件包括如可执行文件、代码库和数据库等内容。这个视图中包含的信息与配置管理和系统集成这类活动有关。
- 进程视图:进程视图包括形成并发和同步机制的进程和线程。
- 部署视图:部署视图描述物理组件如何在系统运行的实际环境(如计算机网路)中分布。
*不同的视图突出特定的参与群体所关心的系统的不同方面,通过合并所有五个视图中得到的信息就可以形成系统的完整描述 *
3、UML-静态建模
(1)用例图(Use Case Diagrams)
用例图描述外部执行者(actor)与系统的交互,表达系统功能,即系统提供服务。
主要元素:用例和执行者。
如何发现执行者?
提问: 谁使用该系统;谁改变系统的数据;谁从系统获取信息;谁需要系统的支持以完成日常工作任务;谁负责维护、管理并保持系统正常运行;系统需要应付那些硬件设备;系统需要和那些外部系统交互;谁对系统运行产生的结果感兴趣。
如何发现用例?
提问: 执行者需获取何种功能,需要作什么;执行者需读取、产生、删除、修改或存储系统中某种信息;系统发生事件和执行者间是否需要通信。
用例:执行者与计算机一次典型交互,代表系统某一完整功能。
椭圆形+名字表示:
①用例是从用户观点分析而不是系统观点。即联想生活的具体工作过程而不是抽象描述。②用例就是描述一个实际功能,不要太过细化。可理解成就是在找函数名,函数实现是在其内部的,这里不要搞出来。
用例间关联:泛化关系(一般与特殊关系)、扩展关系、包含关系
泛化关系(一般与特殊关系):顶部空心三角的实线表达,由特殊指向一般。A是B和C的父类,B,C具有公共类(父类)A,说明A是B,C的一般化(概括,也称泛化)
扩展关系:虚线箭头+
<<extend>>
说明表述。允许一个用例扩展另一用例提供的功能,与泛化关联类似,有更多规则限制:基本UseCase必须声明若干“扩展点”,扩展UseCase只能在扩展点上增加新行为。例如,系统中允许用户对查询的结果进行导出、打印。对于查询而言,能不能导出、打印查询都是一样的,导出、打印是不可见的。导入、打印和查询相对独立,而且为查询添加了新行为。
包含关系:虚线箭头+
<<include>>
说明表述。一个基本UseCase行为包含另一个UseCase行为。例如:Check Credit检查输入的信用卡号是否有效,有足够资金。处理Purchase Ticket用例,总运行Check Credit用例
执行者:描述与系统交互的人或物,代表外部实体(如用户、硬件设备或其它软件系统)。
人形+名字表示:
执行者关联:泛化关系(一般与特殊关系)
泛化关系(一般与特殊关系):顶部空心三角的实线表达,由特殊指向一般
例:例:建立一航空公司的机票预定系统,让客户通过电话或网络买票、改变订票、取消订票、预定旅馆、租车等等。
当一个用例使用另一个用例时,这两个用例之间就构成了使用关系.
向一个用例中添加一些动作后构成了另一个用例,这两个用例之间的关系就是扩展关系,
后者称为扩展用例。
(2)类图(Class Diagrams)
1、类图介绍
类图是面向对象建模最常用的图,描述类与类间的静态关系。
类属性的语法:[可见性] 属性名[:类型] [=初值](带[]说明可省略。)
- 可见性:公有(+)、私有(-)、保护(#)
- 公有:可被外部对象访问
- 私有:不可为外部对象访问,只能为本类对象使用
- 保护:可为本类对象和子类对象访问。
类操作的语法:[可见性]操作名[(参数列表)] [:返回类型]
例:
2、类的版型:边界类、控制类、实体类、接口类
- 边界类:位于系统与外界的交界处
- 用户接口边界类User interface boundary class:窗体(form)、对话框(dialog box)、报表(report)
- 外部系统边界类External system boundary class:表示通讯协议(如TCP/IP)的类、直接与外部设备交互的类、直接与外部系统交互的类
- 控制类:每个用例通常有一个控制类,控制用例中的事件顺序,控制类也可以在多个用例间共用。
- 实体类:用于对必须存储的信息和相关行为建模的类。
- 接口类:描述一个类或构件服务的操作集,不含属性,只包含方法的声明。
- 表示:
3、类图的关系
四种:关联、泛化(继承)、依赖、实现。
用重数表示关联中的数量关系:n表示多;0..0 表示0; 0..1表示0或1;0..n表示0或多;1..1表示1; 1..n 表示 1或多;
(1)关联关系:普通关联、导航关联、限定关联、关联类、聚合、组合
- ①普通关联:普通关联:双向,用实线连接两个类。
- 例如:一个作家可以有1个或多个计算机,一个计算机可以属于多个作家。
- 例如:一个作家可以有1个或多个计算机,一个计算机可以属于多个作家。
- ②导航关联:关联是单向的,用实线箭头和导航关系连接两个类。
- 例如:人拥有汽车
- 例如:人拥有汽车
- ③限定关联:限定符放在关联关系末端的矩形内。
- 本来是多对多的关系,但是现在需要制定一个产品订货,限定产品ID为xx的产品只能用唯一的订货作业线订货。
- 本来是多对多的关系,但是现在需要制定一个产品订货,限定产品ID为xx的产品只能用唯一的订货作业线订货。
- ④关联类:如果关联需要有一些信息需要记录的话,用关联类记录关联附加信息。
- 例:公司雇佣人,使用job记录雇佣产生的信息。
- 例:公司雇佣人,使用job记录雇佣产生的信息。
- ⑤聚合(Aggregation):整体与部分关系,较弱情况。 空心菱形端代表整体事物类;代表部分事物类可属于整体事物类。
- 聚合关系中代表部分事物对象与代表聚合事物对象生存期无关,删除聚合对象不一定删除代表部分事物对象。
- ⑥组合(Composition):是整体与部分较强关系,实心菱形端代表整体事物类,代表部分类完全隶属于整体类。
- 组合中删除组合对象,同时也就删除代表部分事物对象。
- ①普通关联:普通关联:双向,用实线连接两个类。
(2)泛化关系,是指类间的“一般-特殊”关系。也就是继承。顶部空心三角的实线表达,由特殊指向一般。
(3)依赖关系:一模型元素变化必影响另一模型元素。虚线箭头表述,依赖的类指向独立的类
(4)实现:是指一个类描述了另一个类保证实现的合约。顶部是空心三角的虚线箭头表示。由一个类指向实现的类。
- 系统设计视图中的类AccountBusinessRules(帐户商业规则)由接口类IRuleAgent(规则代理)实现。
- 系统设计视图中的类AccountBusinessRules(帐户商业规则)由接口类IRuleAgent(规则代理)实现。
(3)对象图(Object Diagrams)
*对象图表示一组对象之间联系,对象图是类图的实例。 *
类图和对象图是建立对象模型主要工具,用于各类系统:信息管理系统、数据库系统、Web应用系统、实时控制系统。
(4)包
UML中包是对模型元素成组组织的通用机制。 把语言相近,可能一起变更模型元素组织在包里,便于理解复杂系统。包图由包和包间联系构成,包的联系:依赖、泛化。
包依赖:一个元素定义改变引起另一元素发生相应改变,用虚线箭头表示包间依赖关系,虚箭线从依赖包指向独立包。
包泛化:两个包间有一般特殊关系,实线+空心三角箭头表示包间泛化关系。
4、UML-动态建模
(1)消息
- 简单消息:没有描述通信的细节。实线箭头表示。
- 同步消息:调用者发出消息后等待消息返回后再继续执行。实线箭头结尾加×表示
- 异步消息:调用者发出消息后不等待消息返回就继续执行。
- 返回消息:代表从过程调用的返回。虚线箭头表示
- 过程控制流:可省,隐含每个调用有配对返回
- 非过程控制流(如异步):不可省
(2)顺序图(Sequence Diagrams)
顺序图(sequence diagram) 描述对象间交互关系。对象用矩形框表示,框内标对象名;
矩形框下的竖线代表对象的生命线;对象生命线上的细长矩形框表示对象被激活;对象间通信用对象间水平消息线表示,箭头形状表明消息类型(同步、异步或简单)。
注:已经声明的对象可以将其图像表示代替矩形框更加清晰。
(3)协作图(Sequence Diagrams)
协作图(Collaboration diagram) 描述相互协作对象间交互关系和链接关系。顺序图着重表现交互时间顺序;协作图着重表现交互对象的静态链接消息;协作图显示对象间处理过程的分布。
顺序图着重表现交互时间顺序;协作图着重表现交互对象的静态链接消息。协作图可以由顺序图转化。
(4)活动图(Activity Diagrams)
活动图(Activity diagram)描述为完成某一个用例需要做的活动以及这些活动的执行顺序。活动图由状态图变化而来,各自用于不同目的。状态图着重描述对象的状态变化以及触发状态变化的事件。活动图着重描述各种活动的执行顺序。
- 业务活动流的分劈和接合用粗短线(同步杆)表示。一入多出为分劈; 多入单出为接合。
- 注意区分同步杆和分支,分支是选择一个路,同步杆是两者均做。
- 泳道:对象对活动的责任,泳道把活动分成若干组,把组指定给对象,对象履行该组活动。
- 泳道说明了是哪个对象履行功能