重构手法之Extract Method(提炼函数)

2,376 阅读1分钟

提炼函数是最常用的重构手法之一。 常用于以下场景:

  1. 函数过长
  2. 逻辑过于复杂,让人无法直接理解其意图 要点:
  3. 处理临时变量 用查询代替临时变量本身 太过复杂的时候,使用“Replaca Method With Method Object”
  4. 处理参数
  • 不要在函数内赋值,如果这样子做了,请使用“Remove Assignments to Parameters”,逻辑清晰后,可以进一步优化算法。

  • 实现方式

  1. 以该处的作用为这个新函数命名(如果想不出名字,请不要动它)
  2. 检查有无作用域仅存原函数的变量
  3. 检查有无“仅用于被提炼代码段的”临时变量,在目标函数中声明为临时变量。
  4. 如果代码段中有局部函数被赋值了,尝试将新函数处理为一个查询函数,在流程结束之后Return给局部变量。
  • 修改前
public static void main(String[] args) {
    BookDaoImpl bookDao = new BookDaoImpl();
    List<Book> books = bookDao.getAllBook();
    for (Book book : books) {
      System.out.println("输出信息:");
      System.out.println("bookName:" + book.getBookName());
      System.out.println("bookNum:" + book.getBookName());
    }
  }
  • 修改后
public class Main {

  public static void main(String[] args) {
    BookDaoImpl bookDao = new BookDaoImpl();
    List<Book> books = bookDao.getAllBook();
    for (Book book : books) {
      Main main = new Main();
      main.printBookDetail(book);
    }
  }

  public void printBookDetail(Book book) {
    System.out.println("输出信息:");
    System.out.println("bookName:" + book.getBookName());
    System.out.println("bookNum:" + book.getBookName());
  }
}

有赋值的情况

  • 修改前
public static void main(String[] args) {
    BookDaoImpl bookDao = new BookDaoImpl();
    List<Book> books = bookDao.getAllBook();
    double allPrice = 0;
    for (Book book : books) {
      allPrice += book.getPrice();
    }
  }
  • 修改后
public class Main {

  public static void main(String[] args) {
    BookDaoImpl bookDao = new BookDaoImpl();
    Main main = new Main();
    double allPrice = 0;
    allPrice = main.getAllPrice(bookDao);
  }


  double getAllPrice(BookDao bookDao) {
    List<Book> books = bookDao.getAllBook();
    double out = 0;
    for (Book book : books) {
      out += book.getPrice();
    }
    return out;
  }
}