最近看了gitbook上面一本函数式编程的书。突然间对函数式编程有了更加深入的理解。而且前一阵子使用HRFrame第二版开发公司的项目的时候遇到一些本质性的问题。其实早就想开发第三版本了。但是无奈没有什么新的思路,因此第三版的开发迟迟没有开始。而且我觉得HRFrame从第一版到第二版只能说是更加简洁,核心思想并没有什么变化,如果再写一版,我个人是觉得没有什么意义。违背了我当初开发HRFrame的初衷。看过了书,有了对编程新的认识,第三版的开发工作正式开始。
为什么要使用函数式编程?
我的朋友都知道我是javascript,函数式脑,emacs“脑残粉”,在公司中多年前就推崇大家编写函数式代码。奈何当时水平不够,函数式到底是啥都不知道,只是隐隐觉得函数式代码量少,可读性高。关注了几年,找了好多相关资料去学习,感觉现在终于入门了。那么为什么要使用函数式编程。我举一个例子来说明这个问题。
一个用户管理的功能,一般情况下数据表中保存用户的出生日期,当读取的时候根据当前日期计算用户年龄。假设后台给的数据结构如下
{data:[
{id:1,name:'张三',birthday:'1984-01-04'},
{id:1,name:'张三',birthday:'1984-01-04'},
{id:1,name:'张三',birthday:'1984-01-04'},
......
]}
此时,如果我们要在前端显示用户的年龄,大概代码会这样编写。
var dateNow = new Date();
for(var i=0;i<data.length;i++){
var date1 = new Date(data[i].birthday);
data[i].age=dateNow.getYear()-date1.getYear();
}
//实例代码大家不要纠结是否能正常执行
以上的代码是我随着写这篇文章随手写出来的。我想说的并不是代码写的怎么样,而是要分析一下写这些代码的时候我的脑子在想什么。我们阅读的时候是顺序阅读的。因此从上到下,我看到了如下的重点。
- 数据表中保存的时候用户的生日。
- 根据用户的生日计算用户的年龄
- 数据表结构中有一个数组
- 数组中每一项是用户信息
- 用户信息中birthday是用户的生日
ok,我看到了全部的重点,多年的编程经验告诉我,这是处理数组,遍历每一个元素,取出生日,计算年龄。 首先我先敲一个for循环,当然还有for in更合适。然后我知道我可以取出每一个元素及生日,我要做的是用今年的年份减去生日的年份,ok我打开chrome的调试窗口,测试了一下计算方法。如图
ok了,我知道了如何使用Date对象进行年龄的计算,现在我把这些实验性质的代码放回到循环中。功能就算完成了。 好吧,这里要注意了,编写代码的时候,我们的大脑是什么样的顺序在输出代码?
- 循环
- 取数
- 转换格式
- 计算
发现了么,我们提取重点的顺序和大脑生产代码的顺序是反着的。OMG。这说明什么问题?我们编码时需要记住所有的重点以后才能顺利写出来代码,就像做高考语文题一样,我们看了文章,文章最末尾问,本文的中心思想是什么?于是我们又从头读一遍,概括一下,写出来。而且这种题目我是很不会做的。
因此,我们从当初学编程的时候,老师就告诉我们,注释是多么重要,一定要写注释。因为注释实际上就是对代码重点的描述。
var dateNow = new Date();//获取当前时间
for(var i=0;i<data.length;i++){//遍历用户数据
var date1 = new Date(data[i].birthday);//转换生日成为时间对象
data[i].age=dateNow.getYear()-date1.getYear();//当前年份-生日年份=年龄
}
这个例子还只是很基本很简单的例子,如果再加上UI,ajax更加实际的情况。这些代码写完了大概三个小时以后绝对会忘记里面一些关键的代码是如何执行的。
因此,很多人学不会编程,觉得写代码很累。真的很累,这还是写没有架构的代码,如果再加上设计,各种工厂,抽象类。项目后期客户需求一变动,OMG...头发....
说道这里,是不是函数式编程就是解决这些问题的银弹呢? no,no,no. 我只是在抱怨开发过程中坑是怎么产生的,我才不管怎么解决这些问题呢。从c语言开始,到java,.Net到python,ruby到golang等等编程语言都在试图解决这些问题。coding less,make more~
我喜欢解决方案的是,把老虎关在笼子里。 哪里产生bug,哪里产生不清晰,就把哪里封装起来。这一点,无论是函数式编程还是命令式编程,无论面向过程还是面向对象,所有编程风格都在诉说这个事情。那么为什么要学习函数式编程? 很简单的原因,解决问题的手段不嫌多啊~多一种手段,多一个视角。
javascirpt是最好的编程语言。没有之一。
未完待续...
我看的那本书: https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch1.html (出于对本书作者及译者尊敬,担心自己才疏学浅误人子弟,文章中很多例子直接采用书中的例子。)