實際開發(fā)過程中,一個系統(tǒng)會出現(xiàn)一個服務可能有N多個地方會需要使用,這個時候我們就會需要去將服務封裝成一個公共的Class,但是倘若封裝的不夠完美,那么這個服務Class也將成為系統(tǒng)的雞肋。下面我說的封裝的思路,對于前段和后端開發(fā)都適合。
封裝的原則
1、能夠解決95%~99%的系統(tǒng)場景(也就是除了解決現(xiàn)在的問題,還能夠支持將來可能出現(xiàn)的問題)
2、體現(xiàn)自己的核心處理能力(核心能力基本上不會去改變)
3、當服務改變或者升級時,對于老的調用方無感知,能夠做到無需調整
封裝的核心
舉個生活中的栗子
生活中存在很多電器設備,每個電器設備都需要使用電,而且每個電器都會有插頭,通過插頭插入插線板,那么機器就可以運轉。下面做個名詞的對應:
調用方:電熨斗(三眼插頭)、電視機(兩眼插頭)
服務方:供電設備
核心能力:供電
Handler:家里的插座
電熨斗和電視機需要運轉,就需要用到電器設備,而電器設備里面的Handler就是插座,電器設備的核心能力就是供電。由于調用方出現(xiàn)了不同的插頭類型,所以插座的出現(xiàn)就是為了解決兼容的問題。插座的主要作用就是自身設計了兩種傳參——兩眼插孔和三眼插孔,不同的設備接入對應的插孔,這樣就可以享受到供電的服務。
問題1:如果出現(xiàn)四眼插頭的設備怎么辦?
回答:我們要做的其實就是新增一個對于四眼插頭的支持,也就是對應的新增一個四眼插孔,這樣對于老設備來說無需任何調整,仍然可以毫無影響的在原來的插座上享受供電服務。
問題2:如果出現(xiàn)供電升級怎么辦?
回答:供電設備內部硬件升級,做到對于老設備的0影響。比如電壓由220V變成了280V,如果供電設備不做調整,那么對于老的設備來說可能直接會被高電壓燒毀。但是如果你要去設備自身調整成適配280V電壓,那么無疑是一個巨大的工作量。
舉個前端開發(fā)中的栗子
調用方:A頁面,數(shù)據(jù)包結構A;B頁面,數(shù)據(jù)包結構B
服務方:級聯(lián)插件
核心能力:級聯(lián)
Handler:數(shù)據(jù)包處理
var _Plugin = {
open: function(args) {
//實現(xiàn)級聯(lián)功能
}
}
由于A頁面和B頁面都使用到了級聯(lián)插件,但是各自傳參數(shù)據(jù)包都不一樣。所以我們在封裝插件時,就需要考慮將差異化做到插件內部去處理。針對單個業(yè)務場景來說,既然要做到區(qū)分,我們就需要利用一個字段來處理,常用的手段是定義一個type傳參,值類型為數(shù)字,不同的數(shù)字代表不同的數(shù)據(jù)包;其次定義傳入的數(shù)據(jù)包的key,一般來說為了方便識別,key的命名就定義為data。所以上面的open方法的傳參設計例如:
var args = {
type: 1, //區(qū)分業(yè)務場景
data: {}, //傳入的數(shù)據(jù)
}
問題1:如果出現(xiàn)C頁面,傳入C數(shù)據(jù)包怎么辦?
回答:type值多加一個用于區(qū)分C頁面的調用。
問題2:級聯(lián)插件更改怎么辦?
回答:根據(jù)新的插件要求,內部做處理。比如原來的插件需要dt_1這樣的數(shù)據(jù)結構,但是新的插件需要dt_2這樣的數(shù)據(jù)結構,那么就在內部將原來的A、B.....處理成dt_2數(shù)據(jù)包結構
問題3:A、B數(shù)據(jù)包可以直接利用,但是C數(shù)據(jù)包不行,怎么辦?
回答:內部將C處理成需要的數(shù)據(jù)結構
問題4:已經(jīng)有N個頁面調用了open方法,但是為了滿足更多業(yè)務場景,需要對open的傳參做調整,怎么辦?
回答:利用方法重載的思路進行內部方法的改造,比如創(chuàng)建一個新方法open_new,它的傳參是按照新的要求設計的,那么對于老的頁面都在調用open方法,我們就必須將open的內部實現(xiàn)做調整,比如:
var _Plugin = {
open: function(args) {
//對args做處理,生成新的傳參argsNew
args --> argsNew
open_new(argsNew);
},
open_new: function(argsNew) {
//實現(xiàn)級聯(lián)功能
}
}