实际开发过程中,一个系统会出现一个服务可能有N多个地方会需要使用,这个时候我们就会需要去将服务封装成一个公共的Class,但是倘若封装的不够完美,那么这个服务Class也将成为系统的鸡肋。下面我说的封装的思路,对于前段和后端开发都适合。
封装的原则
1、能够解决95%~99%的系统场景(也就是除了解决现在的问题,还能够支持将来可能出现的问题)
2、体现自己的核心处理能力(核心能力基本上不会去改变)
3、当服务改变或者升级时,对于老的调用方无感知,能够做到无需调整
封装的核心
举个生活中的栗子
生活中存在很多电器设备,每个电器设备都需要使用电,而且每个电器都会有插头,通过插头插入插线板,那么机器就可以运转。下面做个名词的对应:
调用方:电熨斗(三眼插头)、电视机(两眼插头)
服务方:供电设备
核心能力:供电
Handler:家里的插座
电熨斗和电视机需要运转,就需要用到电器设备,而电器设备里面的Handler就是插座,电器设备的核心能力就是供电。由于调用方出现了不同的插头类型,所以插座的出现就是为了解决兼容的问题。插座的主要作用就是自身设计了两种传参——两眼插孔和三眼插孔,不同的设备接入对应的插孔,这样就可以享受到供电的服务。
问题1:如果出现四眼插头的设备怎么办?
回答:我们要做的其实就是新增一个对于四眼插头的支持,也就是对应的新增一个四眼插孔,这样对于老设备来说无需任何调整,仍然可以毫无影响的在原来的插座上享受供电服务。
问题2:如果出现供电升级怎么办?
回答:供电设备内部硬件升级,做到对于老设备的0影响。比如电压由220V变成了280V,如果供电设备不做调整,那么对于老的设备来说可能直接会被高电压烧毁。但是如果你要去设备自身调整成适配280V电压,那么无疑是一个巨大的工作量。
举个前端开发中的栗子
调用方:A页面,数据包结构A;B页面,数据包结构B
服务方:级联插件
核心能力:级联
Handler:数据包处理
var _Plugin = {
open: function(args) {
//实现级联功能
}
}
由于A页面和B页面都使用到了级联插件,但是各自传参数据包都不一样。所以我们在封装插件时,就需要考虑将差异化做到插件内部去处理。针对单个业务场景来说,既然要做到区分,我们就需要利用一个字段来处理,常用的手段是定义一个type传参,值类型为数字,不同的数字代表不同的数据包;其次定义传入的数据包的key,一般来说为了方便识别,key的命名就定义为data。所以上面的open方法的传参设计例如:
var args = {
type: 1, //区分业务场景
data: {}, //传入的数据
}
问题1:如果出现C页面,传入C数据包怎么办?
回答:type值多加一个用于区分C页面的调用。
问题2:级联插件更改怎么办?
回答:根据新的插件要求,内部做处理。比如原来的插件需要dt_1这样的数据结构,但是新的插件需要dt_2这样的数据结构,那么就在内部将原来的A、B.....处理成dt_2数据包结构
问题3:A、B数据包可以直接利用,但是C数据包不行,怎么办?
回答:内部将C处理成需要的数据结构
问题4:已经有N个页面调用了open方法,但是为了满足更多业务场景,需要对open的传参做调整,怎么办?
回答:利用方法重载的思路进行内部方法的改造,比如创建一个新方法open_new,它的传参是按照新的要求设计的,那么对于老的页面都在调用open方法,我们就必须将open的内部实现做调整,比如:
var _Plugin = {
open: function(args) {
//对args做处理,生成新的传参argsNew
args --> argsNew
open_new(argsNew);
},
open_new: function(argsNew) {
//实现级联功能
}
}