代碼重構內幕交易(Insider Trading)

      網友投稿 1321 2022-05-30

      什么是內幕交易(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(便于搬移)、搬移字段、函數等手法,將各自模塊的數據盡可能移動到一起,消除模塊間的循環依賴

      代碼重構:內幕交易(Insider Trading)

      繼續通過搬移字段、搬移函數、轉換為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小時內刪除侵權內容。

      上一篇:技術分享 | 測試人員必須掌握的測試用例
      下一篇:Spark Streaming 進階實戰五個例子
      相關文章
      亚洲AV午夜福利精品一区二区| 亚洲中文字幕无码av在线| 精品国产日韩久久亚洲| 亚洲国产精品久久66| 国产亚洲精品自在久久| 中文字幕第一页亚洲| 久久精品国产亚洲5555| 久久精品亚洲福利| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久精品国产亚洲一区二区| 亚洲午夜福利717| 伊人亚洲综合青草青草久热| 亚洲五月午夜免费在线视频| 日韩亚洲国产二区| 亚洲福利中文字幕在线网址| 亚洲国产精品嫩草影院久久| MM131亚洲国产美女久久| 亚洲日韩在线中文字幕第一页| 亚洲精品无码你懂的网站| 亚洲精品一级无码鲁丝片| 中文字幕亚洲不卡在线亚瑟| 久久亚洲高清观看| 亚洲国产成人久久精品动漫| 4480yy私人影院亚洲| 亚洲婷婷综合色高清在线| 亚洲AV无码久久久久网站蜜桃| 亚洲综合一区二区三区四区五区| 亚洲精品乱码久久久久蜜桃| 国产亚洲精品免费| 国产精品亚洲不卡一区二区三区| 亚洲区小说区图片区QVOD| 久久精品国产亚洲AV果冻传媒| 在线电影你懂的亚洲| 亚洲中字慕日产2021| 亚洲男同gay片| 亚洲第一成人影院| 亚洲精品无码高潮喷水在线| 久久久久亚洲精品无码蜜桃| 亚洲综合色区中文字幕| 欧美日韩亚洲精品| 国产午夜亚洲精品国产成人小说|