编程范式 | 青训营笔记

118 阅读5分钟

这节课主要学习一下内容:

编程语言

编程范式

构建领域特定语言

一.编程语言

为什么需要编程语言:机器只是一个工具,通常需要程序员产生指令,输入指令控制机器和沟通,指令便称为编程语言。

image.png

C语言是中级语言,是过程式语言的代表,可对位,字节,地址直接操作,引入了只在的概念可以使效率更高。

C++是面向对象的代表,在C语言的基础上增加了对类的支持。(虚函数,继承,多态)

Lisp是与C语言平行出现的,适合与机器无关,它屏蔽了指针的操作,引入了闭包的概念

JavaScript:基于原型和头等函数的多范式语言,融合了过程式,面向对象,函数式,响应式,使用比较灵活,可以使用在网站开发、通过Node JS引入可以在服务器开发、可以使用V8引擎嵌入到游戏中作为控制脚本。

二.编程范式

image.png

命令式: 过程式:将过程进行分组(自顶向下,结构化编程【顺序,选择,循环结构】) 面向对象;根据操作和对应的状态进行分组(【封装,继承,多态,依赖注入】) 声明式: 函数式:通过一系列的函数来声明逻辑 响应式:通过区域流和应征函数函数来响应结果。

JS 中的面向过程:通过模块化编程导出变量以及函数

面向过程的缺点: 在结构化编程中函数和操作的数据之间没有清晰和直观的体现。随着程序规模的增大,程序变得很难理解。可读性不大。 程序不利于修改和扩充, 不利于代码重用,随着程序规模的增大,大量函数和变量之间关系错综复杂,想把某一段代码抽取出来非常困难。

封装:将客观的事务封装成具体的类,类可以把自己的数据和方法只让可信的类和对象进行操作,对于不可信的类进行隐藏。

继承:让某个类型的对象获得另一个类型的对象的属性和方法。它支持现有类的所有功能,并在不编写原有类的情况下将类进行扩充。

多态:类的相同方法在不同的情形下有不同的表现方式。即具有不同内部结构的对象可以共享相同的外部接口,这意味着虽然针对不同对象的具体操作不同,但可以通过一个公共的类他们这些操作可以通过相同的方式来调用。

依赖注入:在程序运行过程中,如果需要调用另一个对象使用时,无需在代码中创建被调用者,而是依赖于外部的注入,可以降低代码计算之间的耦合度。

五大原则:单一职责原则,开放封闭原则,里氏替换原则,依赖倒置原则,接口分离原则。

面向对象缺点:没有办法进行系功能的功能导入,并且数据的修改历史完全被隐藏了。

函数式编程:使用纯函数的组合来描述计算过程。尽量减少变化的部分,由此让代码逻辑变得更清晰。JS不是纯粹的函数体编程语言,但是通过工具库的帮助,可以用JS写出函数式代码。

柯里化函数:如果某些参数是固定的,那么为了避免每次都要传送,可以把通用的参数事先存到闭包中,下次调用时可以直接忽略之前的参数,直接传送新的参数即可。【利用闭包和高阶函数的特性】。

Functor容器类型的组合:Array(Iterable).map,Promise.then Applicative:直接对两个容器直接操作

响应式编程:是一种在异步和离散之间的一种特殊值的一种编程。包括数据流和操作符,也没有纯粹的响应式编程语言,要经过工具库的帮忙,[RxJS]

Observable:分为观察者模式(需要通过订阅来做出数据的改变)和迭代器模式(数据会持续不断的推送过来,而不是一次性的)。

操作符:数据从管道的一端流入,途径管道的各个阶段,当数据到达下游的时候,是被管道操作过的,有些可能已经被转换。【合并,过滤,转换,异常处理,多播】

image.png

image.png

三.领域特定语言:

【HTML,SQL】

语言运行:一个语言字符串首先要经过一个词法解析器处理,然后形成一系列短语,再进一步优化再次经过语法解析器,变成一个树状结构,然后进行遍历操作,并对树进行执行或转化成机器语言,从ES6->ES5.即编译过程【代码生成过程】。

语法规则: 推导式:表示非终结符到(非终结符或终结符)的关系。 终结符:构成句子的实际内容。可以简单理解为词法分析中的token。 非终结符:符号或变量的有限集合。它们表示在句子中不同类型的短语或子句。

在这节课中,主要学习了JS常用到的函数式编程和响应式编程,但是都没有使用纯粹的代码编写而是使用了工具库实现。还学习到了过程式编程和面向对象编程的优缺点。

image.png