目录
1. 面向对象的定义
面向对象是把事物分解成一个个对象,然后由对象之间分工与合作,面向对象是以对象功能来划分问题,而不是步骤。在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工。
2. 面向对象方法学的定义
面向对象方法学是一种以数据或信息为主线,把数据和处理相结合的方法,即把对象作为由数据及可以施加在这些数据上的操作所构成的统一体。
面向对象的方法可以用下列方程来概括:
OO = object(对象)+classes(类)+inheritance(继承)+communication with messages
3. 面向对象方法学的要点
对象
- 面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。
- 用对象分解取代了传统方法功能分解,对象是从客观世界的实体抽象而来的,是不固定的。
类
- 把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法。
- 数据用于表示对象静态属性,是对象的状态信息。
- 类中定义的方法,是允许施加于该类对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。
继承性
按子类与父类的关系,把若干个对象类组成一个层次结构的系统。子类自动具有和上层的父类相同的数据和方法,而且低层的特性将屏蔽高层的同名特性。
- 在C++中,子类可以继承父类,有public,private,protect三种继承方式。
- 子类成员会对同名父类成员进行屏蔽,这种情况我们称之为隐藏,或者叫做重定义。
封装性
- 对象彼此之间仅能通过传递消息互相联系。
- 对象是进行处理的主体,必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作 .
- 一切局部于该对象的私有信息,都被封装在该对象类的定义中,就好像装在一个不透明的黑盒子中一样,在外界是看不见的,更不能直接使用。
①认为客现世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合面成。面向对象方法用对象分解取代了传统方法的功能分解。
②把所有对象都划分成各种对象类,每个类都定义了一组数据和一组方法。
③按照子类(或称为源生类)与父类(或称为基类)的关系.把若干个对象类组成一个层次结构的系统(也称为类等级)。
④对象彼此之间仅能通过传递消息互相联系。
4. 面向对象方法学的优点
- 与人类习惯的思维方法一致
1.1 面向对象的软件技术以对象为核心,用这种技术开发出的软件系统由对象组成。
1.2. 对象是由描述内部状态表示静态属性的数据,以及可以对这些数据施加的操作(对象的动态行为),封装在一起所构成的统一体。
1.3. 面向对象的设计方法基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决问题。
1.4 面向对象方法学的基本原则是按照人类习惯的思维方法建立问题域的模型,开发出尽可能直观,自然地表现求解方法的软件系统。
1.5 面向对象的软件系统中使用的对象,是对客观世界中实体的抽象。
- 稳定性好
2.1 面向对象的软件系统的结构是根据问题领域的模型建立起来的,而不是基于对系统应完成的功能分解,所以,当对系统的功能需求变化时并不会引起软件结构的整体变化,往往仅需要作一些局部性的修改。
2.2 由于现实世界中的实体是相对稳定的,因此,以对象为中心构造的软件系统也是比较稳定的。
- 可重用性好
3.1 对象固有的封装性和信息隐藏机制,使得对象的内部实现与外界隔离,具有较强的独立性。
3.2 对象是比较理想的模块和可重用的软件成分。
3.3 面向对象的软件技术利用可重用的软件成分构造新的软件系统时,有很大的灵活性。
3.4 有两种方法可以重复使用一个对象类:一种方法是创建该类的实例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类。
- 较易开发大型软件产品
用面向对象方法学开发软件时,构建软件系统的每个对象就像一个微型程序,有自己的数据、操作、功能和用途,因此,可以把一个大型软件产品分解成一系列本质上相互独立的小产品来处理,这就不仅降低了开发的技术难度,而且也使得开发工作的管理比较容易。
- 可维护性好
面向对象的软件稳定性比较好。面向对象的软件比较容易理解。易于测试和调试。
5. 面向对象分析
在面向对象分析中,主要由对象模型、动态模型和功能模型组成。对象模型是最基本、最重要、最核心的。
面向对象分析过程 | 面向对象设计过程 | 是现阶段 |
---|---|---|
构造出完全独立于实现的应用域模型 | 把求解域的结构逐渐加入到模型中 | 把应用域和求解域的结构都编成程序代码并进行严格的测试验证 |
5.1 对象模型
描述系统数据结构
类之间的几种关系:泛化、实现、关联(又分为一般关联、聚合、组合、依赖)
5.1.1 类图画法
5.1.1.1 类图的概念
- 显示出类、接口以及它们之间的静态结构和关系
- 用于描述系统结构化设计
5.1.1.2 类图的元素
- 类图也可以包含注解和限制。
- 类图中也可以包含包和子系统,这两者用来将元素分组。
- 有时可将类的实例放到类图中。
5.1.1.3 类
类是对一组具有相同属性、操作、关系和语义的对象的抽象,它是面向对象系统组织结构的核心,包括名称部分、属性部分和操作部分。
名称 | 学生 |
---|---|
属性 | +姓名:string |
操作 | +学习() |
类属性的语法
[可见性] 属性名 [:类型] [=初始值] [{属性字符串}]
可见性:公有(Public)“+”、私有(Private)“-”、受保护(Protected)“#”
类操作的语法为
[可见性] 操作名 [(:参数表)] [:返回类型] [{属性字符串}]
可见性公有(Public)“+”、私有(Private)“-”、受保护(Protected)“#”、包内公有(Package)“~”
参数表
定义方式
名称:类型
若存在多个参数,将各个参数用逗号隔开;
参数可以具有默认值;属性字符串
在操作的定义中加入一些除了预定义元素之外的信息。
5.1.1.4 接口
一个类可以实现一个或多个接口
与类图的区别主要是顶端有<>显示:
《interface》Person |
---|
+吃饭() |
也可以用一个空心圆表示:
5.1.1.5 协作
协作是指一些类、接口和其他的元素一起工作提供一些合作的行为,这些行为不是简单得将元素加能得到的。
5.1.1.6 关系
5.1.2 类的关系
5.1.2.1 泛化关系
语义
类和子类的关系,接口和子接口的关系;
一个类(称为子类、子接口)继承另外一个类(称为父类、父接口)的功能,并可以增加它自己的新功能;语法
extends
符号
一条带空心三角箭头的实现,从子类指向父类,或者子接口指向父接口;
5.1.2.2 实现关系
语义
类和接口之间的关系;
一个类可以实现多个接口,实现所有接口的功能;
体现了规范和实现分离的原则;语法
implements
符号
实现用一条带空心三角箭头的虚线表示,从类指向实现的接口;
5.1.2.3 依赖关系
语义
一个类A使用到了另一个类B,但是这种关系具有偶然性、临时性、非常弱的,但是类B的变化会影响到类A;
语法
类B作为类A的方法的参数(或者局部变量)存在;
符号
实现用一条带空心三角箭头的虚线表示,从类指向实现的接口;
5.1.2.4 关联关系
语义
比依赖关系强,必然的,长期的,强烈的;
分为单向关联(只是班级中增加了学生)、双向关联(在学生中也添加班级属性)
分为一对一(学生和学生证)、一对多(班级和学生)、多对多关联(学生和课程)
有两个类的关联(客户和订单、订单和商品)、还有一个类和自身关联(领导也是员工)语法
类B作为成员变量形成于类A中;
符号
由类A指向类B的带箭头虚线表示;
双向关联可以取消两个箭头;
5.1.2.5 聚合关系
语义
关联关系的一种特例;
整体和部分的关系;
整体部分可以分离,整体的生命周期和部分生命周期不同;
has-a的关系、计算机与CPU的关系、公司与员工的关系、班级与学生的关系;语法
同关联关系;
符号
空心菱形加实线箭头;
5.1.2.6 组合关系
语义
关联关系的一种特例;
整体和部分关系、整体部分不可分离、比聚合更强;
contains-a的关系;
整体的生命周期和部分的生命周期相同;
人和四肢的关系;语法
同关联关系;
符号
实心菱形加实线箭头;
复杂问题(大型系统)的对象模型通常由下属五个层次组成:主题层、类与对象层、结构层、属性层、服务层。
5.2 动态模型
描述系统控制结构
5.2.1 动态模型的概念
动态模型表示瞬时的、行为化的系统控制性质,它规定了对象模型中的对象的合法变化序列。
5.2.2 动态模型建模
用UML提供的状态图来描绘对象的状态、触发状态转换的事件以及对象的行为。每个类的动态行为用一张状态图来描绘,各个类的状态图通过共享事件合并起来,从而构成系统的动态模型,即动态模型是基于事件共享而互相关联的一组状态图的集合。
5.2.2.1 顺序图/时序图
四个元素
对象 Object
生命线 Lifeline
消息 Message
激活 Activation
5.2.2.2 协作图
- 描述对象间的组织协作关系,它也可以体现出系统用例的行为
- 协作图由参与者,对象,连接和消息等基本元素组成
5.2.2.3 状态图
- 状态图主要用来描述一个对象在其生存期间的动态行为,表现一个对象所经历的状态序列,引起状态转移的事件,以及因状态转移而伴随发生的动作
- 一般可以状态机对一个对象的生命周期建模
- 状态图是用于显示状态机的,重点在于描述状态之间的控制流
5.2.2.3.1 状态图与活动图的比较
描述重点不同
- 状态图描述的是对象的状态及状态之间的转移
- 活动图描述的是从活动到活动的控制流
使用场合不同
- 如果是为了显示一个对象在其生命周期内的行为,则使用状态图较好
- 如果目的是分析用例,理解涉及多个用例的工作流程,或者使用多线程应用等,则使用活动图较好
5.3 功能模型
描述系统功能
5.3.1 功能模型的概念
5.3.1.1 功能模型的定义
功能模型表示变化的系统的功能性质,它指明了系统应该做什么,因此更直接地反映了用户对目标系统的需求。
5.3.1.2 功能模型的组成
功能模型由一组数据流图组成
5.3.2 用例图(重点)
UML提供的用例图也是进行需求分析和建立功能模型的强有力工具。在UML中把用用例图建立起来的系统模型称为用例模型。
5.3.2.1 用例图的定义
用例模型描述的是外部行为者所理解的系统功能。用例模型的建立是系统开发者和用户反复讨论的结果,它描述了开发者和用户对需求规格所达成的共识。
5.3.2.2 用例图的表示
5.3.2.2.1 系统
定义
系统被看作是一个提供用例的黑盒子,内部如何工作、用例如何实现,这些对于建立用例图模型来说都是不重要的
表示
系统用方框表示,其边线表示系统的边界,用于划定系统的功能范围,定义了系统所具有的功能。描述该系统功能的用例置于方框内,代表外部实体的行为者置于方框外
5.3.2.2.2 用例
定义
一个用例是可以被行为者(参与者)感受到的,是一个系统的完整的功能。在UML中把用例定义成系统完成的一系列动作
表示
在UML中,椭圆代表用例。用例通过关联与行为者(参与者)连接,关联指出一个用例与哪些行为者(参与者)交互,这种交互是双向的
特征
- 用例代表某些用户可见的功能,实现一个具体的用户目标
- 用例总是被行为者(参与者)启动的,并向行为者(参与者)提供可识别的值
- 用例必须是完整的
注意
用例是一个类,它代表一类功能而不是使用该功能的某个具体实例。用例的实例是系统的一种实际使用方法,通常把该用例称为脚本。脚本是系统的一次具体执行过程
5.3.2.2.3 行为者(参与者)
定义
行为者(参与者)是指与系统交互的人或其它系统,它代表外部实体。使用用例并且与系统交互的任何人或物都是行为者(参与者)。行为者(参与者)代表一种角色,而不是某个具体的人或物。
表示
在UML中,线条人代表行为者。在用例图中用直线连接行为者(参与者)和用例,表示两者之间交换信息,称为通信联系。行为者触发用例,并与用例交换信息。单个行为者可与多个用例联系,一个用例也可与多个行为者联系。
5.3.2.2.4 用例关系
扩展关系
向一个用例中添加一些动作后构成了另一个用例,这两个用例之间的关系就是扩展关系,后者继承前者的一些行为,通常把后者称为扩展用例。
使用关系(包含关系)
一个用例使用另一个用例时,这两个用例之间就构成了使用关系(包含关系)
5.3.2.2.4.1 用例关系的异同
- 都是从几个用例中抽取那些公共的行为并放入一个单独的用例中,而这个用例被其它用例使用(包含)或扩展
- 使用(包含)和扩展的目的是不同的。在描述一般行为的变化时采用扩展关系。
- 在两个或多个用例中出现重复描述又想避免这种重复时,采用使用关系(包含关系)
5.3.2.2.5 实例
例题1 学生管理系统报到登记
例题2 网络教学系统(类似于学习通查阅使用)
例题3 借阅图书
系统的借阅者为学生和教师,系统为借阅者提供查询图书、借阅图书、归还图书的服务。学生最多可借阅5本,教师最多可借阅20本。在借阅和归还图书 时,要先“验证借阅者的身份”。归还图书时,如果超期,要进行罚款。如果教师想借阅的书已被借空,教师还可以通过预约图书的服务预约该书, 预约后可优先借阅该书
例题4 火车票订购系统
在火车票预订系统中,客户可以进行购买车票、退订车票、查询余票和查询列车时刻四个操作。不管是购买车票还是退订车票,用户都必须先进行登录系统操作。其中查询列车时刻主要包括按站站查询和按车次查询两种方式。如果在登录系统的过程中忘记密码,则还可使用找回密码功能。
例题5 购买商品
系统拥有注册功能,顾客注册后进行登录,才能在系统中购买商品;
顾客可以通过系统浏览商品,查看商品的详细信息,购买自己喜欢的商品;
顾客付费方式要多样化,既可以通过银行的在线支付功能付款,也可通过汇款方式付款;
系统拥有商品的促销功能,对于某些系统指定的商品或用户购买的商品金额超过一定数量时,在顾客结账时给予优惠;
用例图顾客登录后,可以使用留言功能对商品或服务留言评价;
系统的管理员可以使用留言功能对顾客提出的疑问做出解答,还可以管理注册的用户;
录入员能够更新商品信息,包括增加新商品和对现有商品信息的更新;
系统允许多人同时在线,进行商品的浏览和购买操作。
例题6 网上选课
在学生信息管理系统的“网上选课模块”中,学生可以进行“查看课程信息”、“选择课程”和“删除已选课程”三个操作。“查看课程信息”主要包括“按课程编号查看”和“按课程名查看”两种方式。
管理员可以进行 “维护课程信息” 操作。
学生和管理员的所有操作均需“登录系统”后方可完成。如果在“登录系统”的过程中忘记密码,则还可使用“找回密码”功能。
例题7 棋牌馆管理系统
在棋牌馆管理系统中,客户通过网络进行预订座位操作,其中需要检查座位信息。如果没有空闲或满意的座位,则选择处理等候队列。
当客户到棋牌馆后,总台服务员安排座位,其中需要检查座位信息。
客户要离开棋牌馆时,总台服务员需处理结账,支持处理现金结账和通过银联POS系统处理银行卡结账两种方式。
6. 三种模型比较
- 针对每个类建立的动态模型,描述了类实例的生命周期或运行周期
- 状态转换驱使行为发生,这些行为在数据流图中被映射成处理,在用例图中被映射成用例,它们同时与类图中的服务相对应
- 功能模型中的处理应对于对象模型中的类所提供的服务
- 数据流图中的数据存储,以及数据的源点/终点,通常是对象模型中的对象
- 数据流图中的数据流,往往是对象模型中对象的属性值,也可能是整个对象
- 用例图中的行为者,可能是对象模型中的对象
- 功能模型中的处理可能产生动态模型中的事件
- 对象模型描述了数据流图中的数据流、数据存储以及数据源点/终点的结构
面向对象方法开发软件,通常需要建立3种模型:
对象模型----描述系统数据结构。
动态模型----描述系统控制结构。
功能模型----描述系统功能。
这三种模型都涉及数据、控制、操作等概念,但每种模型描述的侧重点不同。
一个典型的软件系统组合了这三方面的内容,它使用数据结构(对象模型)、执行操作(动态模型),并且完成数据值的变化(功能模型)。