三大编程思想(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…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...