三大编程思想(POP、OOP、AOP、FOP)及oop 五大设计原则
概述
POP:面向过程编程(Procedure Oriented Programming)
OOP:面向对象编程(Object Oriented Programming)
AOP:面向切面编程(Aspect Oriented Programming)
FOP:面向函数式编程(Functional Oriented Programming)
POP
POP:面向过程编程(Procedure Oriented Programming):这种编程方式以功能为中心,强调通过过程(函数)来组织代码。它适合于流程化编程
,但在代码重用性方面较低
- 常见的语言有
C、Pasca
l等。 - 采用
函数作为程序的基本单元
,通过函数之间的调用来实现程序的功能
。 - 优点:
- 相对
简单和直观
,易于理解和实现。 - 对于简单的问题和小规模程序,
面向过程编程具有高效性和执行速度优势
。 更加灵活
,可以通过过程的组合和调用来构建更复杂的功能。
- 相对
- 缺点:
- 缺乏模块化和封装性,
难以重用和维护
。 - 难以应对复杂的问题和大规模的软件开发。
- 容易造成
代码冗余和可扩展性差
。
- 缺乏模块化和封装性,
- 例子:将大象装入冰箱步骤:
打开冰箱门 ==》将大象放进冰箱 ==》关闭冰箱门。
OOP
OOP:面向对象编程(Object Oriented Programming):强调将数据和操作数据的函数封装在一起,形成对象
。通过类和对象的概念,程序员可以更好地组织代码,提高代码的重用性和可维护性。
- 常见的语言有
Java、C++、Python
等。 以对象为中心
,强调封装、继承和多态,面向对象编程强调将问题抽象成对象,并通过对象之间的交互来解决问题。抽象包括两个方面:过程抽象和数据抽象
- 过程抽象:把一个系统
按功能划分
成若干个子系统,进行自顶向下逐步求精的程序设计。 - 数据抽象:以
数据为中心,将数据对象、数据对象之间的关系和数据对象的基本操作封装
在一起(对象)来进行描述,形成抽象数据类型ADT(Abstract Data Type)
- 过程抽象:把一个系统
封装
:用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的
。继承
:类间的基本关系
,它是基于层次关系的不同类共享数据和操作的一种机制多态
:一个类实例的相同方法在不同的情形有不同的表现形式
- 使具有不同内部结构的对象可以共享相同的外部接口,实现了,
通过一个公共类可以以相同的方式调用不同对象的不同实现
。 - 实现:
重写overwrite(运行时决定)、重载overload(编译时决定)
- 使具有不同内部结构的对象可以共享相同的外部接口,实现了,
- 这种思想使得
代码更易于扩展和维护,但可能导致较高的耦合度
。 - 优点:
- 提供了更高层次的抽象和封装,使代码
更易于理解和维护
。 - 支持代码的重用和模块化,提高开发效率。
- 通过继承和多态性实现代码的灵活性和可扩展性。
- 提供了更高层次的抽象和封装,使代码
- 缺点:
- 学习曲线较陡峭,需要掌握面向对象的概念和设计原则。
- 对于小规模和简单问题,面向对象可能带来不必要的复杂性。
- 在某些情况下,面向对象的开销较大,执行效率可能不如面向过程。
- 例子:将大象装入冰箱步骤:
创建一个冰箱对象 ==》创建一个大象对象 ==》冰箱对象调用打开门的方法 ==》大象对象调用进入冰箱的方法 ==》冰箱对象调用关闭门的方法
AOP(OOP的补充)
AOP:面向切面编程
(Aspect Oriented Programming):AOP关注于切面,旨在降低模块之间的耦合度,简化系统的维护。它通过将横切关注点(如日志、事务等)从业务逻辑中分离出来,提高了代码的可维护性。
- 在应用程序中多个模块共同需要的功能,例如日志记录、事务管理等。
- 通过将这些关注点从核心业务逻辑中分离出来,使得代码更加模块化和可维护。
- 优点:
- 提高了代码的可重用性和可维护性。
- 实现了关注点的集中管理,使得业务逻辑更加清晰和简洁。
- 降低了模块之间的耦合度,提高了系统的灵活性和可扩展性。
- 缺点:
- 引入了额外的复杂性和学习成本。
- 可能导致系统的运行时性能损失。
- 例子:将大象装入冰箱步骤:
创建一个日志记录的切面 ==》将日志记录切面应用到打开门的操作中 ==》将日志记录切面应用到关闭门的操作中 ==》创建一个冰箱对象 ==》创建一个大象对象 ==》冰箱对象调用打开门的方法,切面会记录日志 ==》大象对象调用进入冰箱的方法 ==》冰箱对象调用关闭门的方法,切面会记录日志
FOP
函数式编程
(Functional Programming):函数式编程强调使用纯函数和不可变数据
。它关注于计算的结果而不是计算的过程
,鼓励使用高阶函数和递归。常见的语言有Haskell、Scala、JavaScript等。
- 也是一种
以函数为基本单位的编程思想,将程序看作是一系列函数的组合
,通过对函数的调用和组合来实现程序的功能。函数式编程的核心是函数的定义和函数的调用
- 和POP的区别:
- 函数是一种无状态的、不可变的计算单元,接受输入参数并返回结果
无状态:函数内部涉及的变量都是局部变量
函数执行的结果只和入参有关,与其他外部变量无关
,同样的入参,无论如何执行,得到的结果都是一样的- 实际上:就是数学函数或者数学表达式的基本要求
- 函数是一种无状态的、不可变的计算单元,接受输入参数并返回结果
oop 五大设计原则
单一职责原则(Single-Resposibility Principle):单一职责有2个含义,一个是避免相同的职责分散到不同的类中
,另一个是避免一个类承担太多职责
。减少类的耦合度,提高类的复用性
- 如果一个类承担的职责过多,那么这些职责就会相互依赖,一个职责的变化可能会影响另一个职责的履行。其实
面向对象设计(OOD)的实质,就是合理地进行类的职责分配
。 一个类或模块只负责完成一个职责
接口隔离原则(Interface-Segregation Principle):表明客户端不应该被强迫实现一些他们不会使用的接口
,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块
接口的调用者不应该被强迫依赖它不需要的接口
- 当某个客户程序的要求发生变化,而迫使接口发生改变时,影响到其他客户程序的可能性小。
开放-封闭原则(Open-Closed principle):一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。
对扩展性开放,对修改关闭
- open模块的行为必须是开放的、支持扩展的,而不是僵化的
- closed在对模块的功能进行扩展时,不应该影响或大规模影响已有的程序模块。
核心思想就是对抽象编程,而不对具体编程
- 如果说我们预测到某种变化,或者某种变化发生了,我们应当创建抽象类来隔离以后发生的同类变化。
在Java中,这种抽象是指抽象基类或接口
替换原则(Liskov-Substitution Principle):子类型必须能够替换掉他们的父类型、并出现在父类能够出现的任何地方
子类对象能够替换父类对象出现的任何地方,并且要保证原来的程序逻辑行为和正确性不被破坏
主要针对继承的设计原则
- 在客户端程序中只应该使用父类对象而不应当直接使用子类对象,这样可以实现运行期间绑定。
本原则和开放封闭原则关系密切
,正是子类型的可替换性,才使得使用基类型模块无需修改就可扩充
依赖倒置原则(Dependecy-Inversion Principle):上层模块不应该依赖于下层模块,他们共同依赖于一个抽象(父类不能依赖子类,他们都要一类抽象类
),抽象不能依赖于具体,具体应该要依赖于抽象
高层模块不用了底层模块
,二者应该通过抽象来互相依赖;抽象不依赖具体实现细节
,具体实现细节依赖抽象
- 人解决问题的思考过程是
先抽象后具体,从笼统到细节,所以我们先生产出的势必是抽象程度比较高的实体,而后才是更加细节化的实体
,依赖倒置原则适应了人类认识过程的规律,是面向对象设计的标志所在
。 - 抽象的实体代表着笼而统之的认识,人们总是比较容易正确认识它们,而且本身也是不易变的,依赖于它们是安全的。
补充:良性依赖原则
。"不会在实际中造成危害的依赖关系,都是良性依赖。“通过分析不难发现,本原则的核心思想是"务实”,很好地揭示了极限编程(Extreme Programming)中"简单设计"各"重构"的理论基础。本原则可以帮助我们抵御"面向对象设计五大原则"以及设计模式的诱惑,以免陷入过度设计(Over-engineering)的尴尬境地,带来不必要的复杂性
相关文章:
三大编程思想(POP、OOP、AOP、FOP)及oop 五大设计原则
概述 POP:面向过程编程(Procedure Oriented Programming) OOP:面向对象编程(Object Oriented Programming) AOP:面向切面编程(Aspect Oriented Programming) FOP&#x…...
JavaWeb开发4
JS对象 Array Array对象用于定义数组 var 变量名new Array(元素列表); var 变量名[元素列表] 访问 arr[索引]值; 注意:JS中数组相对于Java中集合,数组的长度是可变的,JS是弱类型,所以可以存储任意类型…...
Git中Update和Pull的区别
在本文中,我们将介绍Git中的两个操作——”Update”和”Pull”,并解释它们之间的区别。 1、“Update”的含义和用法 “Update”是Git中用于更新本地仓库和工作区的操作。它的作用是将远程仓库中的最新变更同步到本地。当我们执行”Update”操作时&…...
物理安全概述
目录 物理安全概念物理安全威胁物理安全威胁物理安全保护物理安全分析与防护 物理安全概念 我不需要通过高深的网络技术来攻击你,直接在物理层面把你干倒,不要小瞧,其实这种攻击是最致命的,你把我的电脑给入侵了,可能…...

引领智慧文旅新纪元,开启未来旅游新境界
融合创新科技,重塑旅游体验,智慧文旅项目定义旅游新未来 在全球化的浪潮中,旅游已成为连接世界的重要纽带。智慧文旅项目,不仅仅是一次技术的革新,更是对旅游行业未来发展的一次深刻思考。信鸥科技通过运用云计算、大数…...

Qt开发技巧(十七):新窗口控件用智能指针,将一些配置类变量封装起来,Qt窗体的Z序叠放,子窗体的释放,Qt中的事件发送,Qt的全局头文件
继续讲一些Qt开发中的技巧操作: 1.新窗口控件用智能指针 通过对Qt自带Examples的源码研究你会发现,越往后的版本,越喜欢用智能指针QScopedPointer来定义对象,这样有个好处就是用的地方只管new就行,一直new下去…...
5G 现网信令参数学习(1) - MIB
MIB消息中的参数 systemFrameNumber 000101B, subCarrierSpacingCommon scs30or120, ssb-SubcarrierOffset 6, dmrs-TypeA-Position pos2, pdcch-ConfigSIB1 { controlResourceSetZero 10, searchSpaceZero 4 }, cellBarred notBarred, intraFreqReselection allowed, sp…...

stm32单片机个人学习笔记9(TIM输入捕获)
前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…...

ubuntu 安装haproxy
####安装##### sudo apt update sudo apt install haproxy sudo haproxy -v sudo systemctl status haproxy sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org####配置站点##### nano /etc/haproxy/haproxy.cfgfrontend www-httpbind *:5001mode httpdefault_ba…...

TF-A(Trusted Firmware-A)及其启动流程详解:以stm32MP1平台为例
0 参考资料 stm32官网 wiki https://www.trustedfirmware.org/ https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git Trusted Firmware-A documentation ARM Power State Coordination Interface SMC Calling Convention (SMCCC) Arm System Control and Management…...

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能
作为今年最受期待的音乐制作 DAW 更新之一,FL Studio 2024发布引入了新功能,同时采用了新的命名方式,从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Clou…...

webpack实战 | 医保服务平台信息查询 | 国密SM4 | SM2 | 逆向分析
请求头参数加密,请求参数encData用的是SM4加密,signData用的是SM2加密,响应数据用的是SM4解密 请求头不要也没关系,直接搜signData,都打上断点,点击分页 signData的核心代码 o.doSignature就是4d09模块…...

脉冲扩散模型
论文 Spiking Diffusion Models 主要内容是提出了“脉冲扩散模型(Spiking Diffusion Models, SDMs)”,一种基于脉冲神经网络(SNN)的生成模型,旨在解决传统人工神经网络(ANN)在图像生…...

blender分离含有多个动作的模型,并导出含有材质的fbx模型
问题背景 笔者是模型小白,需要将网络上下载的fbx模型中的动作,分离成单独的动作模型,经过3天摸爬滚打,先后使用了blender,3d max,unity,最终用blender完成,期间参考了众多网络上大佬…...

胤娲科技:AI大模型的隐秘战争——当“智能”成为双刃剑
当AI不再是单纯的助手 想象一下,你正在训练一个AI模型,希望它能成为你的得力助手,帮你解决各种复杂问题。然而,有一天,你突然发现,这个模型不仅没有如你所愿, 反而悄悄地在代码库中埋下了“炸弹…...

RK平台 GPIO序号转换软件
RK平台 GPIO序号转换软件 下载地址 https://download.csdn.net/download/ruidongren/89900151 链接: link...
UDP协议和TCP协议
UDP协议: 是一种无连接的、简单的传输层通信协议,它在IP协议(网络层)之上提供服务。 特点: 无连接:在数据传输前,发送方和接收方之间不需要建立连接,可以直接发送数据。 简单&…...

算法题总结(十三)—— 动态规划(上)
动态规划 动态规划理论基础 什么是动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的ÿ…...

Leetcode - 周赛419
目录 一,3318. 计算子数组的 x-sum I 二,3319. 第 K 大的完美二叉子树的大小 三,3320. 统计能获胜的出招序列数 四,3321. 计算子数组的 x-sum II 一,3318. 计算子数组的 x-sum I 本题数据范围较小,可以…...
C# 的两个list怎么判断是否存在交集
要判断两个 List<string>(dateList 和 LocalDate)是否有交集,可以使用 LINQ(Language Integrated Query)来简化这个过程。以下三种方法来判断两个列表之间是否有交集。 方法 1: 使用 LINQ 的 Any 方法 using S…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...