代碼重構:內幕交易(Insider Trading)
什么是內幕交易(Insider Trading)
定義:模塊之間互相引用,私下直接進行大量的數據訪問和交換
影響:增大模塊間的耦合,容易導致循環依賴,加快架構腐化,甚至會朝著大泥球式的架構發展,嚴重影響可維護性
改進目標:消除模塊間不合理的依賴關系(特別是循環依賴),將私下的數據訪問和交換放到明面上,使模塊間解耦,提高可維護性
方法:搬移函數、搬移字段、隱藏委托關系、以委托取代子類/超類
案例——簡化的學生選課系統
代碼背景
簡化的學生選課系統,主要功能包括:
添加學生信息
添加課程信息
添加學生選課信息(課程和學生之間的映射,多對多關系)
學生選課信息查詢
維護了單門課程和單個學生的個人信息
兩個Manager包含了多個Student和Course對象,負責學生和課程信息的添加、映射關系的創建、以及選課信息的查詢,
CourseSelectionManager負責內部Manager的統一創建和管理
CourseSelectionSystemApi包含了對外提供的接口
癥狀/問題
不合理的繼承體系常會造成“密謀”,子類直接操作父類中的屬性、字段等,加重了兩個模塊之間的耦合
CourseSelectionSystemApi中封裝的是對外暴露的接口,而CourseSelectionManager負責的是內部數據的操作和管理,二者不在一個層次,不應該直接通過繼承來實現數據的訪問和傳遞。
重構目標
消除不合理的繼承體系,合理封裝屬性、字段、方法等,使用委托進行對象間的訪問和調用
重構手法
以委托取代子類/超類
注:繼承是最常見的關系之一,這里提出的問題和重構手法,僅針對的是業務上不合理的繼承關系
癥狀/問題
模塊間私下、頻繁的數據交換,會導致循環依賴的產生,使軟件可維護性變差,架構迅速腐化,最終演變為大泥球架構
CourseManager中引入了student包下的Student對象,StudentManager中引入了course包下的Course對象,產生了包級別的循環依賴
CourseManage方法里直接引入了StudentManager對象,而StudentManager也直接引入了CourseManager,兩個類之間循環依賴
重構目標
解除循環依賴,提升可讀、可維護性。通過搬移函數和字段,將屬于各自模塊的功能搬移到一起,減少私下的數據訪問和交換;對于無法避免的依賴,可引入新的模塊作為中介,將訪問和交換放到明面上。
重構手法: 搬移函數、 搬移字段、 隱藏委托關系
IDEA——Analyze——AnalyzedependencyMatrixScope分析依賴矩陣
通過圖形化展示內幕交易引發的循環依賴:
①為類圖,可以看到Course和Student都分別與StudentManager、CourseManager有組合關系
②為package圖,可以看到Course和Student在不同的package下,package間存在循環依賴
③IDEA自帶的依賴關系矩陣,出現在對角線右上角的元素,即為不合理的反向依賴
改進路線
用委托取代子類/父類,消除CourseSelectionSystemApi和CourseSelectionManager之間不合理的繼承關系
通過隱藏委托關系,將內部的manager隱藏起來,不對api層體現
通過轉換為static(便于搬移)、搬移字段、函數等手法,將各自模塊的數據盡可能移動到一起,消除模塊間的循環依賴
繼續通過搬移字段、搬移函數、轉換為instance方法等重構手法,將student、course兩個模塊共同的行為搬移到新的模塊中CourseSelectionManager中,消除潛在的循環依賴風險,且將student和course完全解耦
重構對比
重構前
course和student模塊依賴關系混亂
依賴矩陣可直觀看出存在不合理的反向依賴
重構后
course和student模塊解耦,無反向依賴
依賴矩陣分析依賴關系正常
相關技巧(識別工具)
IDEA——Analyze——AnalyzedependencyMatrixScope:識別代碼中不合理的反向依賴關系(對角線右上角出現數字即表示模塊間依賴關系存在問題),可輔助識別內幕交易等代碼壞味道
進階:對于新增或已重構“干凈”的架構和分層,可以使用ArchUnit進行架構看護,以UT的形式定義并限制模塊間依賴關系,避免不合理的依賴引入,降低內幕交易等由依賴關系導致的壞味道出現的風險
官方文檔:https://www.archunit.org/userguide/html/000_Index.html
總結
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。