编程范式 | 青训营笔记

123 阅读6分钟

编程范式

       编程范式Programming paradigm是指计算机中编程的典范模式或方法。
       优点是:易于重构、调试、测试。
       常见的编程范式有:函数式编程、程序编程、面向对象编程、指令式编程等。

自顶向下

屏幕截图 2023-04-18 131847.png

结构化编程

屏幕截图 2023-04-18 131948.png

面向对象编程

       面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构。OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。OOP=对象+类+继承+多态+消息,其中核心概念是类和对象。

面向对象_封装

       封装:封装是指将一个计算机系统中的数据以及与这个数据相关的一切操作语言(即描述每一个对象的属性以及其行为的程序代码)组装到一起,一并封装在一个有机的实体中,把它们封装在一个“模块”中,也就是一个类中,为软件结构的相关部件所具有的模块性提供良好的基础。

面向对象_继承

       继承:类之间的关系,在这种关系中,一个类共享了一个或多个其他类定义的结构和行为。继承描述了类之间的“是一种”关系。子类可以对基类的行为进行扩展、覆盖、重定义。

面向对象_多态

       多态:不同的结构可以进行接口共享,进而达到函数复用

面向对象_依赖注入

       去除代码耦合

面向对象编程_五大原则

  • 单一职责原则SRP(Single Responsibility Principle)
  • 开放封闭原则OCP(Open-Close Principle)
  • 里氏替换原则LSP(the Liskov Substitution Principle LSP)
  • 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
  • 接口分离原则ISP(the Interface Segregation Principle ISP)

面向对象编程_设计缺陷

  1. 运行效率较低:

           类的大量加载会牺牲系统性能,降低运行速度。虽然CPU速度在提高,内存容量在增加,但这一问题仍会随着系统规模变大而逐渐显示出来,变得越发严重。

  2. 类库庞大:

           由于类库都过于庞大,程序员对它们的掌握需要一段时间,从普及、推广的角度来看,类库应在保证其功能完备的基础上进行相应的缩减。

  3. 类库可靠性:

           越庞大的系统必会存在我们无法预知的问题隐患,程序员无法完全保证类库中的每个类在各种环境中百分之百的正确,当使用的类发生了问题,就会影响后续工作,程序员也有可能推翻原来的全部工作。

函数式编程

       函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 
       和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。
       和过程化编程相比,函数式编程里函数的计算可随时调用。

函数式编程_Functor

       函数式编程是种编程方式可以当作容器的类型,类型支持对容器内元素进行操作
       常见的functor:Array(Iterable).map,Promise.then

函数式编程_Monad

       可以去除嵌套容器的容器类型
       常见的monad:Array.flatMap Promise.then

函数式编程_Applicative

       直接对两个容器进行操作

函数式编程_优点

  1. 代码简洁,开发快速:

           函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快

  2. 接近自然语言,易于理解:

           函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。

  3. 更方便的代码管理:

           越庞大的系统必会存在我们无法预知的问题隐患,程序员无法完全保证类库中的每个类在各种环境中百分之百的正确,当使用的类发生了问题,就会影响后续工作,程序员也有可能推翻原来的全部工作。

  4. 代码的热升级:

           函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。Erlang语言早就证明了这一点,它是瑞典爱立信公司为了管理电话系统而开发的,电话系统的升级当然是不能停机的。

  5. 易于"并发编程":

           数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。

响应式编程

函数式编程的自由度很高,可以写出很接近自然语言的代码。        简称RP(Reactive Programming)响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。

响应式编程_Observable

  • 观察者模式
  • 迭代器模式
  • Promise/EventTarget 超集*

响应式编程_操作符

屏幕截图 2023-04-18 125131.png

响应式编程_Monad

- 去除嵌套的Observable

屏幕截图 2023-04-18 125456.png

领域特定语言

什么是领域特定语言?

       领域特定语言(英语:domain-specific language、DSL)指的是专注于某个应用程序领域的计算机语言。又译作领域专用语言。不同于普通的跨领域通用计算机语言(GPL),领域特定语言只用在某些特定的领域。 比如用来显示网页的HTML,以及Emacs所使用的Emac LISP语言。

Parser_语法规则

       上下文无关语法规则

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

Parser_LL

       LL:从左到右检查,从左到右构建语法树
       select name from user

屏幕截图 2023-04-18 130923.png

Parser_LR

       LR:从左到右检查,从右到左构建语法树
       select name from user

屏幕截图 2023-04-18 131139.png

课程总结

屏幕截图 2023-04-18 131506.png