编程范式
分为结构性编程,面向对象编程,函数式编程
- 结构性编程:面向具体的实际过程,典型的比如c,面向过程。
好处:在以前人们是用汇编写代码,但是效率太低,而且跳转语句goto会影响人们对问题的拆分,一行代码中各种goto语句没有结构,熟悉代码也要很长时间。因此出现了ifelse,选择语句控制语句,这些语句很好的支持了功能分解,更有结构层次感相比于之前的 goto更好理解
- 面向对象编程:面向 多种 实例 互相 交互调用,典型的比如java面向对象
- 函数式编程:面向赋值语句,赋值的计算不变性,典型的比如lisp
函数式编程
这个是最难理解的一种编程范式,结构性最简单ifelse小学生都可以理解,对象型稍微难一些设计软件需要按照面向对象的三个特性进行设计,不再是随意摆放的构造快,需要将基本快按照 现实世界的 业务模型 进行重组,
函数式编程是最难理解的一个范式,按照函数功能模型进行拆解不变的功能模型,在设计时需要将业务中变和不变的部分识别出来,将不变的部分抽象为函数的接受者receiver,根据变的部分进行组合传参来完成复杂的函数功能。使用者根据提供方提供出来的函数模型根据自己的需要传入自己的函数构造快,从而组合出一个新的完成函数功能的构造快。
- 好处是函数数量大大减少:对于面向对象来说这种功能只能根据功能的不同定义一个新的函数导致函数过多;因此函数式编程也可以在面向对象里面基于对函数的封装来表现。封装函数不变的逻辑,将变动的函数逻辑变为由使用者提供,大大降低了函数的数量
- 对于完成计算功能的代码 其可读性和表现力大大增强:由于函数构造快变成了组合的方式,因此对于使用者而言提供方可以提供出各种完成功能的方法调用链。提供出来的方法就是描述在做什么,见名知意。面向对象是针对某个实体调用某个功能行为,其表现的是程序的协作关系;而函数式编程是函数功能构造快的组合,对于功能的完成函数式的表现力更加好。可以抽象出一种 描述做什么的接口后,表达力增强的同时,底层的实现可以不断优化。
- 更加稳定:不变性因此无需关心并发问题,无副作用无状态保证了多次调用的结果是相同的
函数式编程为什么受到人们的追捧:
- 要求极高,对程序员是一种极大的智力挑战:对函数构造快的分离和组合,这对于程序员“分离关注点”的能力要求极高,面向对象如果不分离也可以工作甚至面向对象写出面向过程的代码,但是函数式编程是绝对不会的,因为如果没有很好的分离关注点,那么该函数的复用能力是很弱甚至无法复用的,这就逼迫着程序员必须要分离,且劝退不认真思考的程序员,做到了筛选。
- 对智力的考验也就意味着完成后有很大的愉悦感:确实如此,设计出一个完美优秀的系统是每个程序员的美好向往,面向对象的约束力不够强会懈怠,但是函数式不会。如果你懈怠了没有用心去分离那么设计出来的函数就是垃圾,自己都觉得很难用强迫自己重新思考
面向对象和函数式编程的结合
面对对象组合的是类和数据,而函数式编程组合的是函数功能。
在设计时可以用面向对象的方式对系统进行搭建,在设计其中函数接口的时候用函数式编程实现。分离变和不变通用的处理逻辑。
- 拆解功能 :函数式编程的核心思维:把功能看成组合的方式进行构建,函数功能不过就是一些基础功能的组合,核心思想:设计可组合的函数接口,对功能进行抽象。
- 列表转换思维:函数式编程里面的重要思维,讲很多操作分解成若干转换的组合(也就是 将面向对象里面的函数调用链的表达方式转换为 函数式编程里面对函数结果转换操作的调用方式)比如一个列表里面取出年龄大于5,将成绩×2之后的新列表。用面向对象表现力很糟糕,但是用函数式编程是把 进行的每个功能操作都抽象为一个接口对函数结果进行转换
面向对象是对领域模型抽象。
推荐书籍:函数式编程思维
函数式编程的两个特点是组合和不变
组合在于表达力和函数的功能得到了大大增强,那么不变性提高了程序的什么呢?
在程序中变量是不稳定的,由于不稳定那么程序的执行顺序和多线程环境下就会出现很多问题(比如a在调用过程中b插了一手 改变了程序中的全局变量导致a的输出发生了变化;多线程环境下要保证缓存同步可见性等问题会导致执行效率下降和出现大量的解决非需求的代码)。
不变性分为 值的不变和纯函数两种。
值不变是指 变量在初始化之后不会发生改变,纯函数是指函数无副作用不会修改程序的全局变量改变程序的状态 对程序造成影响。
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!