重构手法——函数行为重塑类 | 函数签名 | 重命名

100 阅读5分钟

简介

“Rename Function”是一种重构技术,用于修改函数或方法的名称,使其更能准确地反映其功能或目的。通过重命名函数,可以提高代码的可读性和可维护性,让其他开发人员更容易理解代码的意图,避免产生混淆。

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

  • 函数或方法名称不清晰:当函数或方法的名称不能准确描述其功能,或者名称过于模糊、笼统,导致难以理解其作用时,需要使用该重构技术。
  • 函数或方法名称不符合命名规范:如果函数或方法的名称不符合团队或项目的命名规范,也可以使用该技术进行重命名。

Rename Function 的详细步骤

  1. 分析函数或方法的功能
    • 仔细研究函数或方法的实现:查看函数内部的代码,明确其具体功能和目的。
    • 考虑函数的上下文:了解函数在整个程序中的作用,以及它与其他代码的交互方式。
  2. 选择新的名称
    • 选择一个具有描述性的名称:根据函数的功能和目的,为其取一个能够清晰表达其功能的新名称。
    • 遵循命名规范:确保新名称符合团队或项目的命名规范,如使用驼峰命名法、使用有意义的词汇等。
  3. 修改函数或方法的声明
    • 在函数或方法的声明处将旧名称替换为新名称:在函数或方法的定义处修改其名称。
    • 确保函数或方法的签名完整:除了名称外,函数或方法的参数列表和返回值类型保持不变。
  4. 更新函数或方法的调用处
    • 查找所有调用该函数或方法的位置:在整个代码库中找出调用该函数或方法的代码。
    • 将旧名称替换为新名称:在调用处将原函数或方法的名称修改为新名称。
    • 确保调用的正确性:修改后,检查代码是否能正常编译和运行。
  5. 测试
    • 编译代码:确保代码编译通过,没有任何语法错误。
    • 运行测试:运行现有的单元测试,确保重命名操作没有引入新的错误。如果没有单元测试,编写相应的测试用例进行测试。
    • 手动测试:对于涉及用户界面或外部系统交互的函数,进行手动测试,确保功能的正确性。
  6. 代码审查
    • 同行评审:请同事或其他团队成员审查代码,确保重命名操作符合代码质量和可维护性标准。
    • 文档更新:如果有相关的文档,更新文档中关于该函数或方法的描述,包括新的名称。

示例

假设我们有一个简单的 Java 类,其中包含一个 func 方法,该名称不够清晰,我们希望对其进行重命名。

public class FunctionRenamer {
    public void func(int value) {
        System.out.println("The value is: " + value);
    }
}

以下是使用“Rename Function”技术的步骤:

  1. 分析函数或方法的功能:
    • 该函数的功能是打印传入的值,因此可以考虑更具描述性的名称。
  2. 选择新的名称:
    • 选择 printValue 作为新名称,因为它更清晰地表达了函数的功能。
  3. 修改函数或方法的声明:
    • func 改为 printValue
        public class FunctionRenamer {
           public void printValue(int value) {
              System.out.println("The value is: " + value);
           }
        }
      
  4. 更新函数或方法的调用处:
    • 在调用该函数的地方将 func 替换为 printValue
        public class Main {
           public static void main(String[] args) {
              FunctionRenamer renamer = new FunctionRenamer();
              renamer.printValue(42);
           }
        }
      
  5. 测试:
    • 编译代码,确保代码编译通过。
    • 运行测试,确保函数能正确打印传入的值。
    • 进行手动测试,确认功能正常。
  6. 代码审查:
    • 请同事检查代码,确保代码可读性得到提升。
    • 更新文档,说明函数已重命名为 printValue

练习

基础练习题

  1. 简单重命名
    • 对于以下 Java 代码,将 compute 方法重命名为 calculateSum,该方法用于计算两个数的和。
        public class Calculator {
           public int compute(int a, int b) {
              return a + b;
           }
        }
      
  2. 遵循命名规范重命名
    • 对于以下 Java 代码,将 get_price 方法重命名为 getPrice,该方法用于获取产品的价格。
        public class Product {
           public double get_price() {
              return 10.0;
           }
        }
      

进阶练习题

  1. 复杂函数重命名
    • 在以下 Java 代码中,将 process 方法重命名为 processUserData,该方法处理用户数据。
        public class UserDataProcessor {
           public void process(int[] data) {
              for (int value : data) {
                 System.out.println(value);
              }
           }
        }
      
  2. 重命名与功能理解
    • 对于以下 Java 代码,将 doSomething 方法重命名为 validateUserInput,该方法验证用户输入是否合法。
        public class InputValidator {
           public boolean doSomething(String input) {
              if (input.length() > 0) {
                 return true;
              } else {
                 return false;
              }
           }
        }
      

综合拓展练习题

  1. 多模块重命名
    • 考虑一个 Java 订单系统,包含 OrderServiceProductService 类。在 OrderService 类中,将 placeOrder 方法重命名为 submitOrder,在 ProductService 类中,将 getProductInfo 方法重命名为 fetchProductDetails
        public class OrderService {
         public void placeOrder(Product product, int quantity) {
            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 getProductInfo(int productId) {
            System.out.println("Getting product info for id: " + productId);
            return new Product("Sample Product");
         }
      }
      
  2. 代码审查模拟
    • 完成上述多模块重命名的操作后,模拟一份代码审查报告,指出重命名后的优点和可能存在的潜在问题.