重构手法——函数行为重塑类 | 函数签名 | 删除参数

114 阅读5分钟

简介

“Remove Parameter”是一种重构技术,主要用于从函数或方法的参数列表中删除不再需要的参数。通过删除不必要的参数,可以简化函数或方法的签名,提高代码的简洁性和可维护性,避免传递多余的信息,使函数或方法的使用更加清晰和直观。

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

  • 多余的参数:当函数或方法的参数列表中包含不再使用的参数时,这些参数可能是由于之前的功能变更或重构遗留下来的,会增加代码的复杂性和理解难度。
  • 过于复杂的签名:参数列表过长且部分参数对于函数的核心功能不再必要,导致函数或方法的调用变得繁琐,容易混淆。

Remove Parameter 的详细步骤

  1. 识别要删除的参数
    • 检查函数或方法的内部实现:仔细查看函数或方法的代码,找出哪些参数在函数内部没有被使用,或者已经不再需要用于实现函数的功能。
    • 考虑函数的功能和调用:分析函数的主要功能,确认要删除的参数是否确实对该功能没有贡献。
  2. 修改函数或方法的声明
    • 从函数或方法的参数列表中删除该参数:将不需要的参数从参数列表中移除。
    • 确保函数或方法的签名更新:在函数或方法的声明处删除相应的参数。
  3. 调整函数或方法的内部实现
    • 检查函数内部的逻辑:确保删除参数后,函数内部的逻辑仍然正确运行,不依赖于已删除的参数。
    • 清理不必要的代码:删除与已删除参数相关的任何代码,如对该参数的引用、基于该参数的条件判断等。
  4. 更新函数或方法的调用处
    • 找到所有调用该函数或方法的地方:在整个代码库中找出调用该函数或方法的代码位置。
    • 删除调用处的相应参数:在调用该函数或方法时,删除传递给已删除参数的参数值。
    • 确保函数调用的正确性:修改调用后,检查代码是否仍然能正常运行。
  5. 测试
    • 编译代码:确保代码编译通过,没有任何语法错误。
    • 运行测试:运行现有的单元测试,确保删除参数的操作没有引入新的错误。如果没有单元测试,编写相应的测试用例进行测试。
    • 手动测试:对于涉及用户界面或外部系统交互的函数,进行手动测试,确保功能的正确性。
  6. 代码审查
    • 同行评审:请同事或其他团队成员审查代码,确保删除参数的操作符合代码质量和可维护性标准。
    • 文档更新:如果有相关的文档,更新文档中关于该函数或方法的描述,包括更新后的签名。

示例

假设我们有一个简单的 Java 类,其中包含一个 printMessage 方法,该方法接收两个参数,但其中一个参数 extraInfo 不再使用。

public class MessagePrinter {
   public void printMessage(String message, String extraInfo) {
      System.out.println(message);
   }
}

以下是使用“Remove Parameter”技术的步骤:

  1. 识别要删除的参数:
    • printMessage 方法中,extraInfo 参数未被使用,因此可以考虑删除。
  2. 修改函数或方法的声明:
    • printMessage 方法的参数列表中删除 extraInfo 参数。
        public class MessagePrinter {
           public void printMessage(String message) {
        // 函数内部逻辑将不再依赖于已删除的参数
           }
        }
      
  3. 调整函数或方法的内部实现:
    • 由于 extraInfo 未被使用,无需修改内部逻辑。
        public class MessagePrinter {
         public void printMessage(String message) {
            System.out.println(message);
         }
      }
      
  4. 更新函数或方法的调用处:
    • 在调用 printMessage 的地方删除 extraInfo 参数。
        public class Main {
           public static void main(String[] args) {
              MessagePrinter printer = new MessagePrinter();
              printer.printMessage("Hello, World!");
           }
        }
      
  5. 测试:
    • 编译代码,确保代码编译通过。
    • 运行测试,确保消息能正确打印,不受参数删除的影响。
    • 进行手动测试,确认功能正常。
  6. 代码审查:
    • 请同事检查代码,确保代码可读性和可维护性得到提升。
    • 更新文档,说明 printMessage 方法删除了 extraInfo 参数。

练习

基础练习题

  1. 简单参数删除
    • 对于以下 Java 代码,在 calculateArea 方法中删除 unusedParam 参数。
        public class AreaCalculator {
           public double calculateArea(double length, double width, int unusedParam) {
              return length * width;
           }
        }
      
  2. 参数删除与内部调整
    • 对于以下 Java 代码,在 validateUser 方法中删除 oldValidationMethod 参数,并调整内部逻辑(假设之前使用该参数进行旧的验证逻辑,现在不再需要)。
        public class UserValidator {
            public boolean validateUser(int age, boolean oldValidationMethod) {
                if (oldValidationMethod) {
                    return age >= 21;
                } else {
                    return age >= 18;
                }
            }
        }
      

进阶练习题

  1. 复杂函数的参数删除

    • 在以下 Java 代码中,在 processData 方法中删除 unnecessaryData 参数,并确保内部逻辑正确。
        import java.util.ArrayList;
      import java.util.List;
      
      public class DataProcessor {
         public List<Integer> processData(List<Integer> dataList, String unnecessaryData) {
            List<Integer> result = new ArrayList<>();
            for (int num : dataList) {
               result.add(num);
            }
            return result;
         }
      }
      
  2. 多参数删除与代码调整

    • 对于以下 Java 代码,在 calculatePrice 方法中删除 discountCodeextraInfo 参数,并根据需要调整内部逻辑。
          public class PriceCalculator {
       public double calculatePrice(double basePrice, String discountCode, String extraInfo) {
          if (discountCode.equals("SUMMER_SALE")) {
             return basePrice * 0.8;
          } else {
             return basePrice;
          }
       }
    }
    

综合拓展练习题

  1. 多模块参数删除

    • 考虑一个 Java 订单系统,包含 OrderServiceProductService 类。在 OrderService 类的 placeOrder 方法中删除 oldOrderId 参数。在 ProductService 类的 getProduct 方法中删除 obsoleteParam 参数。
     public class OrderService {
        public void placeOrder(Product product, int quantity, int oldOrderId) {
            System.out.println("Placing order for " + quantity + " of " + product.getName());
        }
    }
    
    public class Product {
        private String name;
    
        public Product(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    
    public class ProductService {
        public Product getProduct(int productId, String obsoleteParam) {
            System.out.println("Getting product with id: " + productId);
            return new Product("Sample Product");
        }
    }
    
  2. 代码审查模拟

    • 完成上述多模块参数删除的操作后,模拟一份代码审查报告,指出删除参数后的优点和可能存在的潜在问题.