重构手法——对象结构优化类 | 集成体系重构 | 将函数合并到类中

简介

"将函数合并到类中"(Combine Functions into Class)是一种重构手法,它的目的是将一组功能相关的函数组织到一个类中,以提高代码的内聚性和可维护性。这种重构手法有助于将分散的功能进行集中管理,使代码结构更加清晰,避免功能的碎片化,便于理解和维护。

针对的症状(代码坏味道)

  • 分散的函数(Scattered Functions):多个函数在不同的类或模块中执行相似或相关的操作,但没有被合理地组织在一起,导致代码逻辑分散。
  • 低内聚性(Low Cohesion):代码的功能被分散在多个类或模块中,使得代码的内聚性降低,难以理解其整体功能。
  • 功能关联不明确:一些函数虽然功能相关,但它们的关联关系不明显,因为它们分散在不同的位置,导致代码的可读性和可维护性变差。

将函数合并到类中(Combine Functions into Class)的详细步骤

  1. 识别相关函数
    • 寻找功能相关的函数:分析代码库,找出那些执行相似或相关操作的函数,例如处理同一业务领域的函数,或者对同一组数据进行操作的函数。
    • 确定共同的职责:确定这些函数的共同职责或功能范围,以便将它们放入一个统一的类中。
  2. 创建新类
    • 选择合适的类名:为新类选择一个能够准确描述这些函数共同功能的名称,以反映它们的职责。
    • 定义类的属性:根据这些函数所操作的数据或依赖的资源,确定类需要的属性。
    • 确保类的单一职责原则:新类应该遵循单一职责原则,只负责一个主要的功能领域。
  3. 迁移函数
    • 将识别出的函数迁移到新类中:将这些函数从原来的类或模块中移到新创建的类中。
    • 调整函数的参数和返回值:根据新类的属性和结构,调整函数的参数和返回值,使其能够在新类中正确工作。
    • 处理依赖关系:将函数中涉及的外部依赖转换为新类的属性或通过构造函数注入,避免直接依赖外部类或模块。
  4. 替换原始调用
    • 在原始调用处使用新类的实例:在原来调用这些函数的地方,使用新类的实例来调用迁移后的函数。
    • 确保调用正确:验证新类的实例调用函数的方式正确,不会影响原有的功能。
  5. 测试
    • 编译代码:确保代码编译通过,没有任何语法错误。
    • 运行测试:运行所有相关的单元测试,确保重构操作没有引入新的错误。
    • 手动测试:如果有必要,进行手动测试以验证功能的正确性。
  6. 代码审查
    • 同行评审:让同事或其他团队成员审查你的更改,确保代码质量和可维护性得到提升。
    • 文档更新:如果项目有维护文档的习惯,记得更新相关文档,说明重构的影响。

示例

假设有以下 Java 代码,其中有一些分散的函数处理用户相关的操作:

java 复制代码
class UserUtils {
    public static String formatUserFullName(String firstName, String lastName) {
        return firstName + " " + lastName;
    }
}

class UserAuthentication {
    public static boolean authenticate(String username, String password) {
// 假设这里有一些认证逻辑
        return username.equals("admin") && password.equals("admin");
    }
}

步骤如下:

  1. 识别相关函数:

    • UserUtils.formatUserFullNameUserAuthentication.authenticate 都与用户操作相关。
  2. 创建新类:

    • 创建一个名为 UserService 的新类,将这些函数整合进去。

      java 复制代码
        class UserService {
           public String formatUserFullName(String firstName, String lastName) {
              return firstName + " " + lastName;
           }
      
           public boolean authenticate(String username, String password) {
        // 假设这里有一些认证逻辑
              return username.equals("admin") && password.equals("admin");
           }
        }
  3. 迁移函数:

    • UserUtils.formatUserFullNameUserAuthentication.authenticate 函数移到 UserService 类中。
  4. 替换原始调用:

    • 原来调用这些函数的地方,使用 UserService 类的实例进行调用。

      java 复制代码
        public class Main {
            public static void main(String[] args) {
                UserService userService = new UserService();
                String fullName = userService.formatUserFullName("John", "Doe");
                boolean isAuthenticated = userService.authenticate("admin", "admin");
            }
        }
  5. 测试:

    • 编译代码,确保代码编译通过。
    • 运行测试:运行所有相关的单元测试,确保重构操作没有引入新的错误。
    • 手动测试:手动调用 UserService 类的方法,验证功能的正确性。
  6. 代码审查:

    • 让同事审查代码,确保代码的内聚性得到提升,且没有引入新的问题。

练习

基础练习题

  1. 合并订单处理函数

    • 给定以下 Java 代码,OrderUtils 类和 OrderManager 类中都有一些与订单处理相关的函数,但它们分散在不同的类中。请将它们合并到一个新类中。

      java 复制代码
        class OrderUtils {
          public static double calculateOrderTotal(double price, int quantity) {
              return price * quantity;
          }
      }
      
      class OrderManager {
          public static void processOrder(double total) {
              System.out.println("Processing order with total: " + total);
          }
      }
  2. 整合支付处理函数

    • 以下是 PaymentGateway 类和 PaymentProcessor 类中的函数,它们都与支付处理相关。请将它们合并到一个新类中。

      java 复制代码
      class PaymentGateway {
         public static boolean validatePayment(String cardNumber) {
            // 假设这里有一些验证逻辑
            return cardNumber.startsWith("1234");
         }
      }
      
      class PaymentProcessor {
         public static void processPayment(String cardNumber) {
            if (PaymentGateway.validatePayment(cardNumber)) {
               System.out.println("Payment processed successfully.");
            } else {
               System.out.println("Payment validation failed.");
            }
         }
      }

进阶练习题

  1. 合并复杂业务逻辑函数

    • 在以下 Java 代码中,InventoryManager 类和 StockUpdater 类有与库存管理相关的函数。将它们合并到一个新类中,并处理好依赖关系和参数调整。

      java 复制代码
        class InventoryManager {
         public static int checkStockLevel(String productId) {
            // 假设这里有一些库存检查逻辑
            return 10;
         }
      }
      
      class StockUpdater {
         public static void updateStock(String productId, int quantity) {
            System.out.println("Updating stock for product " + productId + " by " + quantity);
         }
      }
  2. 整合数据处理函数

    • 考虑 DataParser 类和 DataValidator 类中的函数,它们都与数据处理和验证相关。将它们合并到一个新类中,并确保新类遵循单一职责原则。

      java 复制代码
        class DataParser {
         public static String parseData(String rawData) {
            // 假设这里有一些解析逻辑
            return "Parsed data";
         }
      }
      
      class DataValidator {
         public static boolean validateData(String data) {
            // 假设这里有一些验证逻辑
            return data.contains("valid");
         }
      }

综合拓展练习题

  1. 多模块函数合并与优化
    • 假设有一个简单的电子商务系统,其中有 ProductService 类、ProductCatalog 类和 ProductReview 类,它们包含了与产品相关的函数,如产品信息的获取、产品目录的管理和产品评论的处理。

    • 请将这些类中的相关函数合并到一个新类中,命名为 ProductManagementService

    • 模拟一份代码审查报告,指出重构后的优点和可能存在的潜在问题。

      java 复制代码
        class ProductService {
         public static Product getProductById(int id) {
            // 假设这里有一些获取产品的逻辑
            return new Product();
         }
      }
      
      class ProductCatalog {
         public static void addProduct(Product product) {
            // 假设这里有一些添加产品到目录的逻辑
         }
      }
      
      class ProductReview {
         public static void addReview(Product product, String review) {
            // 假设这里有一些添加评论的逻辑
         }
      }

在这个重构过程中,我们将这些分散的函数合并到一个类中,以提高代码的内聚性和可维护性,同时需要注意保持代码的清晰性和遵循单一职责原则。

相关推荐
笑傲菌14 分钟前
【编程二三事】初识Channel
后端
倔强青铜三26 分钟前
🚀LlamaIndex中文教程(1)----对接Qwen3大模型
人工智能·后端·python
小码编匠31 分钟前
基于 SpringBoot 开源智碳能源管理系统(EMS),赋能企业节能减排与碳管理
java·后端·开源
知其然亦知其所以然34 分钟前
Spring AI:ChatClient API 真香警告!我用它把聊天机器人卷上天了!
后端·aigc·ai编程
天天摸鱼的java工程师44 分钟前
彻底掌握Java Stream:覆盖日常开发90%场景附代码
后端
前端付豪1 小时前
美团路径缓存淘汰策略全解析(性能 vs 精度 vs 成本的三难选择)
前端·后端·架构
盛夏绽放2 小时前
Flask 中 make_response 与直接返回字符串的深度解析
后端·python·flask
Android洋芋2 小时前
Android开发实战:深度解析讯飞TTS原生库缺失崩溃问题及多引擎回退机制(附完整修复方案)
后端
Android洋芋2 小时前
Android平台TTS开发实战:从初始化失败到企业级优化的完整指南
后端
lovebugs2 小时前
百万并发下的生存之道:Java秒杀系统架构设计全解析
java·后端·架构