上帝对象
上帝对象(英语: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) (英语).