我们绝大多数程序员都是用命令式编程,因为学校教的编程就是命令式的,什么C、Java等等(当然他们也可以用函数式编程)。函数式编程和命令式编程不是一个相对应层次的概念。理论上,函数式编程的理论基础是Lambda演算,指令式编程基于图灵机。从程序员角度来看,函数式编程不支持赋值操作,一个函数的执行只会返回一个值,不会有任何副作用,所以看上去,一个函数就是一个大的表达式。
这里不再深入去谈函数式编程,更多可以看看前面提到的那个专题。
1. 编程到底是什么?
编程(程序设计)实际上是一个对现实世界中的事物抽象,并由计算机语言实现的过程。核心的步骤就包含三个:理解、抽象、实现。
不同的理解思路,会导致完全不同的抽象结果;不同的抽象结果就会提供各不同的理解。最后根据理解和抽象,由特定的语言完成时间,但其结果要想完全理解还需要前两个步骤支撑。
有点像建筑中的“房子是什么,房地产设计,盖房子”。
2. 编程的发展过程到底有哪些?
程序设计的历史,按照我的理解大致的几个主要阶段:
计算机程序设计历史前阶段;主要是纸带、存储器等原始方式。
计算机语言初级阶段;主要以汇编语言为主,面向的主要内容是“数据存储+指令集”;
计算机广泛工业语言设计阶段;主要以C语言为主的大面积应用,此时由C语言更面向人易懂的方向发展。并且操作系统,编译器,数据库软件开始发展;面向的主要内容是“程序=算法+数据结构”。此时在计算机软件设计学科中主要运用的还是“面向过程”的设计思路。
计算机语言高级发展阶段。主要是一些面向对象语言的出现。主要体现在C++语言的出现。主要面向的内容是“应用=对象+通讯”的方式。甚至很多语言开始“一切皆对象”的设计理念。面向对象的语言主要在该阶段得到了大力提倡。因为C++的复杂,Java的出现降低了复杂度,又充分利用了面向对象的特点。让面向对象的设计更是得到了大面积的推广和应用,尤其在企业级应用开发中。
各类语言频繁出现的繁荣各阶段。各类变成设计语言如面向WEB变成,函数式语言,面向并发的语言,终端设备的编程语言等等;这个阶段不好做评论。
3. 编程的过程解决的问题有哪些?
汇编语言:解决CPU指令集和存储系统的交互问题,提供“可编程”的能力
面向过称语言:提供小面积的问题解决思路,一个系统的代码如果不多,通过面向过程思路将系统划分为多个过程(多个函数+各类数据结构)进行系统设计。提供了初级规模的系统设计问题。
面向对象语言:当面向过程面对复杂的系统,复杂的世界时。如何“更好的理解和抽象”编程问题,变得更加重要。通过面向对象语言的特点“封装、继承、多态”,让程序分析和设计能容纳更大的编程范围和系统规模,也让程序设计人员更好的理解和抽象提供了非常重要的作用。
面向**语言:面向WEB,面向高并发,面向切面,函数式语言,终端开发等是在现有程序设计语言基础上不断改进,并解决特定领域特定问题的发展衍生;
4. 面向对象编程思想的重要性体现是什么?
大家都知道,面向对象的三大特性“封装、继承、多态”,但个人认为其中的“封装”是面向对象的最核心的特点。
究其原因,主要是“封装”让一个人可以理解的系统范围可以变得更广,可以让我们“更好的理解和抽象”我们所看到的世界。之前一个老师提到面向对象时,提到的是“间接”,我想间接也可以认为是“封装”的升级版。面向对象的思想带来“可维护性,可扩展性,可理解性”等让我们能在效率和水平上更加长进的东西。
5. 编程,就是控制复杂性
且慢!
面向对象虽然有如此多好处,C++与Java都因此得以广泛地使用。但是,一味地追求可维护性,却忽略了一点:编程,就是控制复杂性。还记得编程发展史初级阶段那会的“数据存储+指令集”,“程序=算法+数据结构”么?函数式编程语言,能够让你的编程更纯粹,更加直接地面向问题的本质。(《函数式编程有哪些优点?》)
6. 总结一句话
无论是面向过程、面向对象、还是函数式编程,都是编程范式,即编程的方法。而具体用什么编程语言则是工具。
我们编程的目的就是解决具体问题,而不是说比较工具与方法的优劣。比如你要砍一棵树,用斧子横砍能够砍倒,用锯子斜锯也能锯断,而非要比较斧子和锯子的优劣而意义不大,横着砍和斜着锯也没多大关系。我们的目的就是要木材,这就是编程最本质目的。
当然,我还是推荐多掌握几个工具,多学会几个方法。比如你现在只会PHP(斧子),命令式编程(砍),那么你见到什么树都只能用斧子砍。假如你再懂Python(锯子),函数式编程(锯),那么对某些树效率就会高很多。
来源:oschina
链接:https://my.oschina.net/u/217545/blog/214912