返回

搬移函数:重构之道中的类型重构

前端

重构之道:有品位的代码(五)——搬移特性

在之前探讨的重构技巧中,我们主要关注如何新建、移除或重命名程序元素。但重构不仅仅限于此,类型的重构 也是至关重要的。

类型重构主要关注在不同上下文之间搬移元素,其中搬移函数 手法便是将函数在类与其他模块之间搬移的利器。

为什么要搬移函数?

函数搬移可以带来许多好处:

  • 分离关注点: 将函数从一个模块移动到另一个模块,可以将不同关注点的代码分开,提高代码的可读性和可维护性。
  • 提高可重用性: 函数的搬移可以使其在不同的模块中重复使用,减少代码重复和维护成本。
  • 简化类结构: 将非核心功能的函数从类中移出,可以简化类的结构,使其专注于其主要职责。

如何搬移函数?

搬移函数需要遵循以下步骤:

  1. 确定要搬移的函数: 识别需要移动的函数,并考虑将其移动到哪个模块。
  2. 创建新模块或更新现有模块: 如果目标模块不存在,则需要创建它。否则,需要更新现有的模块以接收搬移的函数。
  3. 将函数移到新模块: 将函数从源模块剪切或复制到目标模块。
  4. 更新函数调用: 确保在源模块中更新函数调用,以便它们指向新位置。
  5. 重构相关依赖项: 如果搬移的函数依赖于其他类或模块,则需要重构这些依赖项以反映函数的新位置。

搬移函数的技巧

  • 尽量搬移私有函数: 私有函数对类之外的代码不可见,因此搬移它们不会影响其他模块。
  • 考虑职责边界: 函数的职责应与其所在模块的职责一致。
  • 保持代码一致性: 确保搬移后的函数与目标模块的代码风格和命名约定一致。
  • 单元测试搬移后的代码: 搬移函数后,运行单元测试以验证代码仍然按预期工作。

案例

我们以一个示例来说明如何搬移函数:

// 源模块:UserService
public class UserService {
    public void createUser(User user) {
        // 创建用户逻辑
        sendEmailNotification(user);  // 发送邮件通知
    }

    private void sendEmailNotification(User user) {
        // 发送邮件逻辑
    }
}

// 目标模块:NotificationService
public class NotificationService {
    public void sendEmailNotification(User user) {
        // 发送邮件逻辑
    }
}

在这个示例中,sendEmailNotification 函数与 UserService 的职责不一致。因此,将其移动到 NotificationService 更合适。

// 搬移后的 UserService
public class UserService {
    public void createUser(User user) {
        // 创建用户逻辑
        NotificationService.sendEmailNotification(user);  // 委托发送邮件通知
    }
}
// 搬移后的 NotificationService
public class NotificationService {
    public void sendEmailNotification(User user) {
        // 发送邮件逻辑
    }
}

通过搬移 sendEmailNotification 函数,我们分离了创建用户和发送通知的关注点,提高了代码的可维护性。