提炼函数是最常用的重构手法之一。 常用于以下场景:
- 函数过长
- 逻辑过于复杂,让人无法直接理解其意图 要点:
- 处理临时变量 用查询代替临时变量本身 太过复杂的时候,使用“Replaca Method With Method Object”
- 处理参数
-
不要在函数内赋值,如果这样子做了,请使用“Remove Assignments to Parameters”,逻辑清晰后,可以进一步优化算法。
-
实现方式
- 以该处的作用为这个新函数命名(如果想不出名字,请不要动它)
- 检查有无作用域仅存原函数的变量
- 检查有无“仅用于被提炼代码段的”临时变量,在目标函数中声明为临时变量。
- 如果代码段中有局部函数被赋值了,尝试将新函数处理为一个查询函数,在流程结束之后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;
}
}