上帝物件
上帝物件(英語:God object)是物件導向程式設計中了解過多或者負責過多的物件,為一種反面模式。[1][2]上帝物件通常出現在設計不良的系統中。[3]
特徵
以下為一個上帝物件的Java範例:
public class GodObject {
private int data;
public void processData() {
// 非常複雜的處理邏輯
// 涉及多個不同的功能和方法邏輯
// 違反單一職責原則
}
public void saveData() {
// 將數據儲存到資料庫
// 涉及與資料庫的連接和互動
// 違反低耦合性原則
}
public void displayData() {
// 顯示數據到用戶介面
// 涉及與介面層的互動
// 違反低耦合性原則
}
// 其他許多方法和屬性...
}
範例中所示的GodObject
類別有太多的功能和責任,不遵從單一功能原則,包攬所有處理、儲存和顯示數據的操作。processData
方法中的處理邏輯非常複雜,應該將該邏輯根據功能分解成更小的方法或抽象成獨立的類別。saveData
和displayData
方法與資料庫和用戶介面直接耦合,降低可測試性和可延伸性。
上帝物件通常包含過多的方法和屬性,導致類別過於龐大。[4]上帝物件違背單一功能原則和其他SOLID原則,功能過於集中在一個類別中。上帝物件負責處理系統中的所有複雜邏輯和功能,導致物件變得難以理解和維護。上帝物件通常不依循常見設計模式,例如分層結構、策略模式、觀察者模式等,而是採取了導致程式設計問題的反面模式。上帝物件通常將無關的功能集中在一個類別中,導致功能緊密耦合,難以單獨測試、修改。上帝物件不遵守分治演算法,即將一個複雜的問題分成更小、可管理的部分,反而把所有功能集中在一個類別中,增加問題複雜度和難度。[5]
危害
上帝物件繼承時,所有不需要的成員都會繼承到其他類別中,因此不適合重複使用。上帝物件非常大,會佔用大量記憶體空間。上帝物件必須處理大量的功能和行為,會佔用許多不需要的資源,即使執行簡單操作時也是如此。上帝物件還會導致嚴密的耦合,難以維護和擴展,而且上帝物件涉及了太多功能和行為,很難涵蓋測試。[5]
解決方式
代碼重構能解決上帝物件的問題。只要將相關功能拆分成獨立組合,就可以獨立修改,並且能夠適應系統變化。[5]
首先,建立一個全面的單元測試套件,以驗證上帝物件的功能,即可放心重構,並在需要時快速反饋。確定哪些部分的程式碼會使用上帝物件的方法,找出最常使用上帝物件的組件,重點處理這些組件的重構。接着,將靜態方法和靜態變數轉移到一個實用程式類別中,即可減少上帝物件的大小,同時確保功能的可重用性。根據相關性和功能,將上帝物件的方法和屬性重構為更小、單一責任的物件。使用繼承、聚合和關聯等物件導向原則來表達這些物件之間的關聯。最後,刪除完成重構的上帝物件,或者標記為過時,並且遵守得墨忒耳定律,系統就會像正常運作。[6][7][8]
重構上帝物件可能會在客戶端和子組件的程式碼中引起編譯問題,這時可以將上帝物件轉換為介面或者外觀物件。外觀物件不包含實例變數,而只將工作委派給進行重構後的較小物件和實用程式類別。[7]
參見
- 餛飩式代碼:和上帝物件恰好相反的反模式。
參考資料
- ^ Riel, Arthur J. Object-oriented design heuristics 11. printing. Reading, Mass.: Addison-Wesley. 2005. ISBN 978-0-201-63385-6 (英語).
- ^ Schöngruber, Andreas. What Is an Anti-pattern?. 2023-05-27 [2023-07-17]. (原始內容存檔於2023-07-17) (英語).
- ^ God Objects. Exception Not Found. 2018-08-31 [2023-07-17]. (原始內容存檔於2018-12-04) (美國英語).
- ^ 米雪兒. [Raku] 程式設計教學:類別 (Class) 和物件 (Object). OpenSourceDoc. [2023-07-17]. (原始內容存檔於2023-07-17) (中文(臺灣)).
- ^ 5.0 5.1 5.2 Ershad, Gul Md. God Object - A Code Smell. C-Sharpcorner. [2023-07-17]. (原始內容存檔於2023-07-17) (英語).
- ^ Lin, Justin. 漫談模式::Mediator. OPENHOME. [2023-07-17]. (原始內容存檔於2023-07-17) (中文(臺灣)).
- ^ 7.0 7.1 How to refactor the God object class antipattern. TheServerSide. [2023-07-17]. (原始內容存檔於2023-07-17) (英語).
- ^ Kanjilal, Joydip. How to refactor God objects in C#. InfoWorld. 2020-08-10 [2023-07-17]. (原始內容存檔於2023-07-17) (英語).