定义
面向对象开发方法将面向对象的思想应用于软件开发过程中,指导开发活动,是建立在“对象”概念基础上的方法学。面向对象方法的本质是主张参照人们认知一个显示系统的方法,完成分析、设计与实现一个软件系统,提倡用人类在现实生活中常用的思维方法来认知和理解描述客观事物,强调最终建立的系统能映射问题域,使得系统中的对象,以及对象之间的关系能够如实地反映问题域中固有的事物及其关系。
面向对象开发方法认为客观世界是由对象组成的,对象由属性和操作组成,对象可按其属性进行分类,对象之间的联系通过传递消息来实现,对象具有封装性、继承性和多态性。面向对象开发方法是以用例驱动的、以体系结构为中心的、迭代的和渐增式的开发过程,主要包括需求分析、系统分析、系统设计和系统实现4个阶段,但是各个阶段的划分不像结构化方法那样清晰,而是在各个阶段之间迭代进行的。
面向对象分析
OOA 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA 与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。
OOA 模型由5个层次和5个活动组成,在这种方法中定义了两种对象类之间的结构,一种称为分类结构;另一种称为组装结构。分类结构就是所谓的一般与特殊的关系;组装结构则反映了对象之间的整体与部分的关系。
面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成
面向对象对象的分析模型的5个层次包括:主题层、对象类层、结构层、属性层、服务层
- 主题层:主题层定义了系统的边界,它将系统划分为若干个主题,每个主题代表系统中的一个主要功能或概念。主题层帮助分析人员从宏观角度理解系统,并确定分析的范围。
- 对象类层:对象类层识别系统中的对象类,即具有相同属性和服务的一组对象。这些对象类是构建系统的基础,它们代表了系统中的主要实体。
- 结构层:结构层描述了对象类之间的关系,包括分类结构和组装结构。分类结构体现了一般与特殊的关系(继承),组装结构则体现了整体与部分的关系(聚合和组合)。
- 属性层:属性层定义了对象类的属性,即对象的特性或数据。这些属性描述了对象的状态,是对象类的重要组成部分。
- 服务层:服务层定义了对象类提供的服务,即对象可以执行的操作。这些服务代表了对象的行为,是对象类功能的具体体现。
面向对象的分析模型的5个活动/步骤包括:标识对象类、标识结构、定义主题、定义属性、定义服务
- 标识对象类:在这个步骤中,分析人员通过研究系统需求,识别出所有的对象类。这通常涉及对系统功能的理解,以及与领域专家的沟通。
- 标识结构:这个步骤中,分析人员确定对象类之间的关系,包括分类结构和组装结构。这有助于理解对象类之间的组织和依赖关系。
- 利用用例及用例图表示需求
- 从业务需求描述出发获取执行者和场景;
- 对场景进行汇总、分类、抽象、形成用例;
- 确定执行者与用例、用例与用例图之间的关系,生成用例图。
- 利用包图及类图表示目标软件系统的总体框架结构
- 根据领域知识、业务需求描述和既往经验设计目标软件系统的顶层架构
- 从业务需求描述中提取“关键概念”,形成领域概念模型
- 从概念模型和用例出发,研究系统中主要的类之间的关系,生成类图
- 利用用例及用例图表示需求
- 定义主题:在这个步骤中,分析人员根据对象类和结构,将系统划分为若干个主题。每个主题都应该具有明确的功能或目的,并且与其他主题相对独立。
- 定义属性:分析人员为每个对象类定义属性,这些属性应该能够准确地描述对象类的状态。属性的选取需要考虑其对系统功能的影响。
- 定义服务:最后,分析人员为每个对象类定义服务,这些服务代表了对象类的行为。服务的定义应该基于对象类需要完成的任务和操作。
OOA 原则
OOA 的原则包括:抽象、封装、继承、分类、聚合、关联、消息通信、粒度控制、行为分析。
- 抽象:抽象是从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质的特征。抽象是形成概念的必要手段。抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面
- 过程抽象:任何一个完成确定功能的操作序列,其使用者都可以把它看作一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的。
- 数据抽象是根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。数据抽象是OOA 的核心原则。它强调把数据和操作结合为一个不可分的系统单位,对象的外部只需要知道它做什么,而不必知道它如何做。
- 封装:封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐藏对象的内部细节。这个概念也经常用于从外部隐藏程序单元的内部表示或状态。
- 继承:特殊类的对象拥有其对应的一般类的全部属性与服务,称作特殊类对一般类的继承。在OOA中运用继承原则,在特殊类中不再重复地定义一般类中已定义的东西,但是,在语义上,特殊类却自动的,隐含的拥有一般类中定义的全部属性和服务。继承原则的好处是:使系统模型比较简练比较清晰。
- 分类:分类就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。
- 聚合:聚合又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事务的描述。
- 关联:关联是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间存在着某些联系。
- 消息通信:这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接的存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA 中要求用消息连接表示出对象之间的动态联系。
- 粒度控制:一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能明察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不考虑具体的细节:考虑某部分的细节时,暂时撇开其余的部分。这就是粒度控制原则。
- 行为分析:现实世界中事物的行为是复杂的,由大量的事物所构成的问题域中各种行为往往相互依赖,相互交织。
面向对象设计
面向对象设计方法(OOD)是OOA 方法的延续,其基本思想包括抽象、封装和可拓展性,其中可拓展性主要通过继承和多态来实现。在OOD 中,数据结构和在数据结构上定义的操作算法封装在一个对象之中。由于现实世界中的事物都可以抽象出对象的集合,所以OOD 方法是一种更接近现实世界,更自然的系统设计方法。
面向对象的设计过程可以分为:设计用例实现方案、设计技术支撑方案、设计用户页面、精化设计模型。
- 设计用例实现方案:UML 的交互图(顺序图、协作图)适用于用例实现方案的表示。该设计方法包含如下三个步骤:
- 提取边界类、实体类和控制类
- 构造交互图,以交互图作为用例的精确实现方案
- 根据交互图精细化类图
- 在UML 交互图中,对每个类的对象都规定了它必须响应的消息以及类的对象之间的消息传递通道。
- 设计技术支撑方案:在许多软件项目中,应用功能往往都需要一组技术支撑机制为其提供服务。例如,数据持久化存储服务、安全控制服务、分布式事务管理服务、并发与同步控制服务和可靠消息服务等。
- 设计用户界面:这个阶段专注于用户界面(UI)的设计,确保用户能够有效地与系统交互。
- 精化设计模型:之前的设计模型可能是粗粒度的,这一步对设计模型进行更加详细的设计
三种类的类型
面向对象设计包含三种类的类型,分别是:实体类,控制类,边界类。
- 实体类
- 来源于领域模型中的类
- 一定有属性,但不一定有操作
- 反映的信息需要在系统中处理,并需要进行持久化存储。持久化存储可由实体类来实现,也可设计专门的数据访问类来完成。
- 边界类
- 边界类用于系统接口与系统外部进行交互,边界对象将系统与其外部环境的变更(例如,与其他系统的接口的百年更、用户需求的变更)分隔开,使这些变更不会对系统的其他部分造成影响。通常情况下,边界类可以既有属性,也有方法。
- 边界类用于封装在用例内、外流动的信息或数据流。边界类位于系统与外界的交界处,包括所有窗体、报表、打印机和扫描仪等硬件的接口,以及与其他系统的接口。
- 要寻找和定义边界类,可以检查用例模型,每个参与者和用例交互至少要有一个边界类,边界类使参与者能与系统交互。
- 控制类
- 控制类是用于控制用例工作的类,应体现应用程序的执行逻辑;一般是由动宾结构的短语转化来的名词。
- 控制类用于对一个或几个用例所特有的控制行为进行建模,控制对象通常控制其他对象,因此,它们的行为具有协调性。
- 控制类将用例的特有行为进行封装,控制对象的行为与特定用例的实现密切相关,当系统执行用例的时候,就产生了一个控制对象,控制对象经常在其对应的用例执行完毕后消亡。通常情况下,控制类没有属性,但一定有方法。
面向对象编程
- OOP 是一种计算机编程架构。
- OOP 的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。
- OOP 达到了软件工程的 3个主要目标:重用性、灵活性和拓展性。
- OOP = 对象 + 类 + 继承 + 多态+ 消息,其中核心概念是类和对象。
- 面向对象程序设计方法是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认知世界、解决现实问题的方法和过程,也使得描述问题的问题空间与问题的解决方案空间在一个结构上尽可能一致,把客观世界中的实体抽象为问题域中的对象。
- 面向对象程序设计以对象为核心,该方法认为程序由一系列对象组成。类是对现实世界的抽象,包括表示静态属性的数据和对数据的操作,对象是类的实例化。对象间通过消息传递相互通信,来模拟现实世界中不同实体间的联系。在面向对象的程序设计中,对象是组成程序的基本模块。
oop的特点
面向对象编程的特点包括:封装、集成、多态
- 封装
- 封装是指将一个计算机系统中的数据以及与这个数据相关的一切操作语言组装到一起,一并封装在一个有机的实体中,把它们封装在一个“模块”中,也就是一个类中,为软件结构的相关部件所具有的模块性提供良好的基础。
- 在面向对象技术的相关原理以及程序语言中,封装的最基本单位是对象,而使得软件结构的相关部件的实现“高内聚,低耦合”的“最佳状态”便是面向对象技术的封装性所需要实现的最基本的目标。
- 对于用户来说,对象是如何对各种行为进行操作、运行、实现等细节是不需要刨根问底了解清楚的,用户只需要通过封装外的通道对计算机进行相关方面的操作即可。
- 继承
- 继承是面向对象技术的另外一个重要特点,指的是两种或者两种以上的类之间的联系与区别。在面向对象技术中,继承是指一个对象针对于另一个对象的某些独有的特点,能力进行复制或者延续。
- 如果按照继承源进行划分,则可以分为单继承与多继承;
- 单继承:一个对象仅仅从另外一个对象中继承其相应的特点
- 多继承:一个对象可以同时从另外两个或者两个以上的对象中继承所需要的能力与特点,并且不会发生冲突等现象
- 如果从继承中包含的内容进行划分,则继承可以分为4类,分别是:取代继承、包含继承、受限继承、特化继承。
- 取代继承:一个对象在继承另一个对象的能力与特点之后,将父对象进行取代
- 包含继承:一个对象再将另一个对象的能力与特点进行完全的继承后,又继承了其他对象所包含的相应的内容,结果导致这个对象所具有的能力与特点大于等于父对象,实现了对于父对象的包含
- 受限继承:受限继承是指子类继承父类,但是对父类的一些方法或属性进行限制,使得子类只能访问或使用父类的一部分功能。
- 特化继承:特化继承是指子类继承父类,并且专门化为处理某一特定情况或特定类型的对象。子类通常会有更具体的实现,这些实现只适用于特定的情况。
- 多态
- 从宏观的角度讲,多态是指在面向对象技术中,当不同的多个对象同时接受到同一个完全相同的消息之后,所表现出来的动作是各不相同的,具有多种形态
- 从微观的角度讲,多态是指在一组对象的一个类中,面向对象技术可以使用相同的调用方式来对相同的函数名进行调用,即便这若干个具有相同函数名的函数所执行的动作是不同的。
数据持久化与数据库
在面向对象开发方法中,对象只能存在于内存中,而内存不能永久保存数据,如果要永久保存对象的状态,需要进行对象的持久化。对象持久化就是把内存中的对象保存到数据库或可永久保存的存储设备中。
在多层软件设计和开发中,为了降低系统的耦合度,一般会引入持久层,即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联,持久层的设计实现了数据处理层内部的业务逻辑和数据逻辑的解耦。
主流的持久化框架
- Hibernate
- 全自动ORM 框架
- 特点:
- 提供全映射解决方案,能够自动将Java对象映射到数据库表。
- 支持复杂的关联映射和继承映射。
- 有强大的HQL(Hibernate Query Language)查询语言,类似于SQL。
- 对数据库的操作较为透明,开发者不需要编写大量的SQL语句。
- 需要配置XML映射文件或使用注解来定义对象与数据库表的关系。
- iBatis
- 半自动ORM 框架
- 特点:
- 允许开发者手动编写SQL语句,并支持简单的映射规则。
- 相比Hibernate,MyBatis提供了更多的控制,可以直接操作SQL。
- SQL与Java代码分离,便于管理和维护。
- 适合复杂查询和优化,因为SQL的编写更加灵活。
- 配置相对简单,不需要复杂的映射文件。
- JDO
- Java 持久层框架
- 特点:
- 定义了一组API,用于访问多种数据存储,不仅仅是关系数据库。
- 支持透明持久化,对象不需要明确地保存到数据库中。
- 可以使用注解或XML来定义对象与数据存储的映射。
- 提供了查询语言JDOQL,类似于SQL。
- 适用于多种数据源,包括关系数据库、对象数据库、XML数据库等。
- 特点:
- Java 持久层框架
持久化框架对比
-
自动化程度:
-
Hibernate:全自动,几乎不需要编写SQL。
-
MyBatis:半自动,需要开发者编写SQL。
-
JDO:全自动,提供透明的持久化操作。
-
-
适用场景:
-
Hibernate:适用于需要高度自动化和复杂映射的场景。
-
MyBatis:适用于需要精细控制SQL和优化性能的场景。
-
JDO:适用于需要跨多种数据源持久化数据的场景。
-
-
性能和灵活性:
-
Hibernate:性能一般,但提供高度灵活性。
-
MyBatis:性能较好,因为可以精细控制SQL。
-
JDO:性能适中,灵活性好,支持多种数据源。
-
-
配置和维护:
-
Hibernate:配置相对复杂,但维护较为简单。
-
MyBatis:配置简单,但需要手动维护SQL。
-
JDO:配置和维护适中,但支持多种数据源可能需要更多的工作。
-