函数编程之道
大师和他的徒弟盘坐着进行图灵冥想,沉思Lambda. 徒弟看着大师问:“老师,你能告诉我什么是简单吗?编程是复杂的,框架通过去除选择使得编程入手变得简单,那么类和框架哪个更好呢?”
大师看着徒弟问:“你读过智者大师Carmack微博吗?有时,优雅的实现只需要一个函数,不是一个方法,也不是一个类,不是一个框架,只是一个函数即可。”
“但是,老师”学生开始要发问,但是老师打断它,问:“难道表示not functional(非函数性、非功能性)的词语不是dysfunction(功能性障碍、不举)的意思吗?”
徒弟忽然明白了。
1. 不变性:真正的不变是变化,可变性隐藏了变化,隐藏了变化就会带来混乱,智者会积极拥抱历史。
如果你有一块钱,我再给你一块钱,这并不能改变之前你仅有一块钱的情况,现在你有了两块钱,而可变性试图抹掉历史,但是历史又不能真正被删除,当过去事实无法追溯,它就如同鬼魂缠绕你,表现为程序中的Bug。
2.分离:逻辑是思想,效果是行动,智者总是在行动前思考,只有当思考完成后才行动。
如果你试图同时执行动作和逻辑,你会制造副作用,它会引起你逻辑中的bug,保持函数最小化,一次只做一件事,做好它即可。
3.组合:自然的一切都是和谐的,一棵树没有水不能生长,一只鸟而没有空气不能飞翔,智者总是通过配料把汤的味道做得更好。
为组合进行计划,自然地将函数输出作为其他函数的输入,保持函数签名尽可能简单。
4.保护:时间是宝贵的,努力会花费时间,智者总是尽可能重用它们的工具,愚者子女故事为每次新情况创造特殊工具。
类型特定的函数不能被不同类型的数据重用,智者会让函数处理许多数据类型,或者包装起数据,让其看上去和函数预期的一样,列表List和其中条目item是最伟大的通用抽象。
5.流水不腐:死水无法饮用,食品丢在一边会腐烂,智者总是让事情流动起来。
基于时间的列表集合是一个流。共享对象和数据固定会使得函数彼此相互干扰,同一个资源的线程竞争能够绊倒对方死锁,只有当数据通过纯函数自由地流动起来,程序才是有条理,可预期的。
6.智慧:智者迈出第一步之前首先找到路,智者是函数思维,而不智者会在丛林中迷失方向。
The Dao of Immutability — JavaScript Scene — Mediu
[该贴被banq于2015-04-10 14:14修改过]