本系列学习在.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!
下集:并发函数式编程技术

写给普通:

人一旦得到一样东西
就会忘记当初趴在橱窗看它的感觉

.NET并发编程-函数式编程的更多相关文章

  1. javascript 函数式编程

    编程范式 编程范式是一个由思考问题以及实现问题愿景的工具组成的框架.很多现代语言都是聚范式(或者说多重范式): 他们支持很多不同的编程范式,比如面向对象,元程序设计,泛函,面向过程,等等. 函数式编程 ...

  2. 【大前端攻城狮之路】JavaScript函数式编程

    转眼之间已入五月,自己毕业也马上有三年了.大学计算机系的同学大多都在北京混迹,大家为了升职加薪,娶媳妇买房,熬夜加班跟上线,出差pk脑残客户.同学聚会时有不少兄弟已经体重飙升,开始关注13号地铁线上铺 ...

  3. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

      本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...

  4. Java函数式编程和lambda表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  5. swift之函数式编程

    函数式编程初探 最近初学swift,和OC比,发现语言更现代,也有了更多的特性.如何写好swift代码,也许,熟练使用新特性写出更优秀的代码,就是答案.今天先从大的方向谈谈swift中的编程范式-函数 ...

  6. 关于函数式编程(Functional Programming)

    初学函数式编程,相信很多程序员兄弟们对于这个名字熟悉又陌生.函数,对于程序员来说并不陌生,编程对于程序员来说也并不陌生,但是函数式编程语言(Functional Programming languag ...

  7. Scala函数与函数式编程

    函数是scala的重要组成部分, 本文将探讨scala中函数的应用. scala作为支持函数式编程的语言, scala可以将函数作为对象即所谓"函数是一等公民". 函数定义 sca ...

  8. 函数式编程(Function Program Language)

    WHAT: 简单说,"函数式编程"是一种"编程范式",也就是如何编写程序的方法论. 它属于"结构化编程"的一种,主要思想是把运算过程尽量写成 ...

  9. Python学习(26):Python函数式编程

    转自  http://www.cnblogs.com/BeginMan/p/3509985.html 前言 <core python programming 2>说: Python不大可能 ...

随机推荐

  1. 80%的学校还在给新生上C语言,它们OUT了吗?

    大家好,最近有小伙伴在后台问我,大一新生学校在教C语言,是不是已经过时了?第一门语言应该学什么比较好?大学期间什么课程对于毕业之后的从业帮助比较大呢? 今天这篇文章就和大家简单聊聊这个问题. 关于我 ...

  2. JVM参数调优总结

    一.前言 要想成为一名高级Java开发具备JVM调优的能力必不可少,能够根据项目实际情况进行JVM调优的前提是理解JVM原理和常用JVM参数的含义及作用,虽然<深入理解Java虚拟机>这本 ...

  3. reactor模式:单线程的reactor模式

    reactor模式称之为响应器模式,常用于nio的网络通信框架,其服务架构图如下 不同于传统IO的串行调度方式,NIO把整个服务请求分为五个阶段 read:接收到请求,读取数据 decode:解码数据 ...

  4. Liunx运维(八)-LIunx磁盘与文件系统管理命令

    文档目录: 一.fdisk:磁盘分区工具 二.partprobe:更新内核的硬盘分区表信息 三.tune2fs:调整ext2/ext3/ext4文件系统参数 四.parted:磁盘分区工具 五.mkf ...

  5. llinux文件相关指令

    一---导读 首先我们来看这样一个小案例,假设张三要出差,按照 这样的路线进行 北京->上海,之后回到北京.再按照北京->天津->石家庄这样的路线进行出差(北京是根据地).假设现在张 ...

  6. 九个最容易出错的 Hive sql 详解及使用注意事项

    阅读本文小建议:本文适合细嚼慢咽,不要一目十行,不然会错过很多有价值的细节. 文章首发于公众号:五分钟学大数据 前言 在进行数仓搭建和数据分析时最常用的就是 sql,其语法简洁明了,易于理解,目前大数 ...

  7. 【Java基础】网络编程

    网络编程 网络编程概述 网络编程的目的:直接或简洁地通过网络协议与其他计算机实现数据交换,进行通讯. 网络编程的两个主要问题: 如果准确地定位网络上一台或多台主机,并定位主机上的特定应用: 找到主机后 ...

  8. docker迁入迁出mysql

    docker迁出mysql数据库 测试环境: docker服务器 mysql服务器 IP 192.168.163.19 192.168.163.16 操作系统 CentOS7.8 CentOS7.8 ...

  9. python作业完成简单的文件操作

    题目 请创建以学号命名的目录,在该目录中创建名称为file1.txt的文件,并将自己的个人信息(序号.姓名以及班级)等写入该文件:然后并读取文件中的内容到屏幕上:接着重新命名该文件为file2.txt ...

  10. 数学建模学习笔记 | matlab基本命令及用法

    前言 数学建模对matlab水平的要求 了解matlab的基本用法,如常用命令.脚本结构.矩阵的基本操作.绘图等: 熟悉matlab的程序结构,能创建和引用函数: 熟悉常见模型的求解算法和套路: 自主 ...