逻辑抽象基础
-
抽象各种逻辑的基础是什么?用什么概念来做抽象
- 什么是functor?
A Functor is a type that implements
map
and obeys some lawsfunctor 是实现了 map 函数并遵守一些特定规则的容器类型。
- 可以自定义怎么样的functor来抽象各种逻辑
[代码元素]
代码内容是处理数据(deal with data). 处理数据会存在下面这些内容:
-
behaviour 动作/行为抽象一般叫做设计模式. 工程模式, 发布订阅模式, 中间件等等设计模式.
- control flow 流程抽象. 语言普遍携带简洁易用的流程控制(条件/Loop/顺序).
- Algebraic Datatypes 代数类型系统
- fantasy-land
- 如何处理if/else条件?(Either)
- 1.Either容器更趋近于猫论;
- 2.Either容器是有两条执行路线的;
- 如何进行空值检测(Maybe)
- 1.空值检测与条件判定是有区别的,空值判定把值进行包裹,其中的值与undefined/null这样的空值进行比较;
- 2.空值检测包裹对象,实际执行路线只有一条;
- Algebraic Datatypes 代数类型系统
- error handling 错误处理.
- 错误处理怎么抽象?
- asynchronous actions 异步行为. 这也是流程控制问题.
- 如何处理异步任务, 抽象异步流程?
- promise/async
- rxjs
- 如何处理异步任务, 抽象异步流程?
- state 状态抽象.
- 如何维护状态的不可变
- immutable 提供了核心为immutable特性的状态维护库,并上数据操作的系列辅助函数.
- 如何维护状态的不可变
- effects 作用.
- 如何处理副作用.
abstractions 抽象以上元素.
第一个问题是流程抽象,第一个明显的流程是loop或者叫迭代,用的是Iterable,典型类型有Array等。而错误处理用到Either,处理effects用的IO,异步任务用到的Task(Promise).
第二个问题是形式主义,链式调用(面条代码),回调调用(回调地狱),pointfree style.
lodash/fp、ramda辅助函数.
主要解决形式主义、风格的问题
[代码表达]
-
代码首要解决的问题就是复杂度的问题. 超过10万行前端代码怎么去管理,固定复杂度的需求怎么用最少代码行数实践清楚.
-
代码表达话语应该表达清楚, 明白.
-
人多的时候为快速解决问题,就充满了抄模块;copy-paste
-
你写的代码能让人得到什么,能让自己得到什么. 没有相关的用法说明, 代码基本就是废. 用法说明的维度是怎样? [<- Typescript类型+注释]
- 写代码的目的
- 解决问题, 前提, 问题是什么?
- 正确执行
- 可阅读(大部分人写代码都不是给人来阅读的、乱七八糟)
- 写代码极为重要的一点即是结构化
- 怎么去优化一大长段500行往上, 1000行往上, 2000行往上不停叠加的逻辑业务代码.
- 怎么去在模块化的基础上结构化一个2千行左右的小型业务. 5千行时如何处理? 5万行时如何处理? 50万级别呢?
主要策略包括需要拆分, 需要归纳, 需要转化
-
模块化/分包
-
拆分模式(设计模式中的各种)
-
分层设计
[代码限制]
-
有的同学,模块化对它来说就只起一个分割作用域的作用,直接把代码放在一个文件中也毫无违和感,几千行代码就揉杂在一个小单元内,完全无法理解,拆分,解耦. 因此才需要整体上的限制. –> 如何[哪些方式]拆分解构/解耦一堆逻辑/一段程序/系列连续指令/单个函数?
-
限制工具. 静态类型推断工具Typescript, 静态分析检查工具eslint/tslint.
-
锻炼一些可以侦测出来的限制,进行 –练习–
如下是eslint的一些限制示例:
// 强制限定一个函数不得超过120行,12号字体一屏幕高度大概在40行左右,限制3屏幕以内
'max-statements': ['error', 120, { "ignoreTopLevelFunctions": true }],
// 嵌套深度不能超过5层
'max-depth': ['error', 5],
// 回调函数最多3层
'max-nested-callbacks': ["error", 3],
// 函数参数个数限制在5个以内
'max-params': ['error', 5],
// 设置一个圈复杂度阈值20来控制代码的复杂度
'complexity': ["error", 20]