设计接口的心得

从业务的独立性出发

如果业务A与业务B关联很大,但业务A和业务B是可以完全独立存在的业务。这时应该为业务A和业务B分别设计各自的接口。而不应该只提供一个接口将业务A和B绑定在一起。

比如,以下2个业务:
1、人脸的活体检测
2、人脸的比对

二者关联很大,在很多场景中是先活体检测,保证人脸的真实性后再进行人脸比对。

但“活体检测”和“人脸比对”是可以独立存在的业务。也就是说可以只有“活体检测”,也可以只有“人脸比对”(比如,上传个人照片查询此人的身份信息)。

如果只设计成一个接口。

/**
*识别人脸
*/
void identifyFace() {
        先活体检测,
        再人脸比对
}

上面这样设计,虽然大多数场景适用。但是,却将“活体检测”和“人脸比对”绑定在了一起,如果要做“人脸比对”就必须先做“活体检测”才行。无法单独做“人脸比对”了。

比较好的做法应该是为2个业务分别设置接口。

/**
*活体检测
*/
void detectFace();

/**
*人脸比对
*/
void matchFace ()

确认参数是否有意义

比较常见的就是内部订单号和外部订单号。有些项目中内部订单号是有规则生成的,查询时可以遵循这个规则快速的找到指定记录。而外部订单号也有这样的规则,只是与内部订单号的规则不同,所以要维护内部订单号和外部订单号的映射关系。

但如果内部订单号或外部订单号没有这样的规则的话,实际上就是要有一种订单号即可。

接口应该具有原子性

一个接口只负责单一的功能,如果一个业务只要求设计一个接口,但又要调用到多个功能,那就把原子性接口进行二次封装,封装成一个接口即可。

所以接口有2种,一个是业务接口,一个是单一功能的接口。业务接口可以由多个功能接口组合实现。

如果两个接口之间存在功能重合的部分,说明这两个接口设计得有问题。

考虑业务接口的性能

如果业务接口由单一功能接口组合而成时,性能偏低。就要考虑拓展功能接口了。
比如下面情况:
功能接口是导入单张图片,业务接口要求导入某个目录下的图片,目录下的图片可能有1000多张。

假设下面接口是AIDL接口,Android客户端需要读取1000多张图片到内存中,再循环调用1000多次下面的接口才行。而且有1000多张图片跨进程传输到服务端,性能明显太低下了。

/**
* 导入单张图片
*/
void importBitmap(Bitmap bmp);

这时候就要拓展出下面的功能接口:

/**
* 批量导入图片
* @param bmpDir 图片所在的目录路径
*/
void batchImportBitmaps(String bmpDir);

这样Android客户端只需要调用一次,由Android服务端读取图片就可以了,避免了1000次的跨进程传输。

猜你喜欢

转载自blog.csdn.net/jiejingguo/article/details/124197372