简介
三年前,我们发表了一篇文章给大家介绍了业务代码解构利器SWAK,SWAK是Swiss Army Knife的简称,众所周知,瑞士军刀是一款小巧灵活、适用于多种场景的工具。在闲鱼服务端,SWAK框架也是这样一种小巧灵活、适用于多种场景的技术框架, 它可以用于解决平台代码和业务代码耦合严重难以分离;业务和业务之间代码交织缺少拆解的问题。之前我们将其应用在了商品域的业务解耦上,现在我们在搜索的胶水层中再一次遇到了这样的问题,所以我们决定将SWAK重新再拿出来让其再放光彩。
SWAK在闲鱼搜索上的应用
目前闲鱼搜索采用了新的端云一体开发模式,引入了胶水层把客户端的一部分逻辑移动到了服务端,以此来提升端侧的动态能力,降低跟版本需求的数量,加快需求的上线速度。在运行这个新模式的过程中,一开始胶水层部分的代码结构设计较为简单,导致胶水层的代码出现严重的耦合以及if-else逻辑膨胀的情况。
我们基于对业务的预判,进行了胶水层的重构,主要通过SWAK解决了两个问题:
•由于入搜的垂直业务不断增加,现有结构无法支撑业务进行自定义,所以通过SWAK进行了一层解耦,根据不同的bizType(业务类型)索引到相应的页面编排逻辑。保障了不同业务的页面编排逻辑之间不会相互影响,小业务可以复用商品搜索的页面逻辑,也可以自己进行定制。
•卡片种类越来越多,导致了卡片解析器部分的if-else代码膨胀。所以我们引入了第二层SWAK,将卡片解析器部分的if-else去掉,改为通过cardType(卡片类型)索引到相应解析器的模式,避免后续的同学在一堆if-else中晕头转向,找不到真正的逻辑。
搜索胶水层目前还在整体的架构升级中,这边先给大家简单介绍一下,后续等架构升级完成后再写文章给大家介绍一下闲鱼搜索端云一体的研发模式,本文先着重介绍一下SWAK的实现原理。
回顾SWAK使用方式
在讲解SWAK的原理之前,我们先简单地回顾一下SWAK的使用方式,以便更好的理解它的原理。我们先看一下SWAK解决的是什么问题。举个例子当我们在进入搜索的时候,需要判断不同的搜索类型,并返回不同的页面编排,这时候就需要根据这个类型走到不同分支的代码了,如果代码耦合在一个地方,后续这个文件会变得越来越难以维护。
if(搜商品) {
if(搜商品A版本) {
doSomething1();
}else if(搜商品B版本) {
doSomething2();
}
} else if(搜会玩) {
doSomething3();
} else if(搜用户) {
if(搜用户A版本) {
doSomething4();
}else if(搜用户B版本) {
doSomething5();
}
}
SWAK的出现,就是为了解决上文中的这种情况,我们可以将所有的if-else对应的逻辑平铺开来,将其变为TAG,通过SWAK进行路由。
/**
* 1.首先先定义一个接口
*/
@SwakInterface(d