之前写过一篇文章叫《面向对象的理解》
面向对象是一种程序设计的思想,之前人们搞程序设计用的都是面向过程的思想,更早则没有任何思想而言,随着人们对软件开发过程的深入,发现软件编程也是需要一类思想来指导的。就像共产主义革命,没有马克思主义的指导是无法成功的一样。
今天再来说说编程范式,记得很早之前有一次去面试,被问到关于编程范式的问题,当时这个词是第一次听说,完全蒙了.
百度百科
编程范型、编程范式或程序设计法(英语:Programming paradigm),(范即模范、典范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程的一类典型的风格(可以对照方法学)。 [1]
维基百科
编程范型、编程范式或程序设计法(英语:Programming paradigm),(范即模范、典范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程的一类典型的风格(可以对照方法学)。如:函数式编程、过程式编程、面向对象编程、指令式编程等等为不同的编程范型。
个人分析
编程编的多了,前辈程序员发现软件编程也需要一类思想来指导。就像共产主义革命,没有马克思主义的指导是无法成功的一样。我们经常说 Java是面向对象的编程语言、 C语言是面向过程的编程语言、scala是集面向对象编程范式与面向函数编程范式于一身的编程语言。所以说编程范式并不针对某一种语言,它是我们在写代码时候解决某类问题的一种指导思想。
- 某种语言可能只属于某一种编程范式例如汇编语言你就只能按照面向过程的范式去写代码,你写不出面向对象范式语言那样的代码;
- 某种语言有可能更倾向于某一种编程范式,例如C语言更倾向于面向过程的编程范式,因为C语言解决的问题往往是那种与数学算法相关的问题,但并不是说他不能用面向对象或面向函数的方式来写代码,例如它的 结构体 数据类型就有面向对象的苗头了;
- 某中语言可能可以使用多种编程范式来解决问题,例如C语言是在C语言的基础上发展出来的,它自然可以使用C语言式的面向过程的编程范式解决问题,有可以使用类、继承、封装、多态等诸多思想的面向对象范式编写代码,只不过他更倾向于面向对象编程而已,因为C已经不仅限于解决与数学算法相关的问题了。
面向过程(过程式、命令式)
一开始人们能用程序解决的问题比较少也比较局限,所以一开始人们关注的是事物发展变化的过程,前辈们自然而然的的就形成了面向过程编程的思维方式,要理解什么是面向过程,你首先需要知道什么是过程?过程就是事物发展的先后顺序,一个个事件发展连起来就是一个过程,而面向过程就是重点分析这个先后顺序,先干什么,后干什么,然后干什么。比如5除以2这个事件,面向过程的思维首先想到的是除法这个事件,所以它会先写一个除法的方法,用来接收数据5和3,就像这样div(5,3)。例如汇编语言需要知道把哪个寄存器的值移动到哪个寄存器,需要将哪两个寄存器的值进行求和,也就是我们的汇编指令MOV
SUB
SADD
等。试想你写一个从1加到100的一段汇编代码得多么麻烦。但是前辈程序员在这样的指导思想下写了几十年的代码。这种编程思想就叫面向过程编程,也叫指令式编程。即使是使用了大量高级助记符的高级语言例如C,C++,Java等也有很多编写方式用到的思想是指令式编程。
面向对象
随着程序要解决的问题的增多以及对事物发展认识的深入,人们发现事物才是需要关注的重点,事物的发展是由事物的本质决定的, 于是便产生了面向对象的设计思想,要理解什么是面向对象?你首先需要知道什么是对象,对象是对事物的抽象。那么什么是抽象?抽象就是对事物的归纳总结,那总结后会得出什么来呢?人们发现事物都有一些共同特点,那就是都有属性和动作,于是便概括出事物的属性和动作,归纳总结出来的这个抽象的东西就叫对象。那什么是属性?什么是动作呢?属性就是事物有哪些东西,动作就是事物能做那些事情,属性是内在的,动作是对外的。拿人为例,人有眼耳口鼻手,动作有看听说嗅打一样。那么人即是一个抽象,一个对象。对象有了,对象有千千万万,那么在对这同一类的对象进行抽象,就有了对象的类。类是对象的模板,对象是类的实例。同一类对象之间是有共性的,这种共性体现在他们是同一个模板刻画出来的,同一类对象之间是有差异的,这种差异体现在他们是不同的对象。我们把这些属性称为变量,把这些动作称为方法也叫函数,属性和动作都有他们作用的范围,我们称为变量和方法的作用域。比如5除以2这个事件,面向对象的思想首先想到的是5和2是一个整型,于是先创建一个整数类型的对象,对象包含一个基本的数据类型以及一个除法的行为,就像这样res=5.div(2).
面向函数(函数式)
随着编程大业的发展,先辈程序员发现,所有的编程行为都可以抽象为两个最最基本的函数,一个叫map一个叫reduce。函数是对行为过程的抽象,要想理解什么是函数式编程,要先知道什么是函数.函数式数学中的概念,从一个状态与另一个状态的对应关系,或者从一个状态到另一个状态的映射就是函数,y=f(x) 这个 f 就是函数。就像谈什么是面向对象一样,继承、封装、多态、抽象一样,谈什么函数式编程就要说函数式编程的特点,函数编程的特点有很多:函数式第一公民、高阶函数、模式匹配、无副作用、不变性。
函数其实说到底是一个集合到另一集合的映射。函数有 N多个名字,在 java 的类中叫方法,在 scala 的类中叫函数,在 java 的方法参数中叫 lamda 这个 lamda 的类型叫函数接口,而这个 lamda 又有一个别名叫 匿名函数,在引用了外部环境变量的 lamda 中叫闭包 (js 中有这种叫法,不知道准不准),在 OC 中叫 block ,很像,像到我都不想去区分他们。
总结
编程范式是一种解决特定问题的思想的抽象,它不与编程语言绑定,上面说的面向过程、面向对象、函数式编程 仅仅是我们常用到的三个,其实编程范式还有其他,不过我研究下来网上也没有一个比较权威的说法,我在这里也就不误人子弟了。