编程范式
都依凡
撰写于 2023年 04月 23 日

1. 编程语言的分类

电脑是无法识别编程语言的,我们编写的代码会通过编译器编译成机器语言,然后由电脑执行

编程语言分为:

  1. 机器语言
第一代计算机(1940年代末至1950年代初)这种语言是二进制的,以 0和 1组成,这种的语言编写非常难以阅读
  1. 汇编语言
汇编语言是一种更高级别的机器语言,使用助记符来代替二进制代码,使程序员能够更容易地编写和阅读代码
  1. 中级语言
中级语言中,面向过程的代表语言是C语言,他的出现时间比较早,他是一个面向过程的语言,中级语言是介于机器语言和高级语言之间的一种语言。它通常是一种可移植的高级语言,但在执行时被转换成机器语言
  1. 高级语言
高级语言中有很多,如,面向对象的有C++、Java,函数式编程的代表如:lisp、多范式代表:JavaScript,高级语言是一种人类易于理解和使用的计算机语言。它使用自然语言的形式来描述问题,而不是使用机器语言或汇编语言。高级语言通常具有较高的可读性和可维护性,使程序员能够更容易地编写和修改代码

2. 编程范式

1. 编程语言的特性

  1. 是否允许副作用
  2. 操作的执行顺序
  3. 代码组织
  4. 状态管理
  5. 语法和词法

70

2. 编程范式之命令式

命令式又包括面向过程和面向对象

  1. 面向过程
面向过程编程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。比如C语言就是面向过程的编程语言
  1. 面向过程有什么缺点?
  • 数据与算法关联弱
  • 不利于修改和扩容,代码耦合性高
  • 不利于代码的重复用,扩展性差
  1. 面向对象
面向对象编程是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。比如Java语言就是面向对象的编程语言
  1. 面向对象的特点
  • 封装
封装是指将数据和方法封装在一个对象当中,通过访问权限来保护对象和数据,防止外部直接修改对象当中的数据,封装的目的是隐藏对象中的实现细节,增加了数据的安全性和可靠性,同时提高了维护性和可扩展性
  • 继承
继承像是子承父业,比如子类继承父类,那么子类也拥有了父类的一些特征
  • 多态
多态是一个对象在同一接口的情况下的不同表现

3. 编程范式之声明式

声明式又包括函数式和响应式

  1. 函数式
只关注做什么而不是怎么做,但函数式编程不仅仅局限于声明式编程,函数的值取决于函数的参数的值,不依赖于其他状态,比如abs(x)函数计算x的绝对值,只要x不变,无论何时调用、调用次数,最终的值都是一样

函数式编程的特点:

  1. 函数是第一等公民
  2. 函数是纯函数
  1. 函数是第一等公民
指函数跟其它的数据类型一样处于平等地位,可以赋值给其他变量,可以作为参数传入另一个函数,也可以作为别的函数的返回值
  1. 函数是纯函数
指相同的输入总会得到相同的输出,并且不会产生副作用的函数,纯函数有两个特点:相同的输入必有相同的输出,不会产生副作用(指的是函数内部不会修改全局变量的值,或者外部变量的值,不会对外部有影响)
  1. 响应式
响应式编程是使用异步数据流进行编程,比如触发点击事件,然后给与响应

4. 面向对象编程的五大原则

  1. 单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
  1. 开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
  1. 里式替换原则LSP(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
  1. 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能 造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。
  1. 接口分离原则ISP(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

5. 耦合

简单地说,软件工程中对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。

有软硬件之间的耦合,还有软件各模块之间的耦合。
耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。

耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:

  • 内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
  • 公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
  • 外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
  • 控制耦合 。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。
  • 标记耦合 。若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。
  • 数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。
  • 非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。

编程范式

1. 编程语言的分类

电脑是无法识别编程语言的,我们编写的代码会通过编译器编译成机器语言,然后由电脑执行

编程语言分为:

  1. 机器语言
第一代计算机(1940年代末至1950年代初)这种语言是二进制的,以 0和 1组成,这种的语言编写非常难以阅读
  1. 汇编语言
汇编语言是一种更高级别的机器语言,使用助记符来代替二进制代码,使程序员能够更容易地编写和阅读代码
  1. 中级语言
中级语言中,面向过程的代表语言是C语言,他的出现时间比较早,他是一个面向过程的语言,中级语言是介于机器语言和高级语言之间的一种语言。它通常是一种可移植的高级语言,但在执行时被转换成机器语言
  1. 高级语言
高级语言中有很多,如,面向对象的有C++、Java,函数式编程的代表如:lisp、多范式代表:JavaScript,高级语言是一种人类易于理解和使用的计算机语言。它使用自然语言的形式来描述问题,而不是使用机器语言或汇编语言。高级语言通常具有较高的可读性和可维护性,使程序员能够更容易地编写和修改代码

2. 编程范式

1. 编程语言的特性

  1. 是否允许副作用
  2. 操作的执行顺序
  3. 代码组织
  4. 状态管理
  5. 语法和词法

70

2. 编程范式之命令式

命令式又包括面向过程和面向对象

  1. 面向过程
面向过程编程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。比如C语言就是面向过程的编程语言
  1. 面向过程有什么缺点?
  • 数据与算法关联弱
  • 不利于修改和扩容,代码耦合性高
  • 不利于代码的重复用,扩展性差
  1. 面向对象
面向对象编程是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。比如Java语言就是面向对象的编程语言
  1. 面向对象的特点
  • 封装
封装是指将数据和方法封装在一个对象当中,通过访问权限来保护对象和数据,防止外部直接修改对象当中的数据,封装的目的是隐藏对象中的实现细节,增加了数据的安全性和可靠性,同时提高了维护性和可扩展性
  • 继承
继承像是子承父业,比如子类继承父类,那么子类也拥有了父类的一些特征
  • 多态
多态是一个对象在同一接口的情况下的不同表现

3. 编程范式之声明式

声明式又包括函数式和响应式

  1. 函数式
只关注做什么而不是怎么做,但函数式编程不仅仅局限于声明式编程,函数的值取决于函数的参数的值,不依赖于其他状态,比如abs(x)函数计算x的绝对值,只要x不变,无论何时调用、调用次数,最终的值都是一样

函数式编程的特点:

  1. 函数是第一等公民
  2. 函数是纯函数
  1. 函数是第一等公民
指函数跟其它的数据类型一样处于平等地位,可以赋值给其他变量,可以作为参数传入另一个函数,也可以作为别的函数的返回值
  1. 函数是纯函数
指相同的输入总会得到相同的输出,并且不会产生副作用的函数,纯函数有两个特点:相同的输入必有相同的输出,不会产生副作用(指的是函数内部不会修改全局变量的值,或者外部变量的值,不会对外部有影响)
  1. 响应式
响应式编程是使用异步数据流进行编程,比如触发点击事件,然后给与响应

4. 面向对象编程的五大原则

  1. 单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
  1. 开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
  1. 里式替换原则LSP(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
  1. 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能 造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。
  1. 接口分离原则ISP(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

5. 耦合

简单地说,软件工程中对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。

有软硬件之间的耦合,还有软件各模块之间的耦合。
耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。

耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:

  • 内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
  • 公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
  • 外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
  • 控制耦合 。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。
  • 标记耦合 。若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。
  • 数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。
  • 非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。

版权属于:都依凡 所有,采用《知识共享署名许可协议》进行许可,转载请注明文章来源。

本文链接: http://blog.anlucky.cn/index.php/programming/71

赞 (2)

评论区(暂无评论)

啊哦,评论功能已关闭~