服务:当代最流行的方法?面向对象方法

diff 复制代码
设计不只是外表和感觉,它更是产品如何运作。
    
在计算机编程中,面向对象方法编程将在相当长的一段时间内占据重要位置。
---乔布斯

简介

我们知道现实世界的对象是什么:我们可以感知、感觉和操纵的有形事物。

人类最早接触的对象通常是玩具。木块、塑料形状和超大拼图是常见的第一对象。并且很快学会某些物体做某些事情:铃铛响起,按下按钮,拉动杠杆。

软件开发中对象的定义并没有太大的不同。软件对象可能不是你可以拾取、感知或感觉到的有形的东西,但它们是可以做某些事情并对其完成某些事情的模型。从形式上讲,对象是数据和关联行为的集合。

现实世界或者系统是由可区分的"对象"构成的。现实:对象可以被看成一个个具有某个功能的个体。 软件系统中,对象可以被看成是一个可执行某程序的个体。

2 面向对象方法

考虑到对象是什么,面向对象意味着什么?在字典中,定向意味着指向。

我们可能在阅读时遇到过面向对象分析、面向对象设计、面向对象分析和设计以及面向对象编程等术语。这些都是一般面向对象保护伞下的相关概念。

事实上,分析、设计和编程都是软件开发的阶段。称它们为面向对象只是指定了正在追求的软件开发类型。

面向对象编程意味着编写针对建模对象的代码。这是用于描述复杂系统动作的众多技术之一。它通过描述交互对象的数据和行为来定义。

2.1 面向对象分析 OOA:

面向对象分析 OOA object-Oriented Analysis

这是查看问题、系统或任务(有人想要变成一个工作软件应用程序)并识别对象和这些对象之间的交互的过程。分析阶段是关于需要做什么的。

OOA模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。

OOA包括九大基本原则:抽象,封装,继承,分类,聚合,关联,消息通信,粒度控制,行为分析。

基本五步骤包括依次确定: 对象和类,结构,主题,属性,方法。

OOA 面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成;

设计模型则包含以包图表示的软件体系结构图、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。

2.2 面向对象设计 OOD:

面向对象设计方法(Object-Oriented Design,OOD)是OOA方法的延续,其基本思想包括抽象、封装和可扩展性,其中可扩展性主要通过继承和多态来实现。

这是将此类需求转换为实现规范的过程。设计器必须命名对象,定义行为,并正式指定哪些对象可以激活其他对象上的特定行为。设计阶段就是将应该做的事情转化为应该如何完成。

设计阶段的输出是实现规范。如果我们要在一步中完成设计阶段,我们将把面向对象分析期间定义的需求转换为一组类和接口,这些类和接口可以在(理想情况下)任何面向对象的编程语言中实现。

面向对象分析类可以分为边界类、控制类和实体类。

复制代码
边界类是一种用于对系统外部环境与其内部运作之间交互进行建模的类。

控制类用于对一个或多个用例所特有的控制行为进行建模,描述用例业务逻辑的实现。

实体类是用于对必须存储的信息和相关行为建模的类,用于保存和更新一些现象的有关信息。

比如面向对象技术设计在线教育平台系统,"学员类"和"课程类"主要用于存储数据,所以设计为实体类;而"窗口"位于系统与外界的交接处,应设计为边界类。

2.3 Coad/Yourdon方法:结合OOA和OOD

Yourdon/Coad方法包括用于创建数据流图和对象状态图的组件。

对应的DFD表示法的一些独特属性包括:

复制代码
数据存储表示为两条平行的水平线。
进程由圆圈表示

数据流图显示系统的信息传输和处理步骤。一般概念是一种描述系统中如何发生输入、进一步进程和用完内容的方法。

DFD的目标是实现开发人员和用户之间的理解。数据流图使用其他结构化系统分析方法进行维护。

Coad/Yourdon方法:特别强调OOA和OOD采用完全一致的概念和表示法,使得分析和设计之间不需要表示的转换。

该方法使用独特的方法表示数据流的过程,比如使用两个平行线表示数据存储。

使用封闭矩形椭圆表示循环

例子:

2.4 Booch(布奇)方法:

Booch方法是一种1992年推出的面向对象的软件开发方法。 它由一种对象建模语言,一个迭代的面向对象开发过程和一组推荐的实践组成

其中开发模型包括静态,动态模型和物理模型用来描述系统的构成和结构。

静态分为逻辑模型类图,对象图。 动态模型包括状态图和顺序图,描述对象间状态变化和交互过程。 物理模型包括 模块图,进程图。

复制代码
类图:展示对象关联和信息。
顺序图:展示对象之间的交互信息,对象的循环,选择复杂交互 使用 ? 表示。

Booch方法的方法论方面已被纳入几种方法和过程,主要是统一过程(RUP).

布奇方法的符号已经被UML逐步取代。UML具有来自Booch方法的图形元素以及来自对象建模技术(OMT)和面向对象的软件工程(OOSE)的元素。

2.5 OMT(伦博)方法:

Rumbaugh方法也称为OMT(对象建模技术),是一种用于开发可管理的面向对象系统和主机面向对象编程的方法。目的是允许轻松表达类属性、方法、继承和关联。OMT在现实世界中用于软件建模和设计

数据流图(DFD)表示通过系统的信息流。DFD迅速成为可视化软件系统流程中涉及的主要步骤和数据的一种流行方式。

它们用于显示软件系统中的数据流,尽管理论上它们可以应用于业务流程建模。DFD 对于记录主要数据流或探索数据流方面的新高级设计非常有用。

数据流图(DFD)是一种表示流程或系统(通常是信息系统)数据流的方法,例如:

css 复制代码
A 数据来自何处? B 数据去哪里? C 数据如何存储?

OMT(伦博)方法使用了建模的思想,采用对象模型(对象图),动态模型(状态图)和功能模型数据流图(DFD)建立一个实际的应用模型。

OMT包括四个阶段:

复制代码
分析,系统设计,对象设计,实现

此外,OMT总是分为三个独立的部分:

复制代码
对象模型,动态模型,功能模型。

2.6 OOSE(面对对象的软件工程):

雅各布森方法,也称为面向对象的软件工程(OOSE)甚至Objectory,是一种用于规划,设计和实现面向对象软件的方法。

复制代码
该方法分为五个部分:需求、分析、设计、实现和测试模型。

面向对象的软件工程(OOSE)是由Ivar Jacobson于1992年开发的对象建模语言和方法。 OOSE通常开发复杂的系统。

将用例取代DFD进行需求分析和建立功能模型。

3 面向对象编程 (OOP)

面向对象的程序设计 OOP Object-Oriented Programming是将设计转换为执行产品所有者最初要求的工作程序的过程。

ini 复制代码
OOP达到了软件工程的3个主要目标:重用性、灵活性和扩展性。

OOP=对象+类+继承+多态+消息,其中核心概念是类和对象。

OOP 基本特征:封装,集成,多态。

数据描述对象的状态:从数据开始。数据代表某个对象的个体特征;其当前状态。类可以定义特定的特征集,这些特征集是属于该类的所有对象的一部分。

对于给定特征,任何特定对象都可以具有不同的数据值。

例如,我们桌子上的三个橙子(如果我们没有吃过的话)每个橙子的重量可能不同。

橙色类可以具有表示该基准面的权重属性。橙色类的所有实例都有一个权重属性,但每个橙色都有此属性的不同值。但是,属性不必是唯一的;任何两个橙子的重量可能相同。

4 面向对象关系

面向对象关系主要包括: 封装、继承、多态,实现、依赖、关联、聚合、组合。

这里简单介绍OOA的几个关系:

依赖

复制代码
指两个相对独立的对象,当一个对象负责构造另一个对象的实例,
或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系

实现

php 复制代码
指的是一个类实现一个接口的功能,在Java中一个类可以实现多个接口,
使用implements作为关键字。

关联

css 复制代码
指一个类的实例A使用另外一个类的实例B,这两个对象之间为关联关系,
关联关系分为单项关联和双向关联

聚合

复制代码
 聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,
 仅仅是在语义上有所区别:关联关系的对象间是相互独立的,
 而聚合关系的对象之间存在着包容关系,他们之间是"整体-个体"的相互关系。

组合

复制代码
相比于聚合,组合是一种耦合度更强的关联关系。
存在组合关系的类表示"整体-部分"的关联关系,
"整体"负责"部分"的生命周期,他们之间是共生共死的;
并且"部分"单独存在时没有任何意义

例子:

当部分属于多个整体,则属于聚合。

当部分和整体有相同生命周期,属于组合。

小结

面向对象(OO)通常用于将多个对象收集在一起以创建新对象的行为。

当一个对象是另一个对象的一部分并且有相同生命周期时,组合通常是一个不错的选择。比如在谈论汽车时,我们就已经看到了构图。

化石燃料汽车由发动机、变速箱、起动机、前灯和挡风玻璃等众多部件组成。

对应的,发动机由活塞、曲轴和气门组成。在此示例中,组合是提供抽象级别的好方法。 汽车对象可以提供驾驶员所需的接口,同时还提供对其组件的访问,从而提供适合机械师的更深层次的抽象。如果机械师需要更多信息来诊断问题或调整发动机,这些组件可以进一步分解为细节。

有趣的是,SOA结构方法,也受启发于面向对象方法,在后续我们继续探讨。

相关推荐
devlei4 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
古译汉书5 小时前
【IoT死磕系列】Day 9:架构一台“自动驾驶物流车”,看8种协议如何协同作战
网络·arm开发·单片机·物联网·tcp/ip·架构·自动驾驶
KaneLogger5 小时前
从传统笔记到 LLM 驱动的结构化 Wiki
人工智能·程序员·架构
努力的小郑5 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
斯外戈的小白5 小时前
【Agent】LangChain 1.0架构
架构·langchain
小橘子8316 小时前
(学习)Claude Code 源码架构深度解析
学习·程序人生·架构
Victor3566 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3566 小时前
MongoDB(88)如何进行数据迁移?
后端
安审若无6 小时前
运维知识框架
运维·服务器
小红的布丁6 小时前
单线程 Redis 的高性能之道
redis·后端