沈晓庆:初探Web服务中的面向接口编程一
引入
以往我们接受到的编程方式一般是面向对象编程和面向过程编程。本片文章将引入Web服务中的接口编程,它的优势在于调用方不用关心被调用方的内部结构;另一方面,调用方可以随时换掉被调用方,只要替换者也提供同等的功能。
面向接口 / 对象 / 过程的区别
面向过程编程
指进行业务抽象的时候,我们定义一个一个的过程方法,通过这些过程方法的串联完成具体的业务。
面向过程编程的整个思路就是实现思路,它的思维方式比较直接简单,按照目标一步步实现。但缺点是一旦需求有一些变化,整个链路的改动都会受影响。
面向对象编程
在业务抽象的时候,我们先定义业务中的对象,通过这些对象之间的关联来表示整个业务。
面向接口编程
面对业务,我们并不先定义具体的对象、思考对象有哪些属性,而是先思考如何抽象接口,把接口的定义放在第一步,然后多个模块之间梳理如何通过接口进行交互,最后才是实现具体的模块。
接口实现了对业务逻辑的抽象,设计接口就是抽象业务的过程。
Web服务中的面向接口编程
服务提供者和服务容器的理论基础
在Web服务中,将每个模块看成是一个服务提供者(service provider),我们关注的重点是服务提供的能力,即接口协议。那么框架主体真正要做的事情是什么呢?其实是:定义好每个模块服务的接口协议,规范服务与服务之间的调用,并且管理每个服务的具体实现。框架主体也被称做服务容器。
如下图所示,所有的服务都去框架主体中注册自身的模块接口协议,然后通过接口从框架主体中获取服务实例。
服务提供者提供的是创建服务实例的方法,服务容器提供的是实例化服务的方法。至于这个服务实例拥有哪些能力,即符合哪个接口协议,是预先在框架主体中定义好的。
服务提供者的接口定义
- 获取服务凭证的能力 Name;
- 创建服务实例化方法的能力 Register;
- 获取服务实例化方法参数的能力 Params;
- 两个与实例化控制相关的方法,控制实例化时机方法 IsDefer、实例化预处理的方法 Boot。
基本功能
- 服务提供者需要有一个凭证,它是一个字符串结构。通过方法Name()来获取凭证字符。
- 服务提供者需要有创建服务实例方法的能力,它的返回值是NewInstance。
// Register 在服务容器中注册了一个实例化服务的方法
Register(Container) NewInstance
// NewInstance定义了创建新实例
type NeweInstance func(...interface{})(interface{}, error)
- 我们的服务提供者还需要提供一个获取服务参数的能力
// Params 定义传给NewInstance的参数
Params(Container)[]interface{}
示例化过程的控制
- 是否在注册的时候就实例化这个服务,需要IsDefer接口。这个接口控制了示例化的时机。
- 我们还需要调用准备工作的函数Boot
总结
具体功能模块的实现由绑定的服务提供者进行,我们只需要规范服务提供者的能力,就能获得具体的服务实例了。服务提供者的接口有三个基础能力:获取服务凭证、注册服务实例化、获取参数;两个控制能力:控制实例化时机,实例化预处理。
版权声明:本文为tiaojingtao1293原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。