如何重構上帝式大物件反模式 - Cameron McKenzie
僅僅編寫有效的程式碼是不夠的。問題發生時,必須易於維護,增強和除錯該程式碼。物件導向程式設計如此受歡迎的原因之一是因為它滿足了這些要求。
但是,當開發人員選擇捷徑或更多地關注完成工作而不是正確完成工作時,往往會出現反模式。這些常見的反模式之一是上帝式物件。
物件導向程式設計中的主要概念之一是,每個元件都有一個目的,並且該元件僅負責允許其執行相關功能的屬性和欄位。
例如,有時敏捷衝刺太短並且里程碑日期很快就到了,開發人員會自由使用其元件。太多的職責被打包到一個元件中,並且元件之間的職責分離開始變得模糊。
良好的物件導向設計有時會使完成任務的需求倒退,而單一責任模型就會被拋諸腦後。然後,虛無的上帝物件出現了。
簡單來說,God物件是一個違反了單一職責設計模式的Java檔案,因為它:
您如何在物件導向的系統中修復God物件?重構它。請遵循以下五個步驟來重構上帝物件和整理程式碼。
1.建立一個全面的單元測試套件
建立一套單元測試,以正確驗證God物件的功能。這樣,您可以自信地重構上帝的物件。如果您碰巧破壞了某些內容,則單元測試將使您警惕任意程式碼。
2.識別客戶
在重構God類之前,請確定從何處引用God物件的方法。是在整個應用程式中平等使用God物件,還是從一組特定的子元件中呼叫方法?
找出最依賴上帝物件的元件有多個目的:
- 優先考慮重構應用程式的哪些部分。在進行影響關鍵系統的程式碼提交之前,請考慮重構不經常使用的區域。
- 如果給定的子元件集通常呼叫一組通用方法,則根據子元件用法將God物件分解為較小的物件集,作為可能的分解策略。
- 給定的一組客戶端呼叫的一組通用方法代表定義一個RESTful或基於微服務的介面的機會,該介面既鬆散耦合又引入了使應用程式成為雲原生的機會。
3.將靜態方法分解為實用程式類
例項是物件導向程式設計的基礎。靜態方法是未在任何例項變數中傳遞的方法。這樣,如果將靜態方法和靜態變數移到單個實用程式類中,則可以檢視其餘的屬性和變數,並開始建立較小的單一職責物件。
但是,實用程式類並不是特別物件導向的。處理完靜態方法後,請考慮將系統中的實用程式類分解為更物件導向的東西。但是,設計中的一些實用程式類比上帝物件要少很多問題。
4.分組通用方法和屬性
此時,上帝物件中保留有例項變數和例項方法。將它們重構為物件。使用繼承,聚合和關聯等通用的物件導向原則來表達您建立的物件之間的關係。同時,請遵守Demeter定律,以確保您仍然擁有鬆散耦合的系統。
5.刪除或棄用上帝的物件
如果成功重構了God物件,請從設計中刪除該元件。該系統應以與以前相同的方式執行。
完成此步驟後,請隨時引用弗里德里希·尼采的話:“上帝已經死了”
刪除God物件後,如果在客戶端和子元件程式碼中建立了編譯問題,請不要擔心。您可以將God物件更改為介面,或者至少將其轉換為沒有例項變數的Facade物件。然後,God物件中的方法將工作簡單地委派給各種實用程式類,並在重構God物件時建立較小的物件。
如果您確實採用立面方法,請確保將每個方法都標記為已棄用,以便將來的開發知道呼叫分解後的物件,而不是上帝物件本身。
回顧重構上帝物件的五個步驟
請遵循以下五個步驟來反轉上帝物件反模式:
- 構建一個全面的單元測試套件。
- 確定最依賴上帝的物件元件。
- 將靜態方法移到實用程式類中。
- 對常用方法和屬性進行分組,但要保持鬆散耦合的系統。
- 從系統設計中刪除God物件。
相關文章
- Shopify如何使用Strangler Fig模式重構遺留程式碼中上帝式大物件?- Adrianna Chang模式物件
- win10控制皮膚上帝模式怎麼開啟_win10系統上帝模式如何啟動Win10模式
- 如何使用建造者模式構造複雜物件?模式物件
- 工廠模式建立物件和自定義建構函式建立物件的異同模式物件函式
- 極簡架構模式-傳輸物件模式架構模式物件
- 極簡架構模式-控制反轉架構模式
- 重構 - 觀察者模式模式
- 如何禁止JavaScript物件重寫?JavaScript物件
- 建構函式建立物件函式物件
- iOS MVP模式重構實踐iOSMVP模式
- 極簡架構模式-資料訪問物件模式架構模式物件
- 如何使用OO和函式式兩個方法實現重構? - DZone函式
- Windows系統上帝模式是什麼?Win7系統與win10系統上帝模式開啟方法Windows模式Win7Win10
- javascript:建構函式模式(為什麼這種方式也可以建立物件)JavaScript函式模式物件
- 大資料正在重構新經濟模式和業務形態大資料模式
- iOS模式分析 使用介面卡模式重構TableViewiOS模式View
- 程式碼重構:函式重構的 7 個小技巧函式
- 用Lambda重構責任模式鏈模式
- 理清原型物件、 例項物件、建構函式原型物件函式
- 物件導向-設計模式-結構型物件設計模式
- 命令式、宣告式、物件導向、函式式、控制反轉之華山論劍(上)物件函式
- 用上帝視角來看待元件的設計模式元件設計模式
- [譯] 面向無神論安卓開發:如何和為什麼要幹掉上帝物件安卓物件
- JavaScript 函式引數解構物件JavaScript函式物件
- 用建造者模式的思想改造構造方法。靈活,快捷的鏈式建立物件模式構造方法物件
- 使用Lambdas重構工廠設計模式設計模式
- 如何修改docker容器的重啟策略(重啟模式)?Docker模式
- spring cloud微服務分散式雲架構-Spring Cloud 分散式的五大重點SpringCloud微服務分散式架構
- [BUG反饋]除錯模式下函式U()的BUG除錯模式函式
- 基於Redis構建微服務的反應式架構 - bitsrcRedis微服務架構
- 用Java構建反應式REST API - Kalpa SenanayakeJavaRESTAPINaN
- 《JavaScript物件導向精要》之四:建構函式和原型物件JavaScript物件函式原型
- 淺談CSS重構樣式表效能CSS
- 輕鬆理解建構函式和原型物件函式原型物件
- 私有建構函式的物件建立例項函式物件
- 空物件模式物件模式
- 物件建立模式物件模式
- 記一次重構,策略模式替換if else模式