编程范式|青训营笔记

94 阅读4分钟

编程范式

课程背景

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