面向接口/协议?看DuerOS的技能开发
作者:网友投稿 时间:2019-03-08 16:42
一般地,开发一个对话系统或者机器人问答系统会涉及诸多领域的技术,除了硬件系统之外,还包括语言识别,自然语言处理/识别,知识图谱的搭建,自然语言生成及TTS播报等等,这对于企业及开发者个人而言,几乎是难以完成的任务。

有幸的是,对话式AI操作系统例如DuerOS的诞生,使我们可以直面业务逻辑,相对轻松地完成语音类服务的开发与实现。在过去的研发中,经常使用的往往是面向接口的设计方法,那么,面向对话式操作系统的开发,是如何实现的呢?
在OO的时候,通常会讲到SOLID原则:
单一职责
开闭原则
里氏替换
接口隔离
依赖反转
其中接口隔离是其中的一项重要原则。接口的概念外延较广泛,wiki上的解释是这样的:
An interface is a shared boundary across which two or more separate components of a computer system exchange information. The exchange can be between software, computer hardware, peripheral devices, humans, and combinations of these.
接口大体上从载体上分为硬件接口和软件接口,从交互上可以分为人机接口和机-机(M2M)接口。软件中的接口为组件可以提供了常量、数据类型、过程类型、异常规范和方法签名等。有时,公共变量也被定义为接口的一部分。接口是一种很高的抽象,很多时候都会涉及到接口,因此要注意上下文和具体的应用场景。
在面向对象的编程语言中,尤其是不支持多继承的编程语言,往往有着特殊的具体含义,interface 一词成为了关键字,例如Java。Java接口中所用的方法一般都是抽象方法和常量,但是在Java8及以后的版本中,开始支持静态成员以及默认的函数实现,例如:
public interface MyTestInterface {
int MAX_STORAGE_SIZE = 1024;
default void doTest() {
System.out.println("Hello, Test!");
}
}
尽管如此,作为一个从Java 1.2 开始使用的老程序员而言,Java的发展还是略显迟缓。
关于接口描述语言(IDL),大约最早出现在是CORBA的规范中,自己在1999年初次使用IDL的时候,非常感叹它的神奇,在当时简直就是跨平台开发的基础。实际上,OMG IDL不是作为程序设计语言体现在CORBA体系结构中的,而是用来描述产生对象调用请求的客户对象和服务对象之间的接口的语言。IDL文件描述数据类型和方法框架,而服务对象则为一个指定的对象实现提供上述数据和方法。一般地,IDL文件描述了服务器提供的服务功能,客户机可以根据该接口文件描述的方法向服务器提出业务请求。在大多数CORBA产品中都提供了IDL到相关编程语言的编译器。 在Android的应用开发中,AIDL实际上就是IDL的一个领域应用而已。
那么接口和协议有什么联系和区别呢?
协议,一般是指通信协议,例如大家熟知的互联网协议——TCP/IP。
在编程语言中,协议指示的是调用方和目标对象之间的交互链。一般描述为:
对象可以理解的消息。
这些消息可能附带的参数。
这些消息返回的结果类型。
尽管修改了对象的状态,但仍然保留的不变量。
需要由客户端处理到对象的异常情况。
对于通信而言,还包括方法的调用序列和决策点,例如在UML交互图中的表示:通信图、序列图、交互概述图/活动图等。
在面向对象的编程语言中,同样地,也有把protocol作为关键字的编程语言,例如Objective-C。在Objective-C中,同样不支持多继承,即不允许一个类有多个父类,于是Objective-C提供了类似的实现方法,也就是协议。协议有点类似于Java里的接口,不同点就是在协议里,可以提供可选的方法,不要求全部继承。例如:
@protocol myprotocolName
- (void)requiredMethod;
@optional
- (void)anOptionalMethod1;
- (void)anOptionalMethodn;
- (void)otherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
Objective-C的协议包括正式协议和非正式协议,这里不再赘述。


