函数式编程
昨天才刚刚听mike编程的一些事情。原来编程范式不仅仅是有面向过程,面向对象什么的方法论。原来面向对象和面向过程都属于命令式编程的方法。就是机器按照他们的命令一条一条执行。在他们之外,还有函数式编程的方法论。可以借鉴阮一峰老师的一些讲解函数式编程初探。
在网上还看到了下面的一段话,觉得说的很好。mike也说,这不是语言的问题,这是哲学的问题。
所谓编程范式(programming paradigm),指的是计算机编程的基本风格或典范模式。借用哲学的术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论。我们知道,编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。比如我们常用的“面向对象编程”就是一种范式。由于着眼点和思维方式的不同,相应的范式自然各有侧重和倾向,因此一些范式常用‘oriented’来描述。换言之,每种范式都引导人们带着某种的倾向去分析问题、解决问题,这不就是“导向”吗?如果把一门编程语言比作兵器,它的语法、工具和技巧等是招法,它采用的编程范式则是心法。编程范式是抽象的,必须通过具体的编程语言来体现。它代表的世界观往往体现在语言的核心概念中,代表的方法论往往体现在语言的表达机制中。一种范式可以在不同的语言中实现,一种语言也可以同时支持多种范式。比如,PHP可以面向过程编程,也可以面向对象编程。任何语言在设计时都会倾向某些范式,同时回避某些范式,由此形成了不同的语法特征和语言风格。抽象的编程范式须要通过具体的编程语言来体现。范式的世界观体现在语言的核心概念之中,范式的方法论体现在语言的表达机制中。一种语言的语法和风格与其所支持的编程范式密切相关。
mike举了几个很形象的例子,我分享一下。
- 命令式编程就是我们大家平时学的那样,在开发一个网站的时候,会从需求分析,uml建模,设计数据库,UI等等。把一个网站一步一步拆分,抽象出来。并且用一些所谓的21或34种涉及模式等等来做这个项目。函数式编程是以网站的data为主,设计好data以后,开始写各个模块(可能是这个网址不需要的模块),当模块达到一定的数量以后,开始拼接模块,链接模块之间的data。最后根据网站的需求,把一些模块组合起来成一个项目。俩种范式的优劣,还是自己思考比较好。还有很多哲学的问题,也需要思考。
- 好比我们开一个酒店。现在我们关注一下酒店的菜单。菜单上只有一个菜叫白菜炖猪肉,需要猪肉和白菜。当顾客来的吃饭的时候,只能选择这一个菜。后来又发明了宫保鸡丁,鱼香肉丝等等21中菜品。每次顾客来吃饭的时候,只能从这里面选择。因为没有其他的菜品可以让顾客选。但是由于酒店经常做这几样菜,所以很熟练,开始的时候基本能满足顾客的需求。但是随着顾客的刁钻,酒店只会让顾客越来越失望。当然酒店还可以这么开,一开始菜单上就没有菜品,之让厨师负责去买材料,把猪肉,白菜,鸡丁,牛肉等等各种材料搞回来,让厨师自己发挥,想怎么搞就怎么搞。最后就会出来n种菜品。等到顾客来的时候,可以把n中菜品展示给顾客,随便他们挑。这是俩种不同的方式,类比俩种编程范式。
Paul Graham在《黑客与画家》一书中写道:同样功能的程序,极端情况下,Lisp代码的长度可能是C代码的二十分之一。
如果程序员每天所写的代码行数基本相同,这就意味着,”C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。”当然,这样的对比故意夸大了差异,但是”在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。”
meteor中的data组织
学习meteor有俩周了,算是从零基础开始吧。一共学了三部分。meteor(开发环境)+react(一种框架)+ es6(js的儿子,一种编程语言)。按照我的理解应该这么分:
- 前端 react.js
- 后台 node.js
- 数据库 mongodb
一般meteor的后台和数据库不会变。前端框架很多,可以选择很多,比如官方提供的Blaze,React,还有其它一些meteor支持的框架,感觉支持es6的前端框架都可以用(说笑,没测试)。
先来活动一下大脑。假设你坐在电脑面前,在两个窗口中打开同一个文件夹。
在其中一个窗口中删除一个文件,另一个窗口中的这个文件会消失吗?
不用实际操作你也知道肯定会消失的。在本地文件系统中的操作,不用刷新或者回调,变动就能应用到所有地
方。
我们再来看一下相同的事情在网页中会有什么结果。例如,你在两个浏览器窗口中打开同一个 WordPress 后台
页面,在其中一个窗口中新建了一篇文章。和桌面系统不同的是,不管等待多长时间,另一个窗口都不会发生变
化,除非你手动刷新网页。
过去这些年,我们已经习惯了,人和网站之间的通信是离散的。
但是,作为新一代框架和技术之一的 Meteor,尝试挑战这一现状,让网页能够实时和响应。
Meteor 的核心功能, 那就是服务器端和客户端的自动数据同步.这些数据在Meteor中被存储在集合(Collection)中。 集合是一种特殊的数据结构, 通过发布(publications)和订阅(subscriptions)机制把数据实时同步上行或者下行到连接着的各个用户的浏览器或者Mongo数据库中。
Posts = new Mongo.Collection(‘posts’);
这样就声明了一个Collection。你可以像mongodb一样操作它
存储数据
网络应用有三种基本方式保存数据,各种方式有不同的角色:
- 浏览器内存:像 JavaScript 变量的这些数据会保存在浏览器内存中,意味着他们不是永久性的:它们存在
于当前浏览器标签中,当标签关闭后它们会消失。 - 浏览器存储:浏览器也可存储较为永久性的数据,使用 cookies 或本地存储 Local Storage (http://diveintohtml5.info/storage.html) 。虽然数据会在不同 session 间保持,但是只是针对于当前用户(包括标签之
间)但不能轻易地共享给其他用户。 - 服务器端数据库:你想永久保存数据并且提供给多个用户的最好方法是数据库(MongoDB是Meteor 应用默认的方案)。
Meteor 使用所有三种方式,有时会从一个地方同步数据到另一个地方(我们会马上看到)。话虽如此,数据库仍然是包含数据主副本的“规范化的”数据源。
(ps:未完待续,已经很晚了。该看书了。明天有空继续写)