网站建设 之 函数式编程

面向对象现在很熟很熟了,但是函数式编程跟对象编程有什么必然的不同呢?

"表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。

函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。函数式编程使用参数保存状态。其他类型的语言,函数的返回值往往与系统状态有关,不同的状态之下,返回值是不一样的。这就叫"引用不透明",很不利于观察和理解程序的行为。

函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。由于s1和s2互不干扰,不会修改变量,谁先执行是无所谓的,所以可以放心地增加线程,把它们分配在两个线程上完成。函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。

任何运行着对外提供有用的功能的系统,内部状态数量再少,也不可能是0。热升级的关键是把当前系统的状态从旧代码的能处理的格式转换成新代码能处理的格式。所以比较理想的处理方法是,不同的 Object 只用消息交互,而不是用直接调用对应 Object 的方法来模拟消息。这样,你只要发一个消息给要更新代码的 Object ,这个 Object 收到消息后,先转换内部状态,再用新的代码替换掉旧的代码,就完成了热更新。这也就是你按照 OTP 风格写应用时,总是需要实现一个 code_change 的函数,用来转换状态。热更新的根本上说是要正确实现 OO ,而不是函数式,不是无副作用(或者说程序总是通过副作用来提供功能的)。Erlang无非就是建立了 OTP 风格,把内部状态(也就是所谓的副作用)隔离起来,在代码更新的时候,容易处理一点,且一个 Object 更新不会影响到别的 Object 而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值