實際開發過程中,一個系統會出現一個服務可能有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) {
//實現級聯功能
}
}