文档章节

开始学习函数式编程后对编程的一些新感受

无牙子
 无牙子
发布于 2014/03/31 22:41
字数 1706
阅读 298
收藏 7

我们绝大多数程序员都是用命令式编程,因为学校教的编程就是命令式的,什么C、Java等等(当然他们也可以用函数式编程)。函数式编程和命令式编程不是一个相对应层次的概念。理论上,函数式编程的理论基础是Lambda演算,指令式编程基于图灵机。从程序员角度来看,函数式编程不支持赋值操作,一个函数的执行只会返回一个值,不会有任何副作用,所以看上去,一个函数就是一个大的表达式。

这里不再深入去谈函数式编程,更多可以看看前面提到的那个专题。

1. 编程到底是什么?

编程(程序设计)实际上是一个对现实世界中的事物抽象,并由计算机语言实现的过程。核心的步骤就包含三个:理解、抽象、实现。

不同的理解思路,会导致完全不同的抽象结果;不同的抽象结果就会提供各不同的理解。最后根据理解和抽象,由特定的语言完成时间,但其结果要想完全理解还需要前两个步骤支撑。

有点像建筑中的“房子是什么,房地产设计,盖房子”。

2. 编程的发展过程到底有哪些?

程序设计的历史,按照我的理解大致的几个主要阶段:

  1. 计算机程序设计历史前阶段;主要是纸带、存储器等原始方式。

  2. 计算机语言初级阶段;主要以汇编语言为主,面向的主要内容是“数据存储+指令集”;

  3. 计算机广泛工业语言设计阶段;主要以C语言为主的大面积应用,此时由C语言更面向人易懂的方向发展。并且操作系统,编译器,数据库软件开始发展;面向的主要内容是“程序=算法+数据结构”。此时在计算机软件设计学科中主要运用的还是“面向过程”的设计思路。

  4. 计算机语言高级发展阶段。主要是一些面向对象语言的出现。主要体现在C++语言的出现。主要面向的内容是“应用=对象+通讯”的方式。甚至很多语言开始“一切皆对象”的设计理念。面向对象的语言主要在该阶段得到了大力提倡。因为C++的复杂,Java的出现降低了复杂度,又充分利用了面向对象的特点。让面向对象的设计更是得到了大面积的推广和应用,尤其在企业级应用开发中。

  5. 各类语言频繁出现的繁荣各阶段。各类变成设计语言如面向WEB变成,函数式语言,面向并发的语言,终端设备的编程语言等等;这个阶段不好做评论。

3. 编程的过程解决的问题有哪些?

  1. 汇编语言:解决CPU指令集和存储系统的交互问题,提供“可编程”的能力

  2. 面向过称语言:提供小面积的问题解决思路,一个系统的代码如果不多,通过面向过程思路将系统划分为多个过程(多个函数+各类数据结构)进行系统设计。提供了初级规模的系统设计问题。

  3. 面向对象语言:当面向过程面对复杂的系统,复杂的世界时。如何“更好的理解和抽象”编程问题,变得更加重要。通过面向对象语言的特点“封装、继承、多态”,让程序分析和设计能容纳更大的编程范围和系统规模,也让程序设计人员更好的理解和抽象提供了非常重要的作用。

  4. 面向**语言:面向WEB,面向高并发,面向切面,函数式语言,终端开发等是在现有程序设计语言基础上不断改进,并解决特定领域特定问题的发展衍生;

4. 面向对象编程思想的重要性体现是什么?

大家都知道,面向对象的三大特性“封装、继承、多态”,但个人认为其中的“封装”是面向对象的最核心的特点。

究其原因,主要是“封装”让一个人可以理解的系统范围可以变得更广,可以让我们“更好的理解和抽象”我们所看到的世界。之前一个老师提到面向对象时,提到的是“间接”,我想间接也可以认为是“封装”的升级版。面向对象的思想带来“可维护性,可扩展性,可理解性”等让我们能在效率和水平上更加长进的东西。

5. 编程,就是控制复杂性

且慢!

面向对象虽然有如此多好处,C++与Java都因此得以广泛地使用。但是,一味地追求可维护性,却忽略了一点:编程,就是控制复杂性。还记得编程发展史初级阶段那会的“数据存储+指令集”,“程序=算法+数据结构”么?函数式编程语言,能够让你的编程更纯粹,更加直接地面向问题的本质。(《函数式编程有哪些优点?》

6. 总结一句话

无论是面向过程、面向对象、还是函数式编程,都是编程范式,即编程的方法。而具体用什么编程语言则是工具。

我们编程的目的就是解决具体问题,而不是说比较工具与方法的优劣。比如你要砍一棵树,用斧子横砍能够砍倒,用锯子斜锯也能锯断,而非要比较斧子和锯子的优劣而意义不大,横着砍和斜着锯也没多大关系。我们的目的就是要木材,这就是编程最本质目的。

当然,我还是推荐多掌握几个工具,多学会几个方法。比如你现在只会PHP(斧子),命令式编程(砍),那么你见到什么树都只能用斧子砍。假如你再懂Python(锯子),函数式编程(锯),那么对某些树效率就会高很多。


本文转载自:

共有 人打赏支持
无牙子
粉丝 5
博文 9
码字总数 2058
作品 0
海淀
程序员
加载中

评论(1)

云开_yunkai
云开_yunkai
good
《RxJava 2.x 实战》

我最近写了一本书《RxJava 2.x 实战》。 该书由电子工业出版社出版,目前已经在淘宝、京东、当当、亚马逊等各大电商平台上进行销售或预售。 天猫电子工业出版社旗舰店 https://detail.tmall...

fengzhizi715
04/28
0
0
Clojure:让我兴奋的编程语言

最近我一直有想写一点关于Clojure的东西的冲动。但不巧的是,还有一个更大的冲动经常出现,就是要用Clojure语言重写我的这个博客网站,这也就让这篇文章的出炉延迟了一段时间。那么,下面就让...

oschina
2014/05/22
20K
23
F#系列随笔索引

循着我的Google笔记本,我看到第一条与F#相关的笔记发生在4月7日,到今天刚好6个月整。 为何要学习F#?这是个首当其冲的问题,跟当初“Java还是C#”这样的问题不同,现在是在学习一门新语言。...

长征3号
2017/12/21
0
0
函数式编程很难,这正是你要学的原因

很奇怪不是,很少有人每天都使用函数式编程语言。 如果你用Scala,Haskell,Erlang,F#或某个Lisp方言来编程,很可能没有公司会花钱聘你。这个行业里的绝大部分人都是使用像 Python,Ruby,J...

凯奥斯
2012/10/16
0
0
只学2个月编程能写出什么代码?

俗话说得好: 光说不练假把式 编程界也有句名言: Talk is cheap, show me the code. 关注我们编程教室有一段时间的朋友应该知道,除了提供各种学习资源和交流群组外,我们还有一套入门课程,...

crossin
06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
10
0
vm GC 日志 配置及查看

-XX:+PrintGCDetails 打印 gc 日志 -XX:+PrintTenuringDistribution 监控晋升分布 -XX:+PrintGCTimeStamps 包含时间戳 -XX:+printGCDateStamps 包含时间 -Xloggc:<filename> 可以将数据保存为......

Canaan_
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部