个人总结
学了这节课感觉对一些程序设计有了新的理解,还有一些js函数的特性做了进一步的补充,不只是写写代码,其实也能发现自己思考的缺陷还有更熟悉一些系统化的规范,对以后面试也能吹一些东西出来,感觉还是非常有用的。
什么是编程范式
面向过程
- 数据与算法关联弱
- 不利于修改和扩充
- 不利于代码重用
面向对象
特点
- 封装(关联数据与算法)
- 继承(无需重写的情况下进行功能扩充)
- 多态(不同的结构可以进行接口共享,进而达到函数复用)
- 依赖注入(去除代码耦合)
面向对象编程-五大原则
- 单一职责原则SRP(Single Responsibility Principle)
- 开放封闭原则OCP(Open-Close Principle)
- 里式替换原则LSP(the Liskov Substitution Principle LSP)
- 依赖倒置原则DlP(the Dependency Inversion Principle DIP
- 接口分离原则lSP(the Interface Segregation Principle ISP)
函数式编程
ramdajs
- 函数式“第一等公民”
- 纯函数 / 无副作用
- 高阶函数 / 闭包
First Class Function
javascript
复制代码
const BlogController = {
index(post) {
return Views.index(post)
},
show(post) {
return Views.show(post)
},
create(attrs) {
return Views.create(attrs)
},
update(post, attrs) {
return Views.update(post, attrs)
},
destroy(post) {
return Views.destroy(post)
},
}
const BlogController2 = {
index: Views.index,
show: Views.show,
create: Views.create,
update: Views.update,
destroy: Views.destroy,
}
Pure Function
可缓存 可移植 可测试 可推理 可并行
javascript
复制代码
const retiredAge = 60
function retirePersion(p) {
if (p.age > retiredAge) {
p.status = 'retired'
}
}
function retiredPersion(p) {
if (p.age > retiredAge) {
return { ...p, status: 'retired' }
}
return p
}
Composition
javascript
复制代码
const toUpperCases = str => str.toUpperCase()
const log = x => console.log
function alertUpperCases(str) {
log(toUpperCases(str))
}
const compose =
(...fns) =>
(...args) =>
fns.reduceRight((acc, fn) => [fn.call(null, ...acc)], args)[0]
const alertUpperCasefn = compose(log, toUpperCases)
monad Array.flatMap Promise.then
javascript
复制代码
;[1, 2].flatMap(() => [1, 2])
Promise.resolve(1).then(r => Promise.resolve(2 * r))
Maybe.prototype.flat = function (level = 1) {
if (this.$value?.constructor !== Maype) {
return new Maybe(this.$value)
}
return level ? this.$value.flat(level - 1) : this.$value
}
applicative
javascript
复制代码
class Maybe {
constructor(x) {
this.$value = x
}
map(fn) {
return this.$value == null ? this : new Maybe(fn(this.$value))
}
ap(other) {
return other.map(this.$value)
}
}
function add(a, b, c) {
return a + b + c
}
new Maybe(2).map(two => new Maybe(3).map(add(two))).flat()
new Maybe(add).ap(new Maybe(3)).ap(new Maybe(2))
响应式编程
异步/离散的函数式编程
- 数据流
- 操作符(过滤 合并 转化 高阶)
observable
- 观察者模式
- 迭代器模式
- Promise / EventTarget
javascript
复制代码
const { fromEvent } = rejs
const clicks = fromEvent(document, 'click') // obserbvable
const sub = clicks.subscribe(e => console.log(e)) // 订阅数据
setTimeout(() => sub.unsubscribe(), 5000) // 取消订阅
操作符
响应式编程的 "compose" 合并 过滤 转化 异常处理 多播
javascript
复制代码
const { fromEvent, map } = rxjs
const click = fromEvent(document, 'click')
const positions = clicks.pipe(
map(ev => ev.clientX),
map(clientX => ++clientX)
)
positions.subscribe(x => console.log(x))
const events = [{clientX : 1}, {clientX : 2}]
compose(
map(clientX =>++clientX),
map(ev => ev.clientX;
)(event)
Monad
去除嵌套的observable
javascript
复制代码
const {fromEvent , flatMap, fetch} = rxjs;
const clicks = fromEvent(document, "click");
const users = clicks.pipe(
flatMap(e => fetch.fromFetch(
)
)
javascript
复制代码
const rejs = require('rxjs')
const { fromEvent, flatMap, fetch } = rejs
const clicks = fromEvent(document, 'click')
const users = clicks.pipe(
flatMap(e => fetch.fromFetch('https://jsonplaceholder.typicode.com/users/1')),
flatMap(response => console.log(response.json()))
)
users.subscribe(data => console.log(data))
作者:oddpro
链接:juejin.cn/post/722996…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。