三大编程思想(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)的尴尬境地,带来不必要的复杂性

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

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

相关文章

Linux-自旋锁

概述 自旋锁是一种多线程同步机制,用于保护共享资源免受并发访问的影响。在多个线程 尝试获取锁时,它们会持续自旋(即在一个循环中不断检查锁是否可用)而不是立即 进入休眠状态等待锁的释放。这种机制减少了线程切换的开销&#…

数据库中的JSON数据类型

数据库中的JSON(JavaScript Object Notation)数据类型是一种用于存储JSON格式数据的特殊数据类型。JSON是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。在数据库中引入JSON数据类型,可以使…

pikachu靶场SSRF-curl测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、实现ssrf攻击 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.1) 2、使用工具/软件 测试网址:…

DNS 与 ICMP

DNS(Domain Name System)快速了解 DNS 是一整套从域名映射到 IP 的系统 DNS 背景 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序. 但是 IP 地址不方便记忆 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用 hosts 文件来描述主机 名和 IP 地…

微信开发者工具:音乐小程序报错

报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因:小程序没有直接获取本地文件,为了提高访问速度,而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…

测试主分支

测试主分支 输入汉字圆点.字母md有点别扭,以后锁定大小写,用.MD后缀 添加一行文字试试能不能自动从gitee同步到github 声明:本文使用八爪鱼rpa工具从gitee自动搬运本人原创(或摘录,会备注出处)博客&#…

JMeter如何设置HTTP代理服务器?

1、 2、添加线程组 3、设置HTTP代理服务器,目标控制器选择“测试计划>线程组” 过滤掉不需要的信息 4、设置电脑手动代理 5、点击启动,在浏览器操作就可以了

通过matlab建立excel,A1中输入F1,A2到A4为空。A5为F2,A6到A8为空。A9为F3依次类推。每个4个单元格增加1次F序号

% 初始化元胞数组 numElements 4 * 10; % 总共的元胞数量,按照每4个单元格一个F值来计算 str cell(numElements, 1); % 创建一个numElements x 1的元胞数组 % 填充元胞数组 for i 1:4:numElements str{i} [F, num2str(ceil(i/4))]; % 计算F后面的序号&a…

OpenCV-物体跟踪

文章目录 一、物体跟踪的定义二、OpenCV中的物体跟踪算法三、OpenCV物体跟踪的实现步骤四、代码实现五、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了丰富的功能来实现物体跟踪。以下是对OpenCV中物体跟踪的详细解释: 一、物体跟踪的…

QT 如何置顶窗口并激活

基本上,客户端软件都会有置顶某个窗口的需求。置顶窗口激活窗口,两者不是同一个问题。有时候窗口置顶了,并不代表该窗口属于激活状态。本文将尝试把这两个问题一起解决了,请看下文: 一、置顶窗口 通过函数setWindowF…

Ubuntu16.04安装openssl库

Ubuntu16.04安装openssl库 Chapter1 Ubuntu16.04安装openssl库 Chapter1 Ubuntu16.04安装openssl库 原文链接:https://blog.csdn.net/weixin_36584476/article/details/107321893 记录一下省得忘了 1.首先去openssl官网下载源码www.openssl.org/source/&#xff0…

进程同步、互斥

进程同步、互斥的基本概念 系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。 我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(比如摄像头、打印机)都属于临界资源…

python爬虫加解密分析及实现

第一种: 1、找到加密的接口地址,通过加密的接口地址全局搜索 2、通过打断点的方式,操作页面,跑到断点处时,即可找到加密串,如图二; 3、找到用的是哪种加密方式,如: cr…

Unity Apple Vision Pro 保姆级开发教程-准备阶段

视频教程: Unity PolySpatial 开发Apple Vision Pro教程, 三十分钟快速了解 Unity Vision Pro 中文课堂教程地址: Unity3D Vision Pro 开发教程【保姆级】 | Unity 中文课堂 开发Apple Vision Pro 使用原生开发和unity 开发有什么区别 如果你的项目需要…

python【装饰器】

装饰器(decorators)是 Python 中的一种高级功能,它允许动态地修改函数或类的行为。装饰器也称装饰函数,是一种闭包的应用:它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。 基本语法 其主要是…

解决方案:总结描述下知识蒸馏、量化、剪枝的区别

文章目录 一、现象二、解决方案 一、现象 在算法中,时而会听到知识蒸馏、量化、剪枝这三个专业名词,进行记录 二、解决方案 知识蒸馏:一般将复杂、学习能力强的网络学到的特征表示“知识”蒸馏出来,传递给参数量小、学习能力弱…

LSTM反向传播及公式推导

先回顾一下正向传播的公式: 化简一下: 反向传播从下到上逐步求偏导: 对zt求偏导(预测值和标签值相减): zt对未知数wt,ht,bt分别求偏导: ht对ot,Ct求偏导: ot对Net0求偏导: Net0对w0,b0求偏导: .... 总体的思路就是那个公式从下到上逐步对未知数求偏导: 下面是总体的流程…

docker 资源限制+调优详解

容器资源限制介绍 下面我将详细讲解 Docker 的各种资源限制及其在生产环境中的实际应用案例。我们将逐一探讨 CPU、内存、磁盘 I/O 和网络带宽的限制,并提供具体的配置示例和解释。 1. CPU 限制 1.1 设置 CPU 份额 --cpu-shares:设置容器的 CPU 优先…

Nginx介绍+openresty配置

参考:资源下载 Nginx介绍openresty配置 nginx使用场景 1.什么是nginx性能高,官方测试5万并发连接;对cpu 内存资源消耗很低,而且运行非常稳定 免费 开源2.nginx应用场景1.http服务器静态资源 图片 js css 2.虚拟主机"虚拟"出多个主机, 域名80 www…

【AIGC】ChatGPT与人类理解力的共鸣:人机交互中的心智理论(ToM)探索

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯心智理论(Theory of Mind,ToM)心智理论在心理学与神经科学中的重要性心智理论对理解同理心、道德判断和社交技能的重要性结论 💯乌得勒支大学研究对ChatGPT-4…