浅谈编程范式

| 分类 programming  | 标签 Programming  paradigm  浏览次数: -

范式分类

编程方式的简单分类

图1 编程方式的简单分类

范式和语言关系

范式和语言关系

图2 范式和语言关系

三大问

  • 1.是什么?
  • 2.为什么?
  • 3.怎么做?

编程范式

是什么

编程范式(Programming paradigm)是指一类典型的编程风格。因为编程范式是一种风格,所以一门编程语言往往可以用多种编程范式。

为什么

编程范式是程序员看待程序应该具有的观点,为了满足不同的场景,提高生产力而诞生的。

编程范式是编程语言的一种分类方式,它并不针对某种编程语言。就编程语言而言,一种编程语言也可以适用多种编程范式。

怎么做

根据程序的业务场景需要,选择不同的语言或者编程范式。

命令式编程(Imperative)

是一种描述计算机所需作出的行为的编程典范。几乎所有计算机的硬件工作都是命令式的;几乎所有计算机的硬件都是设计来运行机器代码,使用命令式的风格来写的。较高端的命令式编程语言使用变量和更复杂的语句,但仍依从相同的典范。菜谱和行动清单,虽非计算机程序,但与命令式编程有相似的风格:每步都是指令,有形的世界控制情况。因为命令式编程的基础观念,不但概念上比较熟悉,而且较容易具体表现于硬件,所以大部分的编程语言都是命令式的。

过程式编程(Procedural)

过程式编程和面向对象编程的区别并不在于是否使用函数或者类,也就是说用到类或对象的可能是过程式编程,只用函数而没有类的也可能是面向对象编程。那么他们的区别又在哪儿呢?

是什么

维基百科是这样定义过程式编程的(Procedural Programming):过程式编程某种意义上等同于命令式编程(为了达到预定的状态而执行指定的步骤)的同义词,同时也是一种编程范式——由结构化编程衍生而来,遵循过程调用的观念。

为什么

面向过程其实是最为实际的一种思考方式,可以说面向过程是一种基础的方法,它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。

怎么做

分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

优点

性能高,不需要实例化等操作。

缺点

过程式的方法使用了状态,而不是传入参数。方法通过改变外部变量影响了附近的代码,而不是通过返回值。为了搞清楚方法做了什么,读者必须仔细阅读每行。如果发现一个外部变量,必须找他它的出处,找到有哪些方法修改了它。

声明式编程(Declarative)

凡是非命令式的编程都可归为声明式编程。因此,命令式、函数式和逻辑式是最核心的三种范式。

函数式编程(Functional)

当谈论函数式编程,会提到非常多的“函数式”特性。提到不可变数据,第一类对象以及尾调用优化。这些是帮助函数式编程的语言特征。提到mapping(映射),reducing(归纳),piplining(管道),recursing(递归),currying4(科里化);以及高阶函数的使用。这些是用来写函数式代码的编程技术。提到并行,惰性计算以及确定性。这些是有利于函数式编程的属性。

是什么

是一种编程范式(programming paradigm),也就是如何编写程序的方法论。

它属于结构化编程的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。

比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。

最主要的原则是避免副作用,它不会依赖也不会改变当前函数以外的数据。

为什么

声明式的函数,让开发者只需要表达 “想要做什么”,而不需要表达 “怎么去做”,这样就极大地简化了开发者的工作。至于具体 “怎么去做”,让专门的任务协调框架去实现,这个框架可以灵活地分配工作给不同的核、不同的计算机,而开发者不必关心框架背后发生了什么。

怎么做

  • 表达式(expression): 是一个单纯的运算过程,总是有返回值;
  • 语句(statement): 是执行某种操作(更多的是逻辑语句。),没有返回值。

只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。

三个关键词,解耦、KISS、拼接,把运算/执行过程定义成不同的函数,通过管道拼接完成功能。

优点

  • 1.代码简洁,开发快速
  • 2.接近自然语言,易于理解
  • 3.更方便的代码管理
  • 4.易于”并发编程”
  • 5.代码的热升级

元编程

面向对象编程(Object-Oriented)

如果你专注于状态改变和密封抽象,你就是在用面向对象编程。

类只是帮助简化面向对象编程的工具,并不是面向对象编程的要求或指示器。

封装是一个过程,它分隔构成抽象的结构和行为的元素。封装的作用是分离抽象的概念接口及其实现。

类只是帮助简化面向对象编程的工具,并不是面向对象编程的要求或指示器。

是什么

维基百科上是这样定义面向对象编程(Object-Oriented Programming)的:面向对象编程是使用对象的编程范式——包含数据域、方法以及它们之间的交互——来设计应用和程序。编程技术包括包括数据抽象、封装、通信、模块化、多态和继承。

为什么

随着系统越来越复杂,系统就会变得越来越容易崩溃,分而治之,解决复杂性的技巧。面对对象思想的产生是为了让你能更方便的理解代码。有了那些封装,多态,继承,能让你专注于部分功能,而不需要了解全局。

怎么做

抽象描述一个对象的基本特征,将这个对象与所有其他类型的对象区分开来(把具有相同属性的东西进行抽象),提供清晰定义的概念边界。

如何写好的代码

工时

需要花大量时间,来学习、训练、总结。

知耻

每次重复的(类似的)错误就是自己的耻辱。

谦卑

知道 山外有山、人外有人,不要停下追求的脚步。

引用小野二郎的原话 —- “如果你认为自己已到极致,那是不切实际的,也是可笑的。”

总结

命令式编程、面向对象编程、函数式编程,虽然受人追捧的时间点各不相同,但是本质上并没有优劣之分。或者说,它们各自都有各自的优缺点,都有各自适合的领域。比如,命令式语言更适合批处理脚本的编写,面向对象语言更适合GUI界面的处理,函数式语言则更适合大量数据的并行处理,等等。在我看来,未来编程语言的发展趋势,应该是这几种编程范式的相互融合,在保证运行效率的前提下,提供更加人性化,更具语义特征的语言框架。

参考


上一篇 函数式编程     下一篇 Tornado源码分析<->
目录导航