代碼重構:根據依賴倒置原則來解決循環依賴的問題

代碼重構:根據依賴倒置原則來解決循環依賴的問題

背景

最近項目進入推廣期,新需求開始變少,閒來無事便想着重構一下之前的代碼,之前爲了快速迭代上線,沒有仔細考慮代碼的結構,導致代碼結構混亂不堪,類與類之間關係複雜,代碼的可讀性很差,也不方便後續的擴展和維護。可能有些同學不明白,爲啥寫好的代碼要進行重構。這裏解釋一下,代碼其實是寫給人看的,而不是給機器看的,所以保持代碼的整潔和結構的清晰是非常有必要的。

重構


這是我們今天要進行重構的模塊,主要是其中的EBaiService,MeiTuanService,LyhService,YfwService,OtoOrderService,OtoService這幾個類,OtoOrderService是處理oto訂單的類,otoService是來處理各種oto之間相同的部分,像訂單入庫流程,商品信息同步流程等,看命名就知道,主要就是針對oto業務的。現在主要的問題是,類和類之間的關係太過複雜,因爲oto服務實現的功能都是類似的,所以我這裏只拿美團和餓了麼做例子,像下面這張圖一樣:
在這裏插入圖片描述
這樣的依賴是很不好的,因爲我們希望我們的類也是單一職責,美團的服務就只做美團的工作,otoservice來做公共的功能,而otoOrderService則是做一個分發,將接口接收到的信息,按照美團和餓了麼這樣分類給每個單獨的服務處理,這樣既簡潔又清晰,像下面這張圖一樣:
在這裏插入圖片描述
這樣看來的話,我們只需要吧otoOrderService和OtoService之間的關係切斷就可以了。接下來就到我們今天的問題了,如圖,現在有兩個方法,getOtoModel依賴於updateOtoOrderList,重構前他們都在OtoOrderService裏面,沒有問題。
在這裏插入圖片描述
現在我要把這兩個方法移到公共模塊,也就是OtoService裏面
在這裏插入圖片描述
本來我的重構到這就結束了,但是這裏又出現了一個問題,我們從圖中可以看出otoService和EBaiService,MeiTuanService出現了循環依賴。

解決方案

這時我想到了一個辦法,那就是把這兩個方法拆開,分別在EBaiService和MeiTuanService裏面實現一份,但是這又會產生一個問題,就是我的代碼冗餘了,而且在oto的種類越來越多的時候,這部分的代碼就是冗餘的越來越多,很大程度上增加了我的後續維護成本。
正在思考的時候我想到了我們設計代碼時候的一個原則,依賴倒置原則。
  依賴倒置原則(Dependence Inversion Principle,DIP)是指設計代碼結構時,高層模塊不應該依賴底層模塊,二者都應該依賴其抽象。

通過依賴倒置,可以減少類與類之間的耦合性,提高系統的穩定性,提高代碼的 可讀性和可維護性,並能夠降低修改程序所造成的風險。
這裏我們把OtoService當成高層代碼,而EBaiService和MeiTuanService就是底層模塊,那麼我們就可以把EBaiService和MeiTuanService抽象出來變成IOtoService,並把IOtoService作爲updateOtoOrderList的參數這樣就解決了之前出現的循環依賴的問題也完成了我們的重構。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章