编程范式
课程背景
1.前端的主要编程语言javascipt
2.java作为一种融合了多种编程范式的语言,灵活性很高
3.前端开发人员需要根据场景不同在不同编程范式间切换
4.进一步需要创造领域特定语言抽象业务问题
课程收益
1.不同范式起源和使用场景
2.java在不同范式特别是函数式的使用
3.掌握创建领域特定语言的相关工具和模式
02 编程语言
机器语言:8085指令格式 操作码和操作数
汇编语言:使用字母代替数字
高级语言:编辑器:高级语言转化成汇编语言再到机器语言
C语言:中级语言 过程式语言代表
代码与数据分离,除必要信息其他独立
可对位、字节、地址直接操作(指针)
功能齐全:数据类型和控制逻辑多样化
可移植能力强
C++语言:加了类的知识 虚函数的继承概念 多态概念
Lisp:函数式语言代表
与机器无关 列表:代码即数据
Java:基于原型和头等函数的多范式语言 brendan eich 最常用的语言
开发 引擎嵌入
过程式 面向对象 函数式 响应式
03 编程范式
什么是编程范式?
程序语言特性:是否允许副作用 操作的执行顺序 代码组织 状态管理 语法和词法
编程范式:命令式(面向对象 面向过程)和声明式(函数式函数声明逻辑 响应式)
自顶向下 结构化模式
自顶向下
程序-模块-变量(数据结构)-函数-函数与语句
结构化编程
顺序结构 选择结构 循环结构 (成立不成立)
JS中面向过程
面向过程缺点:数据与算法关联弱 不利于修改和扩充 不利于代码重用
(于是产生了面向对象式)
面向对象编程:封装 继承 多态 依赖注入
管理数据与算法 封装-分类-只对可信任操作-不可信任则隐藏
无需重写的情况下进行功能扩充:继承
不同的结构可以进行接口共享,进而达到函数复用:多态
去除代码耦合:依赖注入 控制反转,由外来环境控制
声明依赖-得到类-改变声明实现-得到注入对象
面向对象编程 五大原则
单一职责原则
开放封闭原则
里氏替换原则
依赖倒置原则
接口分离原则
面向对象编程的缺点:只需要一个类的一部分 没办法功能导入 数据修改历史被隐藏
(于是有函数式编程)
函数式编程:用函数组合来描述问题
函数是第一等公民 纯函数(无副作用) 闭包
函数式编程:
优势:不依赖于外部环境 不应该有副作用
可缓存 可移植 可测试 可推理 可并行
currying克里化
参数重复-之前参数闭包
函数组合:
手动组合(灵活性差)
动态运行时进行动态组合、
Functor(容器)
常见functor容器类型: array mao romise.then
元素池-特殊处理-放弃容器
容器嵌套容器 monad除去去除嵌套容器(套娃)
常见monad:arrary faltmap promise.then
applicative直接对两个容器直接操作
响应式编程
在异步和离散情况下的函数式编程
数据流 操作服
需要工具帮忙:过滤 合并 转化 高阶
boservable观察者模式 迭代器模式
操作符compose
去除嵌套的observable
编程范式
过程式 :自顶向下 结构化编程 问题
面向对象 :封装 继承 多态 原则 问题
函数式编程 :一等函数 纯函数 curry/compose/functor/monard/applicative
响应式编程:observable 操作符 monard
04 领域特定语言
Doman specific language DSL:HTML
词法解析器-短语-语法解析器-树状结构-便利分析-(便利过程中)转换成机器语言或者更低语言(代码生成)
Lexer 词法解析器:token
切分描述
切分后进行语法分析
上下文无关语法原则
具体分析方法:LL从左到右检查,从左到右构建语法树
Select name from user
LR:从左到右检查,从右到左构建语法树
Select name from user
LLK>LR1>LL1
Tools
语法规则
Exp::=exp’+’exp
Vistor
速归访问-终结符
领域特定语言:创造DSL lexer parser tools vistor