首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

反模式讀書筆記:Blob(胖類)反模式— 從上帝類到職責均衡的重構之路

     編輯:Java 相關知識

一、什麼是 Blob(胖類/上帝類)反模式

定義:一個或少數類不斷膨脹,吞噬整個面向對象架構。表現為:單一類壟斷處理邏輯,其他類退化為無行為的數據容器 (Data Class/DTO)。

二、產生根因

根因類別具體表現
思維模式滯後開發者習慣面向過程設計:將過程與數據分離,而非 OO 的「數據+行為」封裝
需求分析缺失未識別領域核心概念,導致職責劃分錯誤,核心業務邏輯集中在單一控制器
演進失控迭代中新功能持續堆疊到現有類,缺乏重構機制,新成員不熟悉架構邊界
架構治理缺位無代碼審查、無架構評審、無度量指標(如類行數、方法數、圈複雜度)閾值管控

三、癥狀與後果

  1. 結構癥狀:單類屬性/方法數極大(>500 行 / >20 方法);封裝異質、無關邏輯;一個控制器 + 多個貧血數據對象
  2. 質量後果:難以復用、難以測試(依賴鏈過長)、難以維護(修改波及面大)、加載內存開銷大
  3. 團隊後果:合併衝突頻發、知識壟斷於少數人、新人上手極難

四、兩種表現形式

形式特徵典型場景
行為型 Blob所有處理邏輯集中在一類,與大多數其他對象交互Service 層巨無霸、Controller 包含所有業務規則
數據型 Blob包含被系統大部分對象使用的數據,常為「上帝配置類」或「上下文持有者」GlobalConfig、UserSession、GodContext

五、重構方案:職責遷移四步法

1. 識別契約:提取相關屬性與方法集合(高內聚切片)
2. 尋找「自然的家」:將切片遷移至語義匹配的領域對象
3. 移除遠耦合:消除冗餘間接依賴,建立直接協作關係
4. 清理瞬時關聯:移除臨時、過渡性的字段與方法

實戰案例:訂單處理 Blob 重構

重構前:OrderProcessor (800 行) 包含:價格計算、庫存扣減、優惠券驗證、郵費計算、訂單持久化、消息發送、日誌記錄

重構後:

  • PricingService:價格/優惠/郵費計算
  • InventoryService:庫存扣減/補償
  • OrderRepository:持久化
  • NotificationService:消息發送
  • OrderCoordinator(原 Processor 退化為):編排上述服務,事務邊界控制

本質轉變:控制器 → 協調器,數據類擴充行為成為領域對象,協調器僅負責流程編排。

六、重構技術戰術

七、預防機制:將重構前置到日常開發

  1. 類級度量閾值:LOC < 200、Methods < 15、WMC (加權方法數) < 30,CI 中強制檢查
  2. 代碼審查清單:是否出現「Manager/Handler/Processor/Util」等易膨脹命名?職責是否單一?
  3. 領域建模優先:編碼前完成領域模型圖,明確聚合根、實體、值對象、領域服務邊界
  4. 定期架構健康檢查:SonarQube/Structure101 分析依賴環、模塊耦合度、核心類膨脹趨勢

八、總結

Blob 反模式是面向對象設計退化為面向過程的典型標誌。通過契約識別→自然歸宿遷移→耦合清理→關聯精簡四步重構,配合度量閾值、審查文化、領域建模先行三大預防機制,可有效避免上帝類再生,構建高內聚、低耦合、可持續演進的領域模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
手法適用場景工具支持
Extract Class提取高內聚方法群為新類IDE 重構菜單
Move Method/Field將行為移至數據所在類IDE 重構菜單
Replace Data Value with Object將基礎類型字段提升為值對象手動 + 測試保護
Introduce Parameter Object合併長參數列表IDE 重構
Preserve Whole Object傳遞完整對象而非分散字段手動