返回
搬移函数:重构之道中的类型重构
前端
2023-09-09 21:10:19
重构之道:有品位的代码(五)——搬移特性
在之前探讨的重构技巧中,我们主要关注如何新建、移除或重命名程序元素。但重构不仅仅限于此,类型的重构 也是至关重要的。
类型重构主要关注在不同上下文之间搬移元素,其中搬移函数 手法便是将函数在类与其他模块之间搬移的利器。
为什么要搬移函数?
函数搬移可以带来许多好处:
- 分离关注点: 将函数从一个模块移动到另一个模块,可以将不同关注点的代码分开,提高代码的可读性和可维护性。
- 提高可重用性: 函数的搬移可以使其在不同的模块中重复使用,减少代码重复和维护成本。
- 简化类结构: 将非核心功能的函数从类中移出,可以简化类的结构,使其专注于其主要职责。
如何搬移函数?
搬移函数需要遵循以下步骤:
- 确定要搬移的函数: 识别需要移动的函数,并考虑将其移动到哪个模块。
- 创建新模块或更新现有模块: 如果目标模块不存在,则需要创建它。否则,需要更新现有的模块以接收搬移的函数。
- 将函数移到新模块: 将函数从源模块剪切或复制到目标模块。
- 更新函数调用: 确保在源模块中更新函数调用,以便它们指向新位置。
- 重构相关依赖项: 如果搬移的函数依赖于其他类或模块,则需要重构这些依赖项以反映函数的新位置。
搬移函数的技巧
- 尽量搬移私有函数: 私有函数对类之外的代码不可见,因此搬移它们不会影响其他模块。
- 考虑职责边界: 函数的职责应与其所在模块的职责一致。
- 保持代码一致性: 确保搬移后的函数与目标模块的代码风格和命名约定一致。
- 单元测试搬移后的代码: 搬移函数后,运行单元测试以验证代码仍然按预期工作。
案例
我们以一个示例来说明如何搬移函数:
// 源模块: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
函数,我们分离了创建用户和发送通知的关注点,提高了代码的可维护性。