面向对象范式


面向对象(OO)范式的形成源于一种新的编程方法的最初概念,而对设计和分析方法的兴趣则要晚得多。OO分析和设计范式是OO编程语言广泛采用的逻辑结果。

  • 第一种面向对象的语言是Simula(真实系统的模拟),由挪威计算中心的研究人员于 1960 年开发。

  • 1970 年,Alan Kay和他在 Xerox PARC 的研究小组创建了一台名为Dynabook的个人计算机,以及第一个用于对 Dynabook 进行编程的纯面向对象编程语言 (OOPL) - Smalltalk。

  • 20世纪80年代,Grady Booch发表了一篇题为“面向对象设计”的论文,主要介绍了编程语言Ada的设计。在随后的版本中,他将自己的想法扩展到完整的面向对象的设计方法。

  • 20 世纪 90 年代,Coad将Behave思想融入到面向对象的方法中。

其他重要的创新是James Rum Baugh的对象建模技术 (OMT) 和Ivar Jacobson的面向对象软件工程 (OOSE) 。

OO范式简介

OO 范式是任何软件开发的重要方法。大多数架构风格或模式(例如管道和过滤器、数据存储库和基于组件)都可以使用此范例来实现。

面向对象系统的基本概念和术语 -

目的

对象是面向对象环境中的现实世界元素,可能具有物理或概念存在。每个对象都有 -

  • 将其与系统中其他对象区分开来的标识。

  • 确定对象的特征属性以及对象所拥有的属性值的状态。

  • 表示对象在其状态变化方面执行的外部可见活动的Behave。

可以根据应用程序的需要对对象进行建模。一个物体可能有物理存在,如顾客、汽车等;或无形的概念存在,如项目、流程等。

班级

类表示具有相同特征属性并表现出共同Behave的对象的集合。它给出了蓝图或可以从中创建的对象的描述。创建对象作为类的成员称为实例化。因此,对象是类的实例。

一个类的组成部分是 -

  • 要从类实例化的对象的一组属性。一般来说,一个类的不同对象的属性值有一定的差异。属性通常称为类数据。

  • 描述类对象Behave的一组操作。操作也称为函数或方法。

例子

让我们考虑一个简单的类 Circle,它表示二维空间中的几何图形圆。该类的属性可以识别如下 -

  • x-坐标,表示中心的 x-坐标
  • y 坐标,表示中心的 y 坐标
  • a, 表示圆的半径

它的一些操作可以定义如下 -

  • findArea(),计算面积的方法
  • findCircumference(),一种计算周长的方法
  • scale(),增加或减少半径的方法

封装

封装是将属性和方法在类中绑定在一起的过程。通过封装,类的内部细节可以对外部隐藏。它允许只能通过类提供的接口从外部访问类的元素。

多态性

多态性最初是一个希腊词,意思是采取多种形式的能力。在面向对象的范例中,多态性意味着以不同的方式使用操作,具体取决于它们所操作的实例。多态性允许具有不同内部结构的对象具有共同的外部接口。多态性在实现继承时特别有效。

例子

让我们考虑两个类,Circle 和 Square,每个类都有一个方法 findArea()。尽管类中方法的名称和用途相同,但每个类的内部实现(即计算面积的过程)不同。当 Circle 类的对象调用其 findArea() 方法时,该操作会查找圆的面积,而不会与 Square 类的 findArea() 方法发生任何冲突。

人际关系

为了描述一个系统,必须提供系统的动态(Behave)和静态(逻辑)规范。动态规范描述了对象之间的关系,例如消息传递。静态规范描述了类之间的关系,例如聚合、关联和继承。

消息传递

任何应用程序都需要许多对象以和谐的方式交互。系统中的对象可以通过使用消息传递来相互通信。假设系统有两个对象 - obj1 和 obj2。如果 obj1 希望 obj2 执行其方法之一,则对象 obj1 会向对象 obj2 发送一条消息。

组合或聚合

聚合或组合是类之间的一种关系,通过这种关系,一个类可以由其他类的对象的任意组合组成。它允许将对象直接放置在其他类的主体中。聚合被称为“部分”或“具有一个”关系,能够从整体导航到其部分。聚合对象是由一个或多个其他对象组成的对象。

协会

关联是一组具有共同结构和共同Behave的链接。关联描述了一个或多个类的对象之间的关系。链接可以定义为关联的实例。关联度表示连接中涉及的类的数量。次数可以是一元、二元或三元。

  • 一元关系连接同一类的对象。
  • 二元关系连接两个类的对象。
  • 三元关系连接三个或更多类的对象。

遗产

它是一种机制,允许通过扩展和完善其功能来从现有类中创建新类。现有的类称为基类/父类/超类,新的类称为派生类/子类/子类。

如果超类允许,子类可以继承或派生超类的属性和方法。此外,子类可以添加自己的属性和方法,并且可以修改任何超类方法。继承定义了“is – a”关系。

例子

从一类哺乳动物中,可以派生出许多类,例如人类、猫、狗、牛等。人类、猫、狗和牛都具有哺乳动物的独特特征。此外,每一种都有其独特的特点。可以说,牛“是——一种”哺乳动物。

面向对象分析

在软件开发的面向对象分析阶段,确定系统需求,识别类,并确认类之间的关系。OO分析的目的是了解系统的应用领域和具体需求。此阶段的结果是需求规格说明以及对系统逻辑结构和可行性的初步分析。

面向对象分析中相互结合使用的三种分析技术是对象建模、动态建模和功能建模。

对象建模

对象建模根据对象开发软件系统的静态结构。它标识对象、对象可以分组到的类以及对象之间的关系。它还标识了每个类的主要属性和操作。

对象建模的过程可以通过以下步骤可视化 -

  • 识别对象并分组
  • 识别类之间的关系
  • 创建用户对象模型图
  • 定义用户对象属性
  • 定义应对类执行的操作

动态建模

分析系统的静态Behave后,需要检查其相对于时间和外部变化的Behave。这就是动态建模的目的。

动态建模可以定义为“一种描述单个对象如何响应事件的方法,无论是由其他对象触发的内部事件,还是由外部世界触发的外部事件。”

动态建模的过程可以通过以下步骤可视化 -

  • 识别每个对象的状态
  • 识别事件并分析行动的适用性
  • 构建动态模型图,包括状态转换图
  • 用对象属性来表达每个状态
  • 验证绘制的状态转换图

功能建模

功能建模是面向对象分析的最后一个组成部分。功能模型显示了对象内执行的过程以及数据在方法之间移动时如何变化。它规定了对象建模操作的含义和动态建模的动作。该功能模型对应于传统结构化分析的数据流图。

功能建模的过程可以通过以下步骤可视化 -

  • 识别所有输入和输出
  • 构建显示功能依赖关系的数据流程图
  • 说明每个功能的目的
  • 确定限制因素
  • 指定优化标准

面向对象的设计

分析阶段之后,概念模型进一步发展为使用面向对象设计(OOD)的面向对象模型。在 OOD 中,分析模型中独立于技术的概念被映射到实现类,识别约束并设计接口,从而产生解决方案域的模型。OO设计的主要目的是开发系统的结构体系结构。

面向对象设计的阶段可以确定为 -

  • 定义系统的上下文
  • 设计系统架构
  • 系统中对象的识别
  • 设计模型的构建
  • 对象接口规范

OO设计可以分为两个阶段——概念设计和详细设计。

概念设计

在此阶段,将确定构建系统所需的所有类。此外,每个班级都被分配了具体的职责。类图用于阐明类之间的关系,交互图用于显示事件的流程。也称为高层设计

详细设计

在此阶段,根据交互图将属性和操作分配给每个类。开发状态机图来描述设计的进一步细节。它也称为低级设计

设计原则

以下是主要设计原则 -

解耦原理

维护具有一组高度相互依赖的类的系统很困难,因为一个类的修改可能会导致其他类的级联更新。在面向对象设计中,可以通过引入新类或继承来消除紧密耦合。

确保凝聚力

内聚类执行一组密切相关的功能。缺乏内聚意味着——一个类执行不相关的功能,尽管它不影响整个系统的运行。它使得软件的整个结构难以管理、扩展、维护和更改。

开闭原则

根据这个原则,系统应该能够扩展以满足新的需求。系统现有的实现和代码不应因系统扩展而修改。此外,必须遵循开闭原则以下准则 -

  • 对于每个具体类,必须维护单独的接口和实现。

  • 在多线程环境中,将属性保持私有。

  • 尽量减少全局变量和类变量的使用。