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

【Python】基础语法
1. 变量 1.1. 变量的创建 变量的定义规则: 变量只能由数字,字母,下划线构成,不能包含特殊符号数字不能作为变量开头变量名不能和 Python 的关键字重复Python 的变量是区分大小写的 除了上述的硬性规则外,还建议变量…...

scala 类的继承
继承的定义 idea实例 语法 重写 重写:在子类中重新定义父类的同名方法 idea实例 多态 多态:传入的对象不同,调用的方法的效果就不同! 原理:参数是父类类型 idea实例 构造器...

穷举vs暴搜vs深搜vs回溯vs剪枝(一)
文章目录 全排列子集找出所有子集的异或总和再求和全排列 II电话号码的字母组合 全排列 题目:全排列 思路 通过深度优先搜索的方式,不断枚举每个数在当前位置的可能性,然后回溯到上一个状态,直到枚举完所有可能性得到正确的结果 r…...

枚举的应用
1.枚举的语法特点 枚举是jdk1.5提供的一个特性 枚举是一个特殊的类,这个类的对象的数量是有限的。在定义枚举类的同时就已经确定了类对象及类对象的数量。 枚举使用enum关键字定义 class A{} enum A{} 在枚举类中的第一行,就需要提供枚举类的对象&a…...

读数据工程之道:设计和构建健壮的数据系统14源系统
1. 源系统中的数据生成 1.1. 数据工程师的工作是从源系统获取数据,对其进行处理,使其有助于为下游用例提供服务 1.2. 数据工程师的角色将在很大程度上转向理解数据源和目的地之间的相互作用 1.3. 数据工程的最基本的数据管道任务——将数据从A移动到B…...

基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

STMicroelectronics 意法半导体芯片选型表
意法半导体作为全球知名的半导体厂商,其产品广泛应用于各个领域,从消费电子到工业控制,从汽车电子到通信设备,都能看到意法半导体芯片的身影。在电子硬件设计领域,芯片的选型至关重要。亿配芯城(ICgoodFind…...

TCP/IP 寻址
TCP/IP 寻址 概述 TCP/IP(传输控制协议/互联网协议)是一组用于数据网络的通信协议。它们定义了数据如何在网络上从一个设备传输到另一个设备。在TCP/IP网络中,每个设备都有一个唯一的地址,称为IP地址,用于标识网络上…...

深入探索 APKTool:Android 应用的反编译与重打包工具
文章目录 一、反编译 APK1.1 解压 APK1.2 DEX 文件转换1.3 资源解码 二、重新打包 APK2.1 资源重新编译2.2 smali 转换为 DEX2.3 打包 APK2.4 签名 APK 三、技术原理3.1 Smali/Baksmali3.1.1 DEX 文件格式3.1.2 Smali 语法3.1.2.1 指令3.1.2.2 寄存器3.1.2.3 操作码3.1.2.4 注释…...

软件测试与软件缺陷的基础知识
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...