FP-RP-FRP编程范式

数据和视图的分离->解耦(开放封闭原则)jq的数据与视图混在一块(意大利面条式代码),Vue的数据与视图分离 以数据驱动视图(只关心数据变化,DOM操作被封装)jq直接用js修改视图,Vue以数据驱动视图


数据不可变: 它要求你所有的数据都是不可变的,这意味着如果你想修改一个对象,那你应该创建一个新的对象用来修改,而不是修改已有的对象。 无状态: 主要是强调对于一个函数,不管你何时运行,它都应该像第一次运行一样,给定相同的输入,给出相同的输出,完全不依赖外部状态的变化。 为了实现这个目标,函数式编程提出函数应该具备的特性:没有副作用和纯函数。

在不纯的版本中,checkAge 的结果将取决于 minimum 这个可变变量的值。换句话说,它取决于系统状态(system state);,因为它引入了外部的环境,从而增加了认知负荷。但这种依赖状态是影响系统复杂度的罪魁祸首,输入值之外的因素能够左右 checkAge 的返回值,不仅让它变得不纯,而且导致每次我们思考整个软件的时候都痛苦不堪。 另一方面,使用纯函数的形式,函数就能做到自给自足。

保证函数没有副作用,一来能保证数据的不可变性,二来能避免很多因为共享状态带来的问题。当你一个人维护代码时候可能还不明显,但随着项目的迭代,项目参与人数增加,大家对同一变量的依赖和引用越来越多,这种问题会越来越严重。最终可能连维护者自己都不清楚变量到底是在哪里被改变而产生Bug。传递引用一时爽,代码重构火葬场

为什么这个单元函数很重要?还记得我们之前说过的,函数的返回值,有且只有一个嘛? 如果我们想顺利的组装流水线,那我就必须保证我每个加工站的输出刚好能流向下个工作站的输入。因此,在流水线上的加工站必须都是单元函数。

函数组合的好处显而易见,它让代码变得简单而富有可读性,同时通过不同的组合方式,我们可以轻易组合出其他常用函数,让我们的代码更具表现力

函数式编程很理想,但是我们还是要与外部数据进行交互,不然我们的代码就没有意义当一套复杂的数据响应被应用于一套复杂的应用中时,开发者往往在响应来响应去的连环嵌套响应中被搞昏头,因为数据的响应而牵一发动全身,导致整个响应很难控制,这是数据响应必须解决的问题。