这是我参与「第五届青训营」伴学笔记创作活动的第 5 天
重点内容
- 过程抽象的编码原则
- 代码关注点及优化方法
详细介绍
编码原则
过程抽象
- 用于处理局部细节控制的一些方法
- 函数式编程思想的基础应用
举个例子:为了能够让“只执行一次”这个需求覆盖不同的事件处理,我们可以将这个需求剥离出来。这个过程我们称为过程抽象。
短期内控制只执行一次的方法
function once(fn) {
return function(...args) {
if (fn) {
const ret = fn.apply(this, args);
fn = null;
return ret;
}
}
}
传入参数fn一般为一个函数,再次进入时,fn = null导致不会执行
高阶函数HOF
- 函数作为参数
- 函数作为返回值
- 常用作函数装饰器
常用高阶函数
- once:短时间内忽略重复
- throttle:节流函数,一段时间内只执行一次
- debounce:防抖函数,用户操作停止后再触发
- consumer:异步转同步
- iterative:操作多个元素
纯函数
- 结果可预期
- 便于测试,用console.assert(),不需要特定的外部环境
- 改变状态的函数不是纯函数
- 高阶函数的输出是确定的,可以用不同的函数作为参数测试
编程范式
- 主要有命令式和声明式
- JS全部都支持
- 命令式:关注怎么做
- 声明式:关注做什么
- 声明式可以省下逻辑分支的代价
代码关注点
- 风格
- 效率
- 约定
- 设计
- 使用场景
代码质量优化之路
交通灯
需求
- 若干个交通灯
- 依次改变颜色
优化
-
简单粗暴:五个定时器
-
数据抽象
- 定义状态列表
- 递归调用切换函数
-
过程抽象
- 定义等待方法
- 定义轮换方法(参数是切换函数)
- 定义切换方法
- 轮换函数可以复用
-
异步+函数式
- 定义等待方法
- 定义切换方法
- 放进一个循环
判断整数是不是4的幂数
需求
- 如果是,返回
true - 如果不是,返回
false
优化
-
简单粗暴:直接去除
-
按位操作:最后两位是不是11
-
数学方法
- 大于等于1
- 利用
a & a-1可以使得二进制数中的1减少一个(可以用数学归纳法证明),判断整个数的二进制只有一个1(在最高位) - 二进制数偶数位不能有1
-
字符串:先二进制,转字符串,再用正则表达式
洗牌
需求
- 传入一个数组
- 将数组中的元素打乱
优化
-
错误写法
- 根据随机数,如果大于0.5就交换
- sort方法的特性使然
- 数值越小,越可能出现在前面
-
随机抽一张牌,放到最后,扫描整个数组
-
使用生成器:用
yield可以取出前几张
红包分配
需求
- 总金额已知
- 每人最少一分钱
优化
- 总金额已知
- 每人最少一分钱
个人总结
剩余的编码原则以及代码优化方法