- 编程范型
- 面向对象设计原则六 - 针对接口编程,而不是针对实现编程
- 面向接口设计和编程 -(面向对象、面向接口、面向过程、面向实现)
- 面向接口编程和面向对象编程的区别
- 面向“接口”编程和面向“实现”编程
程序
原意表示事情进行的先后顺序;也指一定的工作步骤。在计算机世界中,程序
被引申为顺序设计的计算机指令的集合。
程序
(英语:procedure),指特定的一系列动作、行动或操作,而这些活动、动作或操作必须以相同方式运行,借此在相同环境下恒常得出相同的结果(例如紧急应变程序)。粗略而言,程序可以指一序列的活动、作业、步骤、决断、计算和工序,当它们保证依照严格规定的顺序发生时即产生所述的后果、产品或局面。
面向过程编程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。这与程序的定义是不谋而合的。
面向过程编程主要使用 顺序
、条件选择
、循环
三种基本结构来编写程序。
- 顺序:按照时间轴顺序完成每个处理;
- 条件选择:根据条件的成立与否执行不同的条件分支;
- 循环:根据一定的条件反复执行同样的代码;
面向过程编程将解决问题的过程通过描述过程语句、表达式、逻辑判断等完成。
现实世界由多种多样的 实例
组成,包括现实世界的抽象概念,这些实例具有各种各样的 属性
和 能力
。这些实例可以通过 能力
进行交互,进而改变属性。而实例根据其特性特征被归成多种多样的 类
。面向对象
正是对现实世界抽象,在计算机程序中,实例
一般都是 被动
执行操作,因为接口都是操作自己,主动
一方通常都是另外一个对象。
面向对象的两个基本元素就是 类
和 实例
- 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。
- 对象是具有类类型的变量。类和对象是面向对象编程技术中的最基本的概念。
所以面向对象的语言围绕实现 类
和 类的实例
展开,也有一些模拟这种行为的语言
面向对象
在 面向结构
的 基础之上,改变了程序的组织方式,将 方法
和 数据
封装
到一起构成了 实例
,这又引入了面向对象的 基本特征:封装
。
-
封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。
封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。
-
继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
-
多态:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
种类:编译时多态,运行时多态
面向接口
编程不同于面向对象编程,面向接口
编程是按接口进行归类,也就是按 能力
进行归类的。能力
在程序中常常被用做约束,比如具备什么 能力
(接口
) 的对象能够执行什么样的 操作
,常见的 *Able
如 Readable
,所以定义一个 interface Reader
是 Readable
的。这种约束方式相比强类型约束要宽松很多,也更加的灵活,同时也更加符合实际。这也是 鸭子类型
的提现。
所以在面向接口编程的应用程序中,需要定义 类型
和 接口
,在函数的参数中,可以要求传入参数是某种类型 类型
,也可以要求传入参数具备某种 接口
(能力
),在某些情况下,参数可以直接是函数定义,这时应该算作是 函数类型的参数约束。
接口
- 接口是一个对象中可以被另一个对象调用的一组方法
- 一个对象可以实现多个接口
- 类型是一个对象的特殊接口
- 不同的对象可以有相同的类型,一个对象可以有多种不同的类型
- 一个对象只有通过它的接口才能被其他对象知晓
- 接口是可插拔的关键
优点
- 客户端不知道他们所使用对象的具体类型
- 一个对象可以被另一个对象轻易地替换
- 对象不需要硬连接到一个特殊类的对象,因此增加了灵活性
- 松耦合
- 增加了重用的机会
- 增加了组合的机会,因为被包含的对象可以被实现了特定接口的其他对象替换
缺点
- 面向接口编程因为引入了 更多的概念,以及需要定义大量的接口,在一定程度上增加了设计的复杂性。
面向接口编程
和面向对象编程
是什么关系
首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。
面向‘接口’编程,而不是面向‘实现’。 -《设计模式:可复用面向对象软件的基础》
面向接口编程 vs 面向实现编程
首先我们需要理解什么是接口
,什么是实现
。简言之,接口就是我们要调用的一系列方法的集合,有对象将会响应这些方法调用。实现就是为接口存放代码和逻辑的地方。
本质上讲,这个原则倡导的是,当我们写一个函数或一个方法时,我们应该引用相应的接口,而不是具体的实现类。
接口是一种 约定
,是一个 协议
。
几乎所有电脑的硬件工作都是指令式的;几乎所有电脑的硬件都是设计来运行机器码,使用指令式的风格来写的。较高阶的指令式编程语言使用变量和更复杂的语句,但仍依从相同的典范。菜谱和行动清单,虽非计算机程序,但与指令式编程有相似的风格:每步都是指令,有形的世界控制情况。因为指令式编程的基础观念,不但概念上比较熟悉,而且较容易具体表现于硬件,所以大部分的编程语言都是指令式的。
声明式编程(英语:Declarative programming)是一种编程范式,与指令式编程相对立。它描述目标的性质,让电脑明白目标,而非流程。声明式编程不用告诉电脑问题领域,从而避免随之而来的副作用。而指令式编程则需要用算法来明确的指出每一步该怎么做。
声明式编程 基于 命令式编程
函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程典范,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。
比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。
函数式编程和声明式编程是有所关联的,因为他们思想是一致的:即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程。
函数式编程最重要的特点是“函数第一位”,即函数可以出现在任何地方,比如你可以把函数作为参数传递给另一个函数,不仅如此你还可以将函数作为返回值。