vlambda博客
学习文章列表

.NET并发编程-函数式编程


本系列学习在.NET中的并发并行编程模式,实战技巧

函数式编程

和面向过程编程 POP (procedure oriented Programming)面向对象编程 OOP (object oriented programming)一样也是一种编程思维。函数式编程 FP (functional programming)和面向过程比较类似,但它更加抽象。

举个
五子 棋,用面向过程编程开发流程就是:  ① 开始游戏->②黑子 先走->③绘制局势->④判断输赢->⑤轮到白子->⑥绘制局势->⑦判断输赢->⑧返回步骤②->⑨输出结果,每一步骤写成单独的函数就是面向过程的编程思维。 优点 逻辑很清晰,较少的抽象

面向对 象编程可以从另外一个角度来解决这个问题,本质就是按功能角色划分,将不同的函数封装到不同的对象中。 黑白双方一个对象,棋盘对象用于绘制棋盘局势,规则对象用于判断输赢是否五子连心。 各个对象之间互相通知,互相协调。 优点维护修改方便,如果换成围棋,直接修改规则对象判断棋子是否还有“气”,或者通过面向对象特性去 扩展一个对象。理解起来可能比较困难,实际代码执行可能分散到太多分支上

面向函数编程呢? 函数也是一个独立的存在,它 可以像变量一样在任何地方出现 因为在面向过程中,不需要将函数做当方法来调用,直接在过程中调用,像Lambda表达式,对一个集合进行快速处理,不需要额外增加方法,调用出编写一个临时函数即可。

函数

先思考一个问题,函数一定要当做方法放在一个对象中吗? 答案是否定的,函数并不属于对象,它是独立的。 在函数式编程思维里,函数可以通过变量,参数等方式传递到任何地方,可以在任何地方被调用, 它和基本数据类型的待遇一样 函数式语言一直以来都比较低调,直到 并发计算编程瓶颈 的出现。

实现并发

并发容易造成什么问题? 从单线程到多线程中,共享状态的变化容易 不受控制 传统的解决方案就是同步对资源的访问,避免线程之间的争用。 这样也不是万全之策,同步访问 互斥锁容易出现竞态和死锁 根本的解决方案应该是不依赖于这些变量,既然是变量,就不能依赖于它的状态。

FP在并发编程上的优势


  • 可变性。在FP中没有变量赋值的概念。对象一旦确定值就不可更改,这在线程之间可以安全的传输。


  • 纯函数。函数不会修改函数体之外的任何类型的输入或数据,也就是纯函数,没有副作用(副作用就是相同的输入可能产生不同的输出)。输出取决于输出,相同的参数传递给纯函数,输出只会是相同的值,产生一致的预期行为。


  • 延迟计算。在FP中按需检索函数的结果,或将大数据流的分析推迟到需要时。


  • 可组合性。组合函数创建更高级的抽象,有利用解决复杂问题。


NULL值的错误


高级语言一般都有NULL值类型。Tony Hoare在1965年设计ALGOL面向对象语言时引入了null引用。大约44年后,他为发明他道歉,称它是10亿美元的错误。

我无法抗拒引入null引用的诱惑,因为它非常容易实现。这导致了无数的错误、漏洞和系统崩溃。

F#是.NET语言的一部分,是一种函数式编程语言 。它就强烈反对null值,鼓励使用不可变的数据结构,天生适用于并发。 C#是在.NET3.5之后也引入函数式范式,增加了诸如lambda表达式和LINQ之类的列表解析功能 。因为都在.NET平台上,F#和C#可以互操作,互相调用,有些复杂场景用F#可以用更简易的方式实现。

    to be contiued!
下集:并发函数式编程技术



写给普通:

人一旦得到一样东西

就会忘记当初趴在橱窗看它的感觉