# 术语
## 编程
```js
/*
个人理解:如果编程语言能够实现对应的feature,编程语言完全可以是承载函数式编程或面向对象编程
待详读文章:https://fsharpforfunandprofit.com/posts/thinking-functionally-intro/
https://www.yinwang.org/blog-cn/2013/03/31/purely-functional
https://www.yinwang.org/blog-cn/2015/04/03/paradigms
https://typelevel.org/cats-effect/
http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html
https://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html#functors
--------------------------------------------------------
资料来源:https://www.zhihu.com/question/28292740
It is important to understand that functional programming is not just a stylistic difference; it is a completely different way of thinking about programming, in the way that truly object-oriented programming (in Smalltalk say) is also a different way of thinking from a traditional imperative language such as C.
命令式编程(imperative program):比如C语言
函数式编程 是一种风格,也是一种不同角度的思考方式,与编程语言无关
面向对象编程 是一种风格,也是一种不同角度的思考方式,与编程语言无关
风格(范式、经验、思考方式)随便怎么说
--------------------------------------------------------
函数式编程理论基础是lambda演算式。无类型的lambda演算规则如下:
1、变量(variable)
2、函数(lambda-abstraction)
3、替代(beta-reduction)
需要容易的进行函数式编程,语言需要提供一下特性:
1、closure
2、高阶类型推断:函数可以作为参数,其类型可以非常复杂
3、tail-call:函数式风格没有赋值,也就没有for循环,要实现循环操作只能通过递归实现
命令式编程的理论模型-----图灵机的特点。一条写满数据的纸带,一条根据纸带内容运动的机器。
--------------------------------------------------------
资料来源2:https://coolshell.cn/articles/10822.html/comment-page-2#comments
--------------------------------------------------------
函数式编程的三大特性(基础???):
1、immutable data(不可变数据):默认变量是不可变的,利于并行
2、first class functions():函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数
3、递归(tail-call):递归代替for循环
函数式技术点:
1、map&reducer:代替for循环
2、pipeline:
3、recursing递归:
4、currying柯里化:
5、high order function高阶函数:这点和把函数当变量使用类似
函数式编程的优势:
1、parallelization并行:
2、lazy evaluation惰性求值:编译器支持
3、determinis确定性: 函数的确定性,纯
*/
```
## querystring:一般是指URL上的查询字符串
```js
/*
默认情况下,querystring是指URL上的查询字符串,即?key1=value1&key2=value2
GET方法请求没有请求体,传参方式就是querystring
在URLSchema方案中,为了schema的通用性,定义了安全字符集。为了通用性,URLSchema的所有字符必须符合安全字符集要求。故对不再安全字符集范围内的字符需要编码。
querystring是URLSchema的一部分,故需要进行编码,编码即urlencoded,和application/x-www-form-urlencoded对应
npm包对应有qs:npm install qs
*/
```
## CONTENT-TYPE: POST和PUT请求中,指定了发送给服务器的请求体中数据类型;响应中,指明了响应体中返回数据的类型,但浏览器可能会忽略该值,以实际内容为准
```js
/*
格式:Content-Type:type/subtype;parameter
媒体类型:type/subtype
type:数据或资源类型
subtype:数据或资源子类型
例如:text/html,application/json,application/x-wwww-form-urlencoded,image/jpeg
parameter:参数
常用的数据类型:
application/json:告诉服务端请求体是序列化的JSON字符串
application/x-www-form-urlencoded:表单的默认值,发送数据前要对key和val进行了URL编码(encodeURIComponent)
multipart/form-data:表单包含type=file的input元素时数据编码方式
text/plain:空格编码程+,但不对特殊字符编码
*/
```
# 基础设施
* API封装和APILoading
* polyfill
* ErrorPage
* URL查询参数获取
* Alert组件
* Modal组件
* Toast组件
* Mask组件
# vscode源码关键点
* `InstatiationService设计`
* `IPCProtocol设计`
* `ExtensionHost设计`
* `WorkbenchLayout设计`
* `VSCode打包机制`
* `Electron的API`
# vscode中的IPC通信模块设计:通信基础还是Electron的webContents.send、ipcMain.on和ipcRender.send、ipcRender.on
* `协议设计protocol`
* `通信信道channel`
* `连接connection`
* `服务端server`
* `客户端client`
```
```
# 面向对象方法:Booch、Coad(1989)、OMT(1991)、UML(1995),UML不仅统一了Booch方法、OMT方法、OOSE方法的表示方法,而且对其作了进一步的发展,最终统一为大众接受的标准建模语言
# OMT和UML,题外话,面向对象分析(OOA),面向对象设计(OOD),面向对象编程(OOP)90年代软件开发方法的主流
* OMT:是1991年由James Rumbaugh等5人提出的,是一种新兴的面向对象的开发方法。开发工作的基础`是对真实世界的建模`。围绕这些对象,使用分析模型进行独立语言的设计。
* OMT:对象模型(类图),是对客观世界实体模拟的对象及对象彼此之间的关系的映射,描述了系统的静态结构。通常用`类图`表示
* OMT:动态模型,规定对象模型中的对象的合法变化序列。通常用`状态图`表示
* OMT:功能模型,指明系统应该做什么。更直接地反映了用户对目标系统的需求。用`数据流图`表示
* OMT:功能模型指明应该做什么,动态模型明确了什么时候做,对象模型定义做事情的实体
## 设计模式:可复用面向对象软件的基础,则是使用了OMT表示方法
<table>
<tr>
<th>
技术
<th>
<th>
继承
</th>
<th>
相识(关联、集合)
</th>
<th>
聚集(组合)
</th>
<th>
依赖
</th>
<th>
创建
</th>
<th>
实现
</th>
</tr>
<tbody>
<tr>
<td>
OMT
</td>
<td />
<td>
表述相同
</td>
<td>
相识就是关联或者聚合,箭头
</td>
<td>
聚集就是组合,白色菱形
</td>
<td>
无聚合
</td>
<td>
无依赖
</td>
<td>
无创建,GOF自创
</td>
<td>
无实现
</td>
</tr>
<tr>
<td>
UML
</td>
<td />
<td>
表述相同
</td>
<td>