如何重构上帝式大对象反模式 - Cameron McKenzie

20-03-27 banq

仅仅编写有效的代码是不够的。问题发生时,必须易于维护,增强和调试该代码。面向对象编程如此受欢迎的原因之一是因为它满足了这些要求。

但是,当开发人员选择捷径或更多地关注完成工作而不是正确完成工作时,往往会出现反模式。这些常见的反模式之一是上帝式对象。

面向对象编程中的主要概念之一是,每个组件都有一个目的,并且该组件仅负责允许其执行相关功能的属性和字段。

例如,有时敏捷冲刺太短并且里程碑日期很快就到了,开发人员会自由使用其组件。太多的职责被打包到一个组件中,并且组件之间的职责分离开始变得模糊。

良好的面向对象设计有时会使完成任务的需求倒退,而单一责任模型就会被抛诸脑后。然后,虚无的上帝对象出现了。

简单来说,God对象是一个违反了单一职责设计模式的Java文件,因为它:

  • 执行多项任务;
  • 声明许多不相关的属性;和
  • 维护一组方法,这些方法彼此之间没有逻辑关系,除了执行对应用程序功能至关重要的操作外。

您如何在面向对象的系统中修复God对象?重构它。请遵循以下五个步骤来重构上帝对象和整理代码。

1.创建一个全面的单元测试套件

建立一套单元测试,以正确验证God对象的功能。这样,您可以自信地重构上帝的对象。如果您碰巧破坏了某些内容,则单元测试将使您警惕任意代码。

2.识别客户

在重构God类之前,请确定从何处引用God对象的方法。是在整个应用程序中平等使用God对象,还是从一组特定的子组件中调用方法?

找出最依赖上帝对象的组件有多个目的:

  • 优先考虑重构应用程序的哪些部分。在进行影响关键系统的代码提交之前,请考虑重构不经常使用的区域。
  • 如果给定的子组件集通常调用一组通用方法,则根据子组件用法将God对象分解为较小的对象集,作为可能的分解策略。
  • 给定的一组客户端调用的一组通用方法代表定义一个RESTful或基于微服务的接口的机会,接口既松散耦合又引入了使应用程序成为云原生的机会。

3.将静态方法分解为实用程序类

实例是面向对象编程的基础。静态方法是未在任何实例变量中传递的方法。这样,如果将静态方法和静态变量移到单个实用程序类中,则可以查看其余的属性和变量,并开始创建较小的单一职责对象。

但是,实用程序类并不是特别面向对象的。处理完静态方法后,请考虑将系统中的实用程序类分解为更面向对象的东西。但是,设计中的一些实用程序类比上帝对象要少很多问题。

4.分组通用方法和属性

此时,上帝对象中保留有实例变量和实例方法。将它们重构为对象。使用继承,聚合和关联等通用的面向对象原则来表达您创建的对象之间的关系。同时,请遵守Demeter定律,以确保您仍然拥有松散耦合的系统。

5.删除或弃用上帝的对象

如果成功重构了God对象,请从设计中删除该组件。该系统应以与以前相同的方式运行。

完成此步骤后,请随时引用弗里德里希·尼采的话:“上帝已经死了”

删除God对象后,如果在客户端和子组件代码中创建了编译问题,请不要担心。您可以将God对象更改为接口,或者至少将其转换为没有实例变量的Facade对象。然后,God对象中的方法将工作简单地委派给各种实用程序类,并在重构God对象时创建较小的对象。

如果您确实采用立面方法,请确保将每个方法都标记为已弃用,以便将来的开发知道调用分解后的对象,而不是上帝对象本身。

回顾重构上帝对象的五个步骤

请遵循以下五个步骤来反转上帝对象反模式:

  1. 构建一个全面的单元测试套件。
  2. 确定最依赖上帝的对象组件。
  3. 将静态方法移到实用程序类中。
  4. 对常用方法和属性进行分组,但要保持松散耦合的系统。
  5. 从系统设计中删除God对象。

              

猜你喜欢