面向对象编程、面向过程编程、函数式编程等等,这些也许是大家经常会听到的术语,这些都是什么意思,干什么用,他们之间有什么区别和联系,这篇文章来给大家讲讲这些以及他们的编程思想,也许会给大家带来一些启示。
(本篇文章的观点仅代表本人观点,如有不对还请客气地指出!)
编程范式
编程范式(英语:Programming paradigm),(范即模范、典范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程的一类典型的风格。如:面向对象编程、面向过程编程、函数式编程、命令式编程等等为不同的编程范型。
面向对象编程:面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。
面向过程编程:“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。
函数式编程:函数式编程(programming paradigm)是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
命令式编程:命令式编程(英语:Imperative programming),是一种描述计算机所需作出的行为的编程典范。几乎所有计算机的硬件工作都是命令式的;几乎所有计算机的硬件都是设计来运行机器码,使用命令式的风格来写的。(此编程范式不是本篇文章讲述的重点,只是列出来和其它有个对比。)
上述几个术语的官方解释也许不是很好理解,看了术语解释先有一个大概的认识,接下来通过一些通俗易懂的话语和例子来讲述一下,理解不同编程范式都有一些什么思想以及优势。
For example:
我们要实现一个计算器的程序,输入(5+4)* 8 - 6后计算出结果值。
任何一种编程范式都可以实现该程序,但是思考和编写方式有着很大的不同。
面向过程编程
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
第一步、求5 + 4之和;
第二步、将第一步结果乘以8;
第三步、将第二步的结果减去6;
第四步、输出第三步的结果;
依次执行上面每个步骤即可得到最终值。
分析
面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现,一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。
函数式编程
函数式编程依靠的是不使用或不改变全局状态的函数,他们唯一使用的状态就是传给函数的参数。一个函数的结果通常被继续传给另一个函数。因此,程序通过函数之间传递状态,避免了全局状态的问题,也因此消除了由此带来的副作用和其他问题。
或者变换一种展示方式更容易理解
分析
函数式编程中没有赋值语句,因此变量一旦有了值就不会再改变。更通俗的讲,函数式编程没有副作用——除了结算结果,调用函数没有别的作用。这样消除了bug的一个主要来源,也使得执行顺序变得无关紧要。因为没有能够改变表达式值的副作用,可以在任何时候对它求值。由于能够在任何时候对表达式求职,所以可以用变量的值来自由替换表达式,反之亦然——即程序是“引用透明”的。
面向对象编程
面向对象是以功能来划分问题,而不是步骤和函数,因此我们关心的是计算器这个类,这个类有什么功能和属性。
分析
面向对象的分析方法是利用面向对象的信息建模概念,如实体、关系、属性等,同时运用封装、继承、多态等机制来构造模拟现实系统的方法。传统的结构化设计方法的基本点是面向过程,系统被分解成若干个过程。而面向对象的方法是采用构造模型的观点,在系统的开发过程中,各个步骤的共同的目标是建造一个问题域的模型。在面向对象的设计中,初始元素是对象,然后将具有共同特征的对象归纳成类,组织类之间的等级关系,构造类库。在应用时,在类库中选择相应的类。
已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。 此外,面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。
总结
函数式相比于面向过程编程方式是进一步的提升,面向过程的特性就是解决一个问题,需要一步一步分析需要怎样,然后需要怎样,一步一步实现的。而函数式编程则引入了引用透明、不修改状态、无副作用的思想,这样的编程方式更易于代码简洁、并发和管理。
面向过程和函数式是具体的东西,而且面向过程和函数式是面向对象的基础。面向对象可以说是面向过程和函数式的抽象,比如汽车有开车,加减速和刹车,关于汽车的操作有好多,每一个都需要一个具体的过程来实现,把这些过程抽象的总结起来就可以形成一个类,这个类包括的汽车所有的东西,所有的操作。