前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >编程范式粗讲

编程范式粗讲

作者头像
三毛
发布于 2019-08-20 03:27:35
发布于 2019-08-20 03:27:35
58000
代码可运行
举报
文章被收录于专栏:漫漫前端路漫漫前端路
运行总次数:0
代码可运行

编程范式粗讲

编程范式(Programming paradigm)指计算机编程的基本风格或典型模式。

编程范型提供了(同时决定了)程序员对程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象,而在函数式编程中一个程序会被看作是一个无状态的函数计算的序列。

着眼于解决问题的不同方式,编程范式现存许多种,其中如:面向过程、面向对象、函数式编程等范式,我们对此比较熟悉,他们也经常出现在我们的视野中。为了进一步加深对编程范式的认识,这里介绍几种常用的编程范式。

面向过程

面向过程编程,也被称之为命令式编程,是一种最原始,也是我们最熟悉,日常工作中使用较多的一种编程范式。从本质上讲,它是「冯.诺伊曼机」运行机制的抽象,它的编程思维方式源于计算机指令的顺序排列。

面向过程的核心是将解决问题的步骤分析出来,用函数将这些步骤实现,然后再被依次调用。

比如一个经典的例子:

把大象放在冰箱分为几步?

第一步:把冰箱打开

第二步:把大象装进去

第三步:把冰箱门关上

得益于面向过程的直观性,以及最接近于程序的实际运行,到现在,它仍然被大范围的使用。

但是它不适合某类问题的解决,例如那些非结构化的具有复杂算法的问题。它必须对一个算法加以详尽的说明,并且其中还要包括执行这些指令或语句的顺序。实际上,给那些非结构化的具有复杂算法的问题给出详尽的算法是极其困难的;并且它强调顺序至关重要,而这并不适合所有问题。

面向对象

面向对象编程(OOP:Object Oriented Programming)把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数,它最早由 Alan Kay 在 1966 年或 1967 年在研究生期间提出。

与面向过程编程不同,在面向过程编程中,数据和处理数据的函数彼此独立,我们需要先将数据处理成函数能接受的格式,然后调用相关函数。而在在面向对象中,数据和处理数据的函数都在一个类中,通过初始化实例传递数据。

现如今,当谈及面向对象时,下意识的就会联想出它的三个特性:封装、继承与多态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal {
  constructor(
    public name: string
  ) {}

  eat() {
    console.log('eat food')
  }
}


class Cat extends Animal {
  constructor() {
    super('Cat')
  }
}

class Bird extends Animal {
  constructor() {
    super('Dog')
  }
}


复制代码

网上也有一张的图,形象的解释了面向对象中的一些常见概念:

用面向对象的方式来解释「把大象关进冰箱」:

冰箱.开门()

冰箱.放入(大象)

冰箱.关门()

面向切面

面向切面编程(AOP:Aspect Oriented Program)是对面向对象编程的一个补充。我们知道在面向对象编程时,无法做到重复使用与主业务无关的某些方法。比如 A、B 两个类,如果都要使用日志功能,按照面向对象的设计原则,你必须在每个类里面都写上这样一个方法,尽管他们几乎一摸一样。当然你也可以选择将这样一段代码放到一个独立的类里,然后再在A、B类中调用,但是这样就等于形成了一个强耦合的关系,它的改变会影响到这两个类。面向切面编程,正是解决的这样一个问题:把和主业务无关的事情,放到代码外面去做。

比如在前端,实现一个代码埋单时:

如果不使用 AOP 你的代码可能是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Test {
  add(paras: Params) {
    // 埋点代码
    // 其他代码
  }
}
复制代码

但是这样会造成耦合,且不能复用。

使用 AOP 时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function log(): MethodDecorator {
  return (target, key, descriptor) => {
    // 在这里你可以加上你的埋点接口
    // 或者做一些其他事情
    return descriptor;
  };
}


class Test {
  @log()
  add(paras: Params) {
    //
  }
}
复制代码

再比如后端接口的鉴权,你可能会在中间件中处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function guardsMiddle(req, res, next) {
  // 这里可能会有各种判断
  // 判断 url 是否是指定 url,然后再判断是否有权限
  next()
}
复制代码

或者你会在某个具体的 controller/services 中处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SomeController {

  getUserInfo() {
    // 现判断是否有对应的权限
    // 再做具体的处理
  }
}
复制代码

在 AOP 中,则可能是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller()
class SomeController {

  @Get('userInfo')
  @Roles('admin')
  getUserInfo() {
    //
  }
}

复制代码

面向接口

同面向切面编程一样,面向接口也是对面向对象的一种补充。它规定了实现本接口的类必须拥有的一组规则。比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Animal {
  eat(): void;
}

class Cat implements Animal {

  eat() {}
}

class Dog implements Animal {
  eat() {}
}

复制代码

在开发 vscode 插件时,会使用很多从 vscode 中暴露出来的接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class StatusBar implements vscode.Disposable {
  dispose() {
    // xxx
  }
}

class TargetTreeProvider implements vscode.TreeDataProvider<{}> {
  getChildren() {
    // xxx
  }
}
复制代码

你可能会有疑问,我也可以使用抽象类实现,那么区别是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class Animal {
  abstract eat(): void;
}

class Cat extends Animal {
  eat() {}
}

复制代码

在文中这两个例子里,使用接口或是抽象类,是没有多少区别的,唯一的区别仅仅是在 TypeScript 编译成 JavaScript 后,interface 不存在了(不会有额外使用额外空间)。除此之外,抽象类可以包含程序的实现细节,即是可以实现代码的复用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class Animal {
  constructor(private name: string) {}

  abstract eat(): void;

  printName() {
    console.log(this.name);
  }
}

class Cat extends Animal {
  constructor() {
    super('cat');
  }

  eat() {}
}

class Dog extends Animal {
  constructor() {
    super('dog');
  }

  eat() {}
}

复制代码

另外,接口和抽象类的另外一个区别在于:抽象类和它的子类之间应该是一般和特殊的关系,而接口仅仅是类应该实现的一组规则。

总结

如今,编程范式现存许多种:

每个编程范式在自己所注重的场景里发挥着举足轻重的作用。比如 OOP 注重的是数据和行为的打包封装以及程序的接口和实现的解耦;而 FP 最大的特点是纯函数的无状态性质;面向过程则更贴近于实际工程中硬件的运行方式。

每个范式都有它的「灵魂」,只有在实际使用时,才能理解。

在实际项目中,更多的时候,我们是使用的多范式编程,正如范·罗伊信仰的一样:解决一个编程问题,需要选择正确的概念;解决多个问题,则需要组合分属不同部分的多个概念。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年08月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
编程范式整理
与成百种编程语言(Programming Language)相比,编程范式(Programming Paradigm、范式)要少得多。
杨丝儿
2022/03/17
3650
编程范式整理
编程_三大编程思想:POP、OOP、AOP
POP:面向过程编程(Procedure Oriented Programming)
mikimo
2022/07/20
3.4K1
新手必须要注意的编程范式
与成百种编程语言(Programming Language)相比,编程范式(Programming Paradigm、范式)要少得多。
苏州程序大白
2021/10/28
7040
新手必须要注意的编程范式
系统学习SpringFramework:Spring AOP
AOP(Aspect oriented programming),即面向切面编程,它是一个编程范式,是 OOP(面向对象编程)的一种延续,目的就是提高代码的模块性。
栗筝i
2022/12/01
2720
编程思想_编程有必要给孩子学吗?
实现目的:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用。 主要概念:方法、过程
全栈程序员站长
2022/08/04
5790
JAVAEE框架之Spring AOP
从该图可以很形象地看出,所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。
张哥编程
2024/12/19
1080
JAVAEE框架之Spring AOP
面向对象编程
面向对象编程更适合构架大规模复杂应用,采用面向对象编程思路编写的代码更加容易扩展和维护。面向过程编程代码写起来更加容易,直接了当,但是代码的复用性和封装性比较差。函数式编程代码复用性、抽象级别更高、代码健壮稳定,但是二次修改比较困难。
一行舟
2022/08/25
7020
JS面向对象详解
面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样,大家接触的第一门计算机语言大概率都是C语言,C语言就是一门典型的面向过程的计算机语言。面向过程主要是以动词为主,解决问题的方式是按照顺序一步一步调用不同的函数。面向对象是以名词为主,将问题抽象出具体的对象,而这个对象有自己的属性和方法,在解决问题的时候,是将不同的对象组合在一起使用。
grain先森
2019/03/29
2.4K0
面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?
首先声明:IoC & AOP 不是 Spring 提出来的,它们在 Spring 之前其实已经存在了,只不过当时更加偏向于理论。 Spring 在技术层次将这两个思想进行了很好的实现。
Guide哥
2020/05/15
1K0
面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?
springaop面向切面编程_简述面向切面编程思想
AOP是Aspect-Oriented Programming的缩写,中文翻译是面向切面编程。作为Spring的特征之一,是要好好学习的。
全栈程序员站长
2022/08/03
5090
springaop面向切面编程_简述面向切面编程思想
博主说一个案例就可以讲明什么是面向切面编程,粉丝笑了!
💘 一、前言 大家好,我是小诚,又到了愉快的学习时间,上一周因为小伙伴投稿,所以写了:《什么是面向接口编程》,文章颇受大家欢迎,于是又有小伙伴建议介绍关于:面向切面编程的知识点,于是就有了本篇文章,没办法,就是这么宠粉!(有亿点自恋...) 再唠叨两句,因为工作和个人要求原因,之前写得MySQL从0学习序系列好久没有更新了,但是,请大家相信,这个系列不会断更,小诚会要以更高的要求和质量继续编写,相信能够给大家带来更多更好的文章。 💕 三、初次见面-面向切面编程   前一篇文章我们介绍了什么是面
IT学习日记
2022/09/13
3450
博主说一个案例就可以讲明什么是面向切面编程,粉丝笑了!
js面向对象编程_JavaScript高级编程
面向过程即分析出解决问题所需要的步骤,然后用函数将这些步骤一步步实现,使用的时候再一个个的一次调用就可以了;
全栈程序员站长
2022/09/24
1.1K0
js面向对象编程_JavaScript高级编程
面试之Spring AOP和IOC
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
Java技术债务
2022/08/09
3850
面试之Spring AOP和IOC
《Kotin 极简教程》第7章 面向对象编程(OOP)(1)第7章 面向对象编程(OOP)《Kotlin极简教程》正式上架:
在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。在本章节以及下一章中,我们将一起来学习Kotlin对面向对象编程以及函数式编程的支持。
一个会写诗的程序员
2018/08/17
1.1K0
【Java 基础篇】Java 面向对象
Java是一种面向对象的编程语言,它支持面向对象的编程范式。面向对象编程(OOP)是一种编程思想,通过将现实世界中的事物抽象为对象,以对象之间的交互来完成任务。本篇博客将围绕Java面向对象展开讨论,并提供示例代码来说明面向对象的概念和实践。
繁依Fanyi
2023/10/12
2270
可视化编程和低代码编程&面向切面编程和依赖注入
SPRING 的核心思想是AOP,DI和IOC. 面向切面编程是一种新的编程思维。程序开发和做手术的过程有很多的类似之处。工程师,机械师以及医生都是需要动手和动脑的职业。面向切面的编程过程在垂直线性执行的代码的某一处横向植入一部分代码片段,并保证代码的正确执行。
coderlwz
2023/03/13
4600
聊聊程序设计思想之面向切面编程AOP
因为使用AOP结构,JBoss 4.0的源码要比JBoss 3.X容易理解多了,这对于一个大型复杂系统来说是非常重要的。
進无尽
2018/09/12
9790
聊聊程序设计思想之面向切面编程AOP
Python学习(七)---- 面向对象学习(类)
原文地址: https://blog.csdn.net/fgf00/article/details/52449707 编辑:智能算法,欢迎关注!
智能算法
2018/08/17
4470
JS高级——面向对象
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。
岳泽以
2022/10/26
2.3K0
JS高级——面向对象
Java面向对象回顾
一切皆对象,现实生活中:电脑、耳机、水杯、书等等,相比现实生活,程序中的对象是抽象出来的,要么是基于现实中的对象抽象出来,只包含了现实中对象的部分信息,要么是根本应用程序的需要而抽象出来的,如:职工对象(通常只记录部分与职工相关性较高的信息),学生对象(通常也只记录与学生相关性较高的信息)。职工和学生是一个“角色对象”,因为他们也可能同时是儿子、女儿、父亲、母亲、观众、演员……,但在特定的场景下仅使用他们对应的属性信息等。程序中也有现实中不存在的对象,比如一个数据库、一张数据表、一个服务器的连接,这是根据应用程序的需要抽象得到的,为了完成业务需求!
訾博ZiBo
2025/01/06
900
相关推荐
编程范式整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验