在說明如何提高程式碼複用性前,有必要了解一下程式碼複用性的層次,大致整理瞭如下幾個層次,下面分別說明:
1.第一層
最能想到,最常用的程式碼複用:方法和類複用,比如說我們寫了一個方法,這個方法在本jar包中其他地方也用,那可以抽出來放在一個類中,這樣其他類也可以使用;常見的就是各種xxxUtil類,如常見的StringUtil:
public class StringUtil {
public static boolean isEmpty(String value) {
return value == null || value.trim().length() == 0 || "null".endsWith(value);
}
2.第二層
隨著專案越來越大,我們發現不光本jar包裡面需要此複用類了,其他很多jar都需要此類,那怎麼辦,這時候就出現了把相關複用類放到一個jar包中,比如叫xx-
util.jar
3.第三層
專案慢慢的發展,出現了另外的問題,複用jar包升級的問題,比如複用jar裡面有個bug需要升級,那麼其他所有引用此jar的地方都要升級,改動量很大;這該怎麼解決,這時候出現了服務化,也就是說公共的jar功能不在被其他應用引用,而是對外提供一個統一個服務介面,這樣不管我這個服務內部怎麼變只要介面不變都沒有關係;
4.第四層
隨著服務越來越多,服務間呼叫越來越頻繁,出現了rpc中介軟體;資料庫的訪問也出現了資料庫中介軟體;訊息的傳送儲存接收出現了訊息中介軟體;快取,排程,配置中心,等等大量的中介軟體出現使我們構建一個服務更加方便;這其實也是一種更加抽象的複用;
5.第五層
下一代微服務網格,服務間通訊的基礎設施層,對開發人員來說遮蔽了更多的細節,專注更多的業務;
從上面5個層次來看,其實也是軟體行業開發經歷的過程;其實我們可以從軟體抽象複用的角度來看,其他每一層次的進化,都是為了更好的複用,抽象出更多的本質東西,使開發人員更加的關注各自不一樣的業務。
那麼問題來了如何提高程式碼的複用性,我覺得離不開兩個詞:抽象;其實現在大量使用的各種中介軟體何嘗不是一種抽象,抽出本質的東西,放在一個地方單獨處理;舉個簡單的例子,比如我要到某地去,我可以騎車去,可以做公交去,可以走去,可以開車去,但是抽出本質其實就是我要去某地,關於如何去都是具體的實現方式。
在說明如何提高程式碼複用性前,有必要了解一下程式碼複用性的層次,大致整理瞭如下幾個層次,下面分別說明:
1.第一層
最能想到,最常用的程式碼複用:方法和類複用,比如說我們寫了一個方法,這個方法在本jar包中其他地方也用,那可以抽出來放在一個類中,這樣其他類也可以使用;常見的就是各種xxxUtil類,如常見的StringUtil:
public class StringUtil {
public static boolean isEmpty(String value) {
return value == null || value.trim().length() == 0 || "null".endsWith(value);
}
}
2.第二層
隨著專案越來越大,我們發現不光本jar包裡面需要此複用類了,其他很多jar都需要此類,那怎麼辦,這時候就出現了把相關複用類放到一個jar包中,比如叫xx-
util.jar
,這樣其他jar都可以直接引用這個通用jar;3.第三層
專案慢慢的發展,出現了另外的問題,複用jar包升級的問題,比如複用jar裡面有個bug需要升級,那麼其他所有引用此jar的地方都要升級,改動量很大;這該怎麼解決,這時候出現了服務化,也就是說公共的jar功能不在被其他應用引用,而是對外提供一個統一個服務介面,這樣不管我這個服務內部怎麼變只要介面不變都沒有關係;
4.第四層
隨著服務越來越多,服務間呼叫越來越頻繁,出現了rpc中介軟體;資料庫的訪問也出現了資料庫中介軟體;訊息的傳送儲存接收出現了訊息中介軟體;快取,排程,配置中心,等等大量的中介軟體出現使我們構建一個服務更加方便;這其實也是一種更加抽象的複用;
5.第五層
下一代微服務網格,服務間通訊的基礎設施層,對開發人員來說遮蔽了更多的細節,專注更多的業務;
從上面5個層次來看,其實也是軟體行業開發經歷的過程;其實我們可以從軟體抽象複用的角度來看,其他每一層次的進化,都是為了更好的複用,抽象出更多的本質東西,使開發人員更加的關注各自不一樣的業務。
那麼問題來了如何提高程式碼的複用性,我覺得離不開兩個詞:抽象;其實現在大量使用的各種中介軟體何嘗不是一種抽象,抽出本質的東西,放在一個地方單獨處理;舉個簡單的例子,比如我要到某地去,我可以騎車去,可以做公交去,可以走去,可以開車去,但是抽出本質其實就是我要去某地,關於如何去都是具體的實現方式。