浅谈编程范式(Programming Paradigm)

615 阅读3分钟

编程范式 - Programming Paradigm

WechatIMG91.jpeg

(万剑归宗)

范式可以称为解决某些问题或完全某些任务的方法,大家可能听过数据库的第一范式、第二范式、第三方式等等,其实在开发中也有对应的范式,专业词语叫Programming Paradigm,中文名叫编程范式。

计算机是通过二进制代码去运行的,只有0和1,为了方便我们和计算机通讯,虽然计算机历史发展不到100年,但是我们已经开发出几百种语言,其实这些语言万变不离其宗,都需要遵循一些策略、方法,这些策略、方法就是编程范式。

官方点的解释就是,一种根据编程语言的特性对编程语言进行分类的方法,一种语言可以分为多种范式。例如JavaScript来说,你可以用函数编程思想去开发,也可以使用面向对象思想去开发。

我个人理解的话,编程范式就是看待事物不同的思维方式

常见编程范式

paradigms.png

上图是我们常见的编程范式:

过程式编程(Procedural Programming)

面相对象编程(Object Oriented Programming)

函数式编程(Functional Programming)

编程范式里面又分了两大类:

命令式编程(Imperative programming)

声明式编程(Declarative programming)

命令式编程 - Imperative programming

命令式编程就是一步一步告诉计算机你想做什么、想发生什么。

举个真实世界的例子,假如你现在需要一杯茶,用命令式编程的话,你需要这样描述:

先到茶水间,看看热水壶是否有热水,如果有的话,倒入茶杯,并且放入茶包,如果没有热水的话,你需要接个水,然后煮滚,再倒入茶杯、放入茶包,最后再端出来。

举个代码上的例子,假如你现在需要从一份用户列表中,获取T开头的用户,用命令式编程的话,你需要这样写:

const users = ['tom','tony','ben'];

let tUsers = [];

for (let i=0; i < users.length; i++) {
  const user = users[i];
  if (user[0] === 't') {
    tUsers.push(user);
  }
}

console.log(tUsers); // (2) ["tom", "tony"]

声明式编程 - Declarative programming

声明式编程就是,直接告诉计算机应该做什么,但是不用具体描述要怎么做。

根据上面的真实世界的例子,如果声明式编程的话,你只需要这样描述:我需要一杯茶

根据上面的代码例子,如果声明式编程的话,你只需要这样写:

const users = ['tom','tony','ben'];

const tUsers = users.filter(user => user[0] === 't');

console.log(tUsers); // (2) ["tom", "tony"]

引用一下Essential LINQ里面的一段描述,方便大家理解:

Imperative programming requires developers to define step by step how code should be executed. To give directions in an imperative fashion, you say, “Go to 1st Street, turn left onto Main, drive two blocks, turn right onto Maple, and stop at the third house on the left.” The declarative version might sound something like this: “Drive to Sue’s house.” One says how to do something; the other says what needs to be done.

命令式编程要求开发人员逐步定义应如何执行代码。要以命令方式指示方向,您可以说:“去1st街道,左转进入 Main街道,行驶两个街区,右转进入Maple街道,然后在左边的第三个房子停下。” 声明性编程的话,可能听起来像这样:“开车去苏家。” 一个说如何做某事;另一个说需要做什么。

来自:Calvert,C Kulkarni,D (2009). Essential LINQ. Addison Wesley. 48.

参考资料

www.jobsity.com/blog/5-prog…

www.geeksforgeeks.org/introductio…

blog.csdn.net/woqutechtea…

stackoverflow.com/questions/1…