面向对象编程范式

news2025/2/23 13:33:42

目录

1.概述

1.1.面向对象编程的核心诉求

1.2.面向对象的世界观

2.类和对象

3.如何寻找类和对象

3.1.概述

3.2.示例

4.如何表示类

4.1.什么是UML

4.1.关系

4.2.权限

4.3.依赖

4.4.泛化(继承)

4.5.实现

4.6.关联

4.7.聚合

4.8.组合


1.概述

1.1.面向对象编程的核心诉求

软件中变更是不可避免的,没办法预估到的变更没法控制,但是面对可以预估到的变更要做好设计来预防,达到即使遇到变更只做有限范围的修改,而不做大范围的修改这种理想效果。面向对象编程最核心的诉求就是根据场景设计出合理的类来力求实现这个效果。

《面向对象编程范式》和《设计模式》之间的区别:

前者是世界观,后者是方法论。

1.2.面向对象的世界观

面向对象编程是有职责对象之间的协作,在面向对象的世界观里世界是由一个一个的节点组成的,每个节点都有自己的职责,节点之间以通信的方式进行协作,构成了整个世界的运行。以此就完全不同于面向过程编程里函数之间的协作,区分开了两种世界观。

因此面向对象的世界中最重要的三点:

  1. 职责
  2. 通信
  3. 协作

1.职责:

单个节点是某一类职责的抽象集合,具有静态的数据职责(属性)、动态的行为职责(方法)。

2.通信:

方法调用。

3.协作

就是一起合作的意思。

4.举个例子:

我打网约车,

叫车的场景,我这个节点调用了司机这个节点的开车功能。

上车的场景,我这个节点调用了车这个节点的开门功能。

 以此带入类推,会发现这个世界的运转其实都可以抽象为不同节点之间以通信的方式进行协作。

2.类和对象

还是看刚才的打车场景:

明显可以看到,我和司机之间具有相同的属性,姓名、身高、性别,只是各自的属性值不同;我和司机之间具有一些相同的功能,吃饭、睡觉。我和车之间则是属性、功能皆迥异。

因为我和司机同属于一个类别——人类,而车是属于另一种类别。于是引出面向对象的两个核心概念——类与对象。

对象:

书面定义是:一种建模方法,即表示客观世界问题空间中的某个具体事务,又表示软件空间中的基本元素,由属性和方法构成。

说人话就是:大类别的具体个体,是具体的一辆车、具体的一个人。

类:

对于具有共同具体属性的对象的描述。类是对象的蓝图,是对象的模具。

类,如学生类:

  • 学号

  • 姓名

  • 性别

对象,如小明同学:

  • 学号:001

  • 姓名:小明

  • 性别:男

3.如何寻找类和对象

3.1.概述

在实际开发中,如何从业务场景中抽象出类和对象,并将其表示出来,这无疑是面向对象编程中的关键点,一般分为几个步骤:

  1. 从场景描述中识别候选类
  2. 筛选候选类,确定概念类
  3. 识别关联
  4. 识别重要属性

在这几个步骤中识别候选类、确定概念类是最重要的,要先从场景中识别出类来,才谈得上后面的表示,识别类有常用的几个方法:

  1. 名词分析法
  2. 行为分析法
  3. CRC法

这里重点介绍一下名字分析法,这是最常用的一种识别方法。

3.2.示例

1.业务场景:

1.收银员开始一次新的销售

2.如果是VIP客户,收银员输入VIP客户编号

3.收银员录入商品标识

4.系统记录商品;并显示商品赠品信息(如果有商品赠送策略的话);商品信息包括商品标识、描述、数量、价格、特价(如果有商品特价策略的话)和本项商品总价;赠品信息包括标识、描述与数量

5.系统显示已购入的商品清单赠品清单;商品清单包括商品标识、描述、数量、价格、特价、各项商品总价所有商品总价;赠品清单包括商品标识描述和数量

收银员重复3-5步;直到完成所有商品的输入。

6.收银员结束输入;系统计算并显示总价;计算根据总额特价策略进行。

7.系统根据总额赠送策略补充商品清单

8.收银员请顾客支付账单

9.顾客支付;收银员输入收取的现金数额

10.系统给出应找的余额;收银员找零。

11.系统记录销售信息、商品清单、赠送清单和账单信息;并更新库存

12.系统打印收据

标黄部分为使用名词分析初步找出的候选类。

如何从初步找打的众多候选类中找出确定有用的,有以下准则:

  1. 依据系统的需求,必须有类去实现对应需求。
  2. 该类的对象实例的状态和行为是否完全必要,是否能构建出一个有状态和行为的类。

2.确定概念类:

候选类向概念类转化的判断技巧:

  1. 如果一个候选类即需要保持一定的状态又需要依据状态表现出一定的行为,那这就必是一个概念类。
  2. 如果一个候选类只需要维护状态,不需要表现行为,那它就是其他类的一个属性。
  3. 如果一个候选类不需要维护状态,却需要表现行为,需要确定有没有关联状态和他有关系,如果发现没有关联状态和他有关系也没有遗漏需求,那么这个类多半可以剔除,将行为转交给其他具备状态支持能力的其他概念类。

3.识别关联:

根据以上场景可以得到如下类关联关系:

4.如何表示类

4.1.什么是UML

使用UML图表示类,UML是一种统一建模语言,由一组符号组成,用来描述软件模型中各个元素之间的关系。

4.1.关系

UML中元素间的不同关系使用不同的连线来表示

4.2.权限

public 公用的 :用+ 前缀表示 ,该属性对所有类可见。

protected 受保护的:用 # 前缀表示,对该类的子孙可见。

private 私有的:用- 前缀表示,只对该类本身可见。

package 包的:用 ~ 前缀表示,只对同一包声明的其他类可见。

4.3.依赖

4.4.泛化(继承)

 

4.5.实现

实现是继承的特例。

接口:

 实现类:

 

4.6.关联

关联关系,即类与类之间的联系,是依赖关系的特例。

关联关系分为两种,单项一对一、双向一对一。

4.7.聚合

聚合关系是依赖关系的特例,依赖之间可以分开,即被依赖的类和依赖它的类不同生共死,也就是说被依赖的类的实体需要从外界传入。

4.8.组合

组合关系是依赖关系的特例,依赖之间不可以分开,即被依赖的类和依赖它的类同生共死,也就是说被依赖的类的实体就在依赖它的实体内部生老病死,不需要从外界传入。

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/179940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自定义类型之枚举和联合

该文章将详细介绍除结构体外的另外两种自定义类型--------枚举类型与联合类型。1.枚举1.1枚举类型的定义1.2枚举的优点1.3枚举的使用2.联合(共用体)2.1联合类型的定义2.2联合的特点2.3联合大小的计算1.枚举 枚举顾名思义就是------一一列举。 把所有可能…

ADAS HiL系统测试方案

1、什么是ADAS ADAS(Advanced Driving Assistance System)也就是高级驾驶辅助系统,是无人驾驶的过渡。 ADAS利用安装在车上的各式各样传感器(毫米波雷达、激光雷达、单\双目摄像头以及卫星导航),在汽车行驶…

[前端笔记——CSS] 12.处理不同方向文本

[前端笔记——CSS] 12.盒模型背景与边框1.书写模式2.书写模式、块级布局和内敛布局3.逻辑属性和逻辑值1.书写模式 CSS 中的书写模式是指文本的排列方向是横向还是纵向的。writing-mode 属性使我们从一种模式切换到另一种模式。例如,我们使用writing-mode: vertical…

stack、queue、priority_queue

容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 其中stack和queue都是容器适配器,其中stack可以封装vector、list以及我们…

ffmpeg无损裁剪、合并视频

我用的版本是 ffmpeg version git-2020-06-23-ce297b4 官方文档 https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax 时间格式 [-][HH:]MM:SS[.m...] 或 [-]S[.m...][s|ms|us]裁剪视频 假设需要裁剪视频aaa.mp4,第5秒到第15秒 ffmpeg -ss 5 -to 15 -i…

使用gazebo对scara机械臂进行仿真

本文主要介绍如何仿真一个scara机械臂,以及在网上看了一些项目以后,有了一些感想,不想看的可以直接跳到机械臂部分。 目录感想(自己的理解,不一定对。)Scara机械臂的开发运动学计算如何使用机械臂工作图一个例子: 在start_pose抓起…

【Hadoop】MapReduce分布式计算实践(统计文本单词数量)

文章目录1. 前言2. Mapper代码3. Reducer代码4. Main代码5. 项目打包6. Hadoop运行7. 运行结果查看7.1 输出文件查看7.2 日志查看1. 前言 在博客【Hadoop】MapReduce原理剖析(Map,Shuffle,Reduce三阶段)中已经分析了MapReduce的运…

ASP.NET Core+Element+SQL Server开发校园图书管理系统(二)

随着技术的进步,跨平台开发已经成为了标配,在此大背景下,ASP.NET Core也应运而生。本文主要基于ASP.NET CoreElementSql Server开发一个校园图书管理系统为例,简述基于MVC三层架构开发的常见知识点,前一篇文章&#xf…

Linux C编程一站式学习笔记6

Linux C编程一站式学习笔记 chap6 循环结构 文章目录Linux C编程一站式学习笔记 chap6 循环结构一.while语句递归 VS 循环函数式编程(Functional Programming) & 命令式编程(Imperative Programming)无限递归 & 无限循环习…

光流估计(二) FlowNet 系列文章解读

在上篇文章中,我们学习并解了光流(Optical Flow)的一些基本概念和基本操作,但是传统的光流估计方法计算比较复杂、成本较高。近些年来随着CNN卷积神经网络的不断发展和成熟,其在各种计算机视觉任务中取得了巨大成功&am…

docker-基础实战第六课镜像挂载

镜像挂载: docker run --namemynginx -d --restartalways -p 8088:80 -v /usr/local/docker/data/html:/usr/share/nginx/html:ro nginx访问403 原因: /usr/local/docker/data/html 没有创建index.html 需要创建目录并且创建index.html docker命令补充: 如果有一…

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第1种方法)

1.前言 工作中经常会遇到这样的需求:向QAbstractItemView子类如QTreeView、QTableView单元格插入窗体小部件,如:进度条、按钮、单行编辑框等。下面链接的系列博文就是讲解如何实现该功能的。《向QAbstractItemView子类如:QTreeView、QTableVi…

Android音频播放有杂音?原来是这个JAVA API接口惹的祸

最近在调试一个基于十年前Android版本的多媒体应用软件时,遇到了音频播放的问题,这里记录问题的发现、分析和处理过程。 有人可能会好奇,十年前的Android版本是什么版本?大家可以去Google网站上查查,就是目前Android网…

Android深入系统完全讲解(40)

调试 C 代码 15.1 改成 C 写法 这个没啥必要,但是对 C 比 C 情谊深的我,把它修改了。下面是修改的一部分代码, 把 C 的写法,改成 C 的,同时修改引入头文件。 jstring Java_hellojni_codegg_com_hellojni_MainActivity_…

Java基础41 面向对象(高级)

面向对象(高级)一、类变量和类方法1.1、static (类变量)1.1.1 关于static的存放位置1.1.2 类变量使用细节及注意事项1.2、类方法1.2.1、类方法使用细节及注意事项二、main方法2.1、深入理解main方法三、代码块3.1、代码块的基本介…

19.6、Javaweb_案例旅游路线收藏功能

旅游线路收藏功能 分析 判断当前登录用户是否收藏过该线路 当页面加载完成后,发送ajax请求,获取用户是否收藏的标记 根据标记,展示不同的按钮样式 编写代码 后台代码 RouteServlet: package cn.itcast.travel.web.servlet;…

【Typescript学习】使用 React 和 TypeScript 构建web应用(四)useReducer、扑街了的分区功能【完结了】

教程来自freecodeCamp:【英字】使用 React 和 TypeScript 构建应用程序 跟做,仅记录用 其他资料:https://www.freecodecamp.org/chinese/news/learn-typescript-beginners-guide/ 作者提供的源码https://github.com/piyush-eon/react-typescr…

机器学习【西瓜书/南瓜书】--- 第四章决策树

一、决策树理论分析 1.1 通俗理解 决策树是一种非常经典的机器学习算法,通俗理解的话我们可以举一个例子,比如现在别人要找你借钱,那么按照首先是不是要判断你和他的关系如何?如果关系不好,我就直接拒绝他。如果关系很好&#…

Python机器学习:一元回归

→\rightarrow→回归效果评价 🌕 一元回归 一元回归主要研究一个自变量和一个因变量之间的关系,而这个自变量和因变量之间的关系又可分为线性回归和非线性回归。 ⭐️ 一元线性回归分析两个变量之间的线性关系,如ykxbykxbykxb中xxx和yyy就是…

深度学习笔记:神经网络的学习(1)

机器学习的核心在于从数据中提取规律和特征,并用于分类或预测。对于识别手写数字,如果人工设计一个识别算法逻辑是十分困难的。一种方法是任务在数据中提取更重要的特征量,然后利用机器学习算法如SVM或KNN。而神经网络的方法则是完全由机器自…