编程范式|青训营笔记

56 阅读2分钟

个人总结

学了这节课感觉对一些程序设计有了新的理解,还有一些js函数的特性做了进一步的补充,不只是写写代码,其实也能发现自己思考的缺陷还有更熟悉一些系统化的规范,对以后面试也能吹一些东西出来,感觉还是非常有用的。

什么是编程范式

面向过程

  • 数据与算法关联弱
  • 不利于修改和扩充
  • 不利于代码重用

面向对象

特点

  • 封装(关联数据与算法)
  • 继承(无需重写的情况下进行功能扩充)
  • 多态(不同的结构可以进行接口共享,进而达到函数复用)
  • 依赖注入(去除代码耦合)

image.png

image.png

面向对象编程-五大原则

  • 单一职责原则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) // 取消订阅

操作符

image.png 响应式编程的 "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…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。