JS多范式语言,灵活度极高
需要根据不同场景在不同范式间自如切换
进一步需要创造领域特定语言抽象业务问题
Programming paradigm
前端框架,基础组件,文档技术等开发与架构
instructions
C:中级语言 过程式语言
- 可以对位,字节,地址直接操作
- 代码与数据分离
- 提倡结构化编程
- 功能齐全,数据类型和控制逻辑多样
- 可移植性强
C++:面向对象
- C with Classes
- 继承
- 权限控制
- 虚函数
- 多态
Lisp:函数式语言
- 与机器无关
- 列表:代码即数据
- 闭包
JS:基于原型和头等函数的多范式语言
- 过程式
- 面向对象
- 函数式
- 响应式
编程范式
程序语言特性:
- 是否允许副作用
- 操作的执行顺序
- 代码组织
- 状态管理
- 语法和词法
编程范式分为:
-
命令式
- 面向过程
- 面向对象
-
声明式
- 函数式
- 响应式
过程式编程
算法 + 数据结构 = 程序
函数 + 变量 = 程序
自顶向下
程序:
-
模块
-
变量
- 数据结构
-
函数
- 函数
- 语句
-
结构化编程:顺序、选择、循环、goto
而面向过程变量与函数关系错综复杂,乱七八糟:
- 数据与算法关联微弱
- 不利于修改与扩充
- 不利于代码复用
OOP
- 封装
关联数据与算法
- 继承
无需重写的情况下进行功能扩充(数据and算法
- 多态
不同结构可以接口共享,总而实现函数复用
- 依赖注入
去除代码耦合
声明依赖,声明实现,得到注入对象
Inversify.js | Nest.js
OOP五大原则SOLID
- Single Responsibility Principle 单一职责原则SRP
- Open-Close Principle 开放封闭原则OCP
- Liskov Substitution Principle 里式替换原则 LSP
- Dependency Inversion Principle 依赖倒置原则 DIP
- Interface Segregation Principle 接口分离原则 ISP
OOP语言的问题有很多:
面向对象编程是一个极其糟糕的主意,只有加利福尼亚才会产出这种东西
Edsger Dijkstra(图灵奖获得者)
面向对象设计是基于罗马数字进行计算
Rob Pike(Go语言之父)
“面向对象”这个词可以用来指很多东西。其中一半是显而易见的,而另一半是错误的
Paul Graham(美国互联网创业教父)
实现上的继承就跟过度使用goto语句一样,使程序拧巴和脆弱。结果就是,面向对象系统通常需要承受复杂性和难以复用的痛苦
John Ousterhout( Tcl语言之父)
有时,优雅的实现仅仅是一个函数。不是一个方法。不是一个类,不是一个框架。只是一个方法。
John Carmack(id Software的创始人)
面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个拿着香蕉的大猩猩,背后是整个丛林。
Joe Armstrong(Erlang语言发明人)
我一度曾经迷恋上了面向对象编程。现在我发现自己更倾向于认为面向对象是一个阴谋,企图毁掉我们的编程乐趣。
Eric Allman(sendmail作者)
FP 函数式编程
- 函数一等公民
- 纯函数/无副作用
- 高阶函数/闭包
ramdajs
- First Class Functions
聚合转发
-
No Side Effects
-
Lazy Evaluation
-
Statelessness
-
Immutable data
-
Pure Functions
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
Currying
闭包 参数重复
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术
Composition
associativity 结合性
map's composition law
Functor
可以当做容器的类型,类型支持对容器内的元素进行操作
常见的functor: Array(Iterable).map, Promise.then
Monad
可以去除嵌套容器的容器类型
常见的monad: Array.flatMap Promise.then
Applicative
直接对两个容器操作
- Identity
- Homomorphism
- Interchange
- Composition
响应式编程 FRP
异步/离散de函数式编程
-
数据流
-
操作符
- 过滤
- 合并
- 转化
- 高阶
RxJS
Observable
- 观察者模式
- 迭代器模式
- Promise/EventTarget 超集
操作符
RFP的compose:
- 合并
- 过滤
- 转化
- 异常处理
- 多播
DSL
Domain-specific language
应用于特定领域的语言
HTML,SQL
区别于General-purpose language如C、C++、JS...
lexer
Parser
LL:从左到右检查,从左到右构建语法树
LR:从左到右检查,从右到左构建语法树