编程范式
一. 编程范式
为什么要学编程范式?
耗子说:绝大多数程序复杂混乱的根本原因就是业务逻辑与控制逻辑纠缠不清。如果你看过那些混乱不堪的代码,会发现其中最大的问题就是把 Logic 和 Control 纠缠在一起了,导致代码很混乱,难以维护,Bug 很多。如果你再仔细结合各式各样的编程范式来思考,会发现所有的语言或编程范式都在解决下面这 3 个事:
-
Control 是可以标准化的。比如:遍历数据、查找数据、多线程、并发、异步等,都是可以标准化的。
-
因为 Control 需要处理数据,所以标准化 Control,需要标准化 Data Structure,我们可以通过泛型编程来解决这个事。
-
而 Control 还要处理用户的业务逻辑,即 Logic。所以,我们可以通过标准化接口 / 协议来实现,我们的 Control 模式可以适配于任何的 Logic。
上述 3 点,就是编程范式的本质:有效地分离 Logic、Control 和 Data 是写出好程序的关键所在!
编程范式,是程序语言的“设计本质”,也是“编程方法论”。学习这些范式,可以让你了解诸多不同类型的编程语言各自要解决什么问题,此外,还可以帮助你从编程的表面直接看到本质,这对于指导我们提高编程技能,写出更优秀的代码,极具现实意义 。
1. 结构化编程
2.OOO编程
控制反转就是:从“受制于人”到“授制于人”。
面向对象的编程有三大特性:封装、继承和多态
3.函数式编程
函数式编程的理念
把函数当成变量来用,关注描述问题而不是怎么实现,这样可以让代码更易读。
因为函数返回里面的这个函数,所以函数关注的是表达式,关注的是描述这个问题,而不是怎么实现这个事情。
函数式编程的技术
first class function(头等函数) :这个技术可以让你的函数就像变量一样来使用。也就是说,你的函数可以像变量一样被创建、修改,并当成变量一样传递、返回,或是在函数中嵌套函数。
tail recursion optimization(尾递归优化) : 我们知道递归的害处,那就是如果递归很深的话,stack 受不了,并会导致性能大幅度下降。因此,我们使用尾递归优化技术——每次递归时都会重用 stack,这样能够提升性能。当然,这需要语言或编译器的支持。Python 就不支持。
map & reduce :这个技术不用多说了,函数式编程最常见的技术就是对一个集合做 Map 和 Reduce 操作。这比起过程式的语言来说,在代码上要更容易阅读。(传统过程式的语言需要使用 for/while 循环,然后在各种变量中把数据倒过来倒过去的)这个很像 C++ STL 中 foreach、find_if、count_if 等函数的玩法。
pipeline(管道):这个技术的意思是,将函数实例成一个一个的 action,然后将一组 action 放到一个数组或是列表中,再把数据传给这个 action list,数据就像一个 pipeline 一样顺序地被各个函数所操作,最终得到我们想要的结果。
recursing(递归) :递归最大的好处就简化代码,它可以把一个复杂的问题用很简单的代码描述出来。注意:递归的精髓是描述问题,而这正是函数式编程的精髓。
currying(柯里化) :将一个函数的多个参数分解成多个函数, 然后将函数多层封装起来,每层函数都返回一个函数去接收下一个参数,这可以简化函数的多个参数。在 C++ 中,这很像 STL 中的 bind1st 或是 bind2nd。
higher order function(高阶函数):所谓高阶函数就是函数当参数,把传入的函数做一个封装,然后返回这个封装函数。现象上就是函数传进传出,就像面向对象对象满天飞一样。这个技术用来做 Decorator 很不错。