三大编程思想(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、Pascal等。 - 采用
函数作为程序的基本单元,通过函数之间的调用来实现程序的功能。 - 优点:
- 相对
简单和直观,易于理解和实现。 - 对于简单的问题和小规模程序,
面向过程编程具有高效性和执行速度优势。 更加灵活,可以通过过程的组合和调用来构建更复杂的功能。
- 相对
- 缺点:
- 缺乏模块化和封装性,
难以重用和维护。 - 难以应对复杂的问题和大规模的软件开发。
- 容易造成
代码冗余和可扩展性差。
- 缺乏模块化和封装性,
- 例子:将大象装入冰箱步骤:
打开冰箱门 ==》将大象放进冰箱 ==》关闭冰箱门。
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…...
Phi-4-reasoning-vision-15B在研发协作中的应用:代码IDE截图理解与问题定位
Phi-4-reasoning-vision-15B在研发协作中的应用:代码IDE截图理解与问题定位 1. 引言:研发协作中的视觉理解需求 在软件开发团队中,工程师们每天都要处理大量代码截图和IDE界面。当遇到问题时,最常见的做法是把报错截图或代码片段…...
Qwen3-ASR-0.6B快速入门:无需复杂配置,开箱即用体验
Qwen3-ASR-0.6B快速入门:无需复杂配置,开箱即用体验 想试试语音转文字,但被复杂的模型部署和配置劝退?今天给你介绍一个“傻瓜式”的语音识别工具——Qwen3-ASR-0.6B。它最大的特点就是简单,你不需要懂深度学习&#…...
基于Qt开发Lingbot-Depth-Pretrain-ViTL-14的跨平台桌面调试工具
基于Qt开发Lingbot-Depth-Pretrain-ViTL-14的跨平台桌面调试工具 深度估计模型,比如我们今天要聊的 Lingbot-Depth-Pretrain-ViTL-14,在机器人导航、三维重建、增强现实这些领域越来越重要。但说实话,对于开发者或者研究人员来说,…...
2026年,教培机构不可错过的在线教学平台大盘点
一、在线教育的崛起与挑战随着互联网技术的飞速发展,在线教育迎来了爆发式增长,成为教育领域的重要力量。据艾瑞咨询数据显示,中国在线教育行业市场规模已突破 6000 亿元,并呈现持续增长趋势。特别是在疫情期间,在线教…...
Python 3.14 JIT编译器调优实战:从默认0.8x到2.4x加速,7步完成生产环境级配置(附官方未公开env变量清单)
第一章:Python 3.14 JIT编译器性能调优配置详解Python 3.14 引入了实验性内置 JIT 编译器(基于 GraalPython 兼容层与自研 Pyston-style 动态优化后端),默认处于禁用状态,需通过环境变量与运行时参数显式启用并精细调优…...
uv下载软件包
需要在项目根目录执行uv add 包名 否则找不到项目的.venv,会下载到终端的conda环境uv add openai...
UnifiedLog:嵌入式统一日志框架设计与实践
1. UnifiedLog:面向嵌入式系统的统一日志框架设计与工程实践在资源受限的嵌入式系统开发中,调试信息输出长期面临协议割裂、接口冗余、资源争用和维护成本高等现实问题。典型场景下,开发者往往需为串口(UART)、MQTT、L…...
Qwen3.5本地部署,非常详细收藏我这一篇就够了
这一篇我们来聊点更实际的——怎么本地跑起来。 397B 参数的模型,哪怕只激活 17B,完整模型也有 807GB。听起来吓人,但实际上,得益于 Unsloth 的 Dynamic 2.0 量化技术,192GB 内存的 Mac 就能跑 3-bit 版本,…...
微信聊天记录导出终极指南:如何快速安全备份你的珍贵回忆
微信聊天记录导出终极指南:如何快速安全备份你的珍贵回忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经因为手机丢失或系统升级,担心…...
Keploy实战:基于真实流量的API自动化测试与Mock生成
1. Keploy是什么?它能解决什么问题? 第一次听说Keploy时,我也和大多数开发者一样疑惑:这工具到底能干嘛?简单来说,Keploy就像是你团队里的一个"影子测试工程师",它能悄无声息地记录下…...
