1.6 接口
以麦当劳的订单准备过程为例。假设小明下了一个包含汉堡和薯条的订单。订单上有汉堡,因此工作人员会首先找到汉堡的原材料,如面包片、肉饼和生菜等,然后按照规定的步骤,将这些原材料组合成汉堡,最后交给小明。工作人员发现订单上还有薯条,于是进入另一个工作流程——找到薯条的原材料和炸薯条的锅,把薯条炸好后,送到小明面前。
在上面的例子中,汉堡以及薯条的原材料就是接口的入参,也就是接口的特定输入;制作汉堡或炸薯条的过程,就是接口内部的处理逻辑;送到小明面前的汉堡和薯条,就是接口的处理结果和特定输出,也就是返回参数。
由此可以看出,接口就是包含特定输入和特定输出的一套逻辑处理单元,用户无须知晓接口的内部实现逻辑,这也可以称为接口的黑盒处理逻辑。从上面的例子中我们还可以看到,因为服务对象不同,接口又可分为两种:一种是系统或服务的内部接口,另一种是外部接口。
1.6.1 内部接口
简单来说,内部接口就是系统内部调用的接口。在上面的例子中,内部接口有两个。
订单。麦当劳的工作人员在接到小明的订单后,输入汉堡和薯条的原材料,将汉堡和薯条做好后,便将它们放到后厨和前台之间的中间储物柜里。
中间储物柜。麦当劳的工作人员从中间储物柜里拿出做好的汉堡和薯条,送到小明面前。
在软件系统中,内部接口又是怎么一回事呢?其实,当我们在网上购物时,需要首先登录系统,然后将商品加入购物车,最后支付订单。从添加商品到购物车,再到支付订单,其间的相关工作就是通过内部接口来完成的。
1.6.2 外部接口
前面介绍了内部接口,那么什么是外部接口呢?其实,外部接口是相对于内部接口而言的。在上面的例子中,小明在麦当劳点餐的场景就是外部接口,这个外部接口可以分为两部分。
出订单前,小明的点餐过程。这个外部接口的特定输入就是小明在点餐时,告诉服务员具体要点的汉堡和薯条,它们相当于小明输入给麦当劳的参数。
出订单后,工作人员送餐的过程。这个外部接口的特定输出就是工作人员送到小明面前的汉堡和薯条,它们相当于麦当劳返回给小明的处理结果。
那么在软件系统中,外部接口又是怎么一回事呢?我们把商品添加到购物车中后单击“付款”按钮时,页面会跳转到支付系统,等完成支付流程后,则会跳转回订单页,其间就涉及系统对外依赖的接口,比如付款过程中的支付接口、配送过程中的物流接口等。
下面我们总结一下接口的本质。接口其实就是一种契约,并采用以下这种形式:在开发前期约定接口会接收什么数据以及处理结束后又会返回什么数据。如果调用方和被调用方都遵从这种契约,就可以达到共同开发的目的,开发完成后,可通过联调达成系统逻辑的预期,从而提高研发效能。