文章列表
第三章 代码中的坏味道
- 博客分类:
- 重构
一、Duplicated Code(重复代码)
1、同一个类中的两个函数含有相同表达式。采用Extract Method提炼出重复的代码。
2、两个互为兄弟的子类内含有重复表达式。对每个类都使用Extract Method提炼出重复的代码,然后在对被提炼出的代码使用Pull Up Method,将它推入父类中。如果两个兄弟类中的代码只是类似而非相同时,使用Extract Method将类似部分的相同部分和不同部分分别提炼为两个函数,使用Form Template Method(模板设计模式)。如果有些函数以不同的算法做相同的事,可以选择其中较清晰的一个,并使用Substitute Algorit ...
一、适用范围
过长的函数或者一段需要注释才能让人理解用途的代码应该被独立构造为一个函数。
二、既得利益
1、函数的粒度减小,函数被复用的机会更大。
2、函数的粒度减小,函数覆写也会更容易。
三、做法
1、创造一个函数,并以它的意图命名(以它做什么而不是怎样做命名)
2、将提炼出的代码从源函数赋值到目标函数中。
3、找出提炼出的代码中使用的源函数中的局部变量和源函数的参数。
4、检查是否有仅用于被提炼代码段的临时变量。如果有,在目标函数中声明为临时变量。
5、检查被提炼代码段,是否有局部变量的值被它改变。如果一个临时变量值被修改了,看看是否可以将被提炼代码段处理为一 ...
一、相关概念
1、循环变量:随循环的每次运行而改变的变量 for(User u:userList) 中的u。
2、结果收集变量:负责将“通过整个函数的运算”而构成的某个值手机起来。作用通常是累加、字符串接合、写入流或者向集合中添加元素。
二、适用范围
1、除了循环变量、结果手机变量之外,还有很多临时变量用于保存一段冗长代码的运算结果,以便稍后使用。如果这样的变量被赋值超过一次,就意味着承担了一个以上的责任。如果一个变量承担了一个以上的责任,它就应该被替换为多个临时变量,每个变量只承担一个责任,每个变量只承担一个责任。
三、既得利益
一个变量只承担一种责任,会是代码更清晰。 ...
一、动机
临时变量时暂时的,只能在所属函数内使用,所以它们会驱使你写出更长的函数。
将临时变量替换为一个查询,那么同一个类中的所有函数豆浆可以获得这份信息,是你能够为这个类编写更清晰的代码。
二、做法
1、找出只被赋值一次的临时变量
2、将该临时变量声明为final
3、将“对该临时变量赋值”之语句的等号右侧部分提炼到一个独立函数中。
4、在该临时变量身上实施Inline Temp。
一、动机
多半作为Replace Temp with Query的一部分使用。
二、做法
1、检查给临时变量赋值的语句,确保等号右侧的表达式没有副作用。
2、将此临时变量声明为final
3、找到该临时变量的所有引用点,将它们替换为临时变量赋值的表达式。
4、修改为所有引用点后,删除该临时变量的声明和赋值语句。
public void toCoin(ModelMap modelMap, String Id, int startIndex,
HttpServletRequest request) {
// 根据手机号获取会员id
String phone = request.getParameter("phone");
// Id = "";
if (!("".equals(phone) || phone == "") && (Id == "" || "&q ...
package com.angus.learn.list;
public class MyLinkedList<T> {
// private Node<T>[] nodes;
private int size;
private Node<T> head;
private Node<T> tail;
private Node<T> current;
// private double increamentRate;
// protected static final double DEFAULT_INCREAMEN ...