跟我学代码架构设计模式之--初识函数式编程

一直一来,总把面向对象编程思想奉为圣经,直到今天在网上接触了函数式编程思想,乍看烧脑,格格不入的感觉,后经大脑高负荷运转了大半天来思考,终于有些头绪:函数式编程是和传统面向对象编程是解决问题的两种不同计算思路,用函数式编程思想对并发和分布式计算应该会很有用武之地。下面说一说我对函数式编程思想的初步理解。

先从传统面向对象思想说起:

面向对象思想解决问题的思路很直观,其实就是传统C语言中提出的"程序=数据结构+算法"的思想。

按面向对象思想分析并解决问题的时候,首先要抽出对象应该有哪些数据,然后围绕这些数据应该有哪些操作方法。这些操作方法都会以对象的数据为中心做计算,相当于对象的数据是这些方法的状态或者说资源,这些方法执行的结果和对象当前的数据状态有关系,同样这些方法执行完可能也会修改对象的数据,即:

1 方法的执行结果会受当前状态的影响 !

2 方法的执行完毕后可能会改变当前状态 !

3 由于1和2的影响,导致多次执行方法的结果可能会不相同,即:非幂等特性!

有状态的函数会有什么弊端呢?根据我的认知,有状态的函数在多线程并发访问的时候为了解决同步问题必须要在关键代码处加锁处理,加锁就意味着线程执行会有阻塞或等待等性能损失!

当然了,在面向对象编程里我们也可以避免同步问题,即:每线程一状态的思想,或者说状态在线程级别进行隔离,比如java的ThreadLocal来解决同步问题。其实这种思想就和函数式编程思想异曲同工了:线程执行开始状态数据建立,线程执行完毕状态数据销毁,线程间的计算结果互不影响,这样就避免了多线程同步访问共享数据时的加锁或等待!本质上来说,虽然是面向对象思想设计的类,但是通过ThreadLocal在一个比较大的粒度上(相比于单个函数粒度的无状态,实际上是多个函数作为整体对线程体现为无状态)实现了无状态,所以才带来了较高的并发,但是缺点是每线程一份数据,运行过程中增加了内存资源的消耗!(典型的拿空间换时间的设计哲学)

函数式编程理念讲解:

函数式编程强调以函数为最小的单位,在函数设计的时候就是无状态的,即多个函数不会关联和共享外部状态:

1 函数执行不允许关联外部状态数据

2 函数输出不会修改外部状态

3 函数多次执行的结果都是一样的,即:幂等性!

(这里我想说一句,其实和上面提到的JAVA的ThradLocal是一样的,只不过是在函数粒度上对调用者表现为无状态而已,难道函数栈不算状态吗?相比于更低级别的CPU指令,函数栈也算状态!函数执行的时候分配栈帧,函数执行完毕后栈释放,对外部调用者表现为无状态!)

函数级别的无状态有什么好处呢?如何用函数式编程的思想来解决问题呢?

由于函数式编程把所有的函数都设计成无状态的,那么在解决某一计算问题的时候,我们的设计思路就变为:

1 以计算为中心,把要解决的问题计算算法拆分成多条无状态函数流,或者说无状态函数管道,函数流中的每个函数都负责一种比较单一的计算功能,多个函数组成的函数管道来负责完成比较大的计算功能。由于每个函数都是无状态的,那么函数流也是无状态的,或者说幂等的。函数流接收输入参数作为数据,数据在函数流中流动,最终作为函数流的结果输出给调用方。

2 设计一个门面无状态函数作为控制器,门面函数负责把计算问题拆分,把计算任务分给一个或多个函数流,把数据作为参数调用函数流,接收所有数据流的返回结果并组装,最终完成计算问题。

3 函数流许多玩法:函数流中的一个子函数本身又可以是一个控制器函数,控制器函数又可以分出子函数流(递归!)此外函数的实现又可以是多线程执行子函数流,各种组合方式灵活运用,最终能高效的解决一个复杂问题。

通过上面的分析我们可以发现,无状态函数在多线程并发下是完全没有同步问题的~我们完全可以把复杂的问题拆分并分给多个计算线程来执行函数流!

当然了,由于无状态函数没有状态,在给函数流传参数的时候可能会有内存空间浪费(还是拿空间换时间)

JAVA8带来的函数式编程分析:

JAVA是面向对象的语言,如何才能实现函数式呢?我的分析是有两种:

1 用静态函数

2 用匿名内部类

如果用第一种,由于静态函数必须是属于某个类的,在java语法层面上很难实现Lambda表达式的语法糖,所以java采用了匿名内部类的形式实现函数式。

java要求采用匿名内部类必须实现接口,所以我们用java写函数实际上就是要定义一个接口,接口里面只定义一个公开函数作为函数的签名,然后在语法层面上用Lambda表达式来让编译器给我们生成匿名内部类和对应的对象(由于无状态,对象实际上充当了函数指针的作用)。

在函数间互相传递的时候,把接口类型的引用作为函数指针来传递函数给其他函数!

发布了63 篇原创文章 · 获赞 25 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/w1857518575/article/details/85339229