《重构:改善既有的代码设计》读书笔记


《重构:改善既有代码的设计》之于重构就相当于韵谱之于作诗。一个翻着韵书作诗的诗人一定是蹩脚的,但好的诗人却要对那109个韵部了然于胸;同样,一个好的程序员要求能够主动自然地重构代码,虽不应翻着重构手册干活,但需对《重构:改善既有代码的设计》中提到的70多个重构方法成竹在胸。然而,在达到这一境界之前,需要不断的实践和经验积累,并且要先读读Fowler的这《重构:改善既有代码的设计》。它在本质上是向我们推荐了一种优秀的编程习惯和编程态度。在领会这种重要思想的同时,我们也应该培养一种精益求精的工作态度,探索一条更适合自己的重构道路。

最后郑重推荐,这是一部软件开发的不朽经典,生动阐述重构原理和具体做法,是普通程序员进阶到编程高手必须修炼的秘笈。

重构:改善既有代码的设计 中文PDF清晰版+源代码 下载见

(一):重新组织自己的函数
  问题:过长函数(Long Method) 往往需要我们通过手法提炼函数(Extract Method),把一段代码从原函数里面提炼出一段代码放入一单独函数中。遇到的问题主要有
  临时变量问题(Temp variable matter) 和参数问题(Parameter matter),
  (1)、在处理临时变量问题时我们提供(replace temp with query)去掉一些临时变量。如果很多地方用到这个临时变量,
  可以是用Split temporary variable,将它变得容易替换,如果临时变量太乱,可以引入Replace Method with Method Object代价是引入新的class。
  (2)、处理参数使用remove Assignments to parameters。
  最后函数分解以后使用Substitute Algorithm引入更清晰的算法
  做法:在Extract Method 关键是要在函数名称和函数体之间的语义距离,强化代码的清晰度。一下是Exctract Method的三种实例
  1) 没有局部变量,直接提炼。2) 有局部变量,把这个局部变量作为参数传入被提炼函数 3)如果需要对局部变量赋值,得需要使用remove Assignments to parameters
  如果被赋值的局部变量只在被提炼的函数中被赋值,则把这个局部变量声明到被提炼函数中。如果被赋值的局部变量需要在被提炼的函数其它的地方使用,则需要被提炼
  函数返回一个被修改后的值。如果遇到返回的不止一个值,则最好的方法是再重新提炼一个新的方法,每次只返回一个值最佳。
  (1)Inline Temp
  如果有一个临时变量,只被一个简单的表达式赋值过一次。重构手法,将所有对该变量的引用动作,替换为对它赋值的那个表达式
  double price = anOrder*basePrice();
  return price>1000
  替换=》 return anOrder*basePrice()>1000;
  (2)Replace Temp with Query
    一个临时变量保存了一个表达式的结果,需要把这个表达式提炼到一个独立函数里,在所以应用到这个临时变量的地方替换为一个新函数的调用。
      double basePrice = _quantity*_item;
      if (basePrice>1000){
      return basePrice*0.95;
      } else {
      return basePrice*0.98;
      }
      替换=》
      public  basePrice(){
      return _quantity*_item;
      }
   
      if (basePrice()>1000) {
      return basePrice*0.95
      } else {
      return basePrice*0.98;
      }
    (3) Introduce Explaining Variable
  将复杂表达式的结果放入一个临时变量里面,以此变量名来解释表达式用途
      if(platform.toUpperCase().indexOf("MSC")>-1 && browers.toUpperCase.indexOf("IE")>-1 && size()>0){...}
      替换=》
      final boolean isMSC = platform.toUpperCase().indexOf("MSC");
      final boolean isBrowsers = browers.toUpperCase.indexOf("IE");
      final boolean isResize = size()>0;
      if(isMSC && isBrowsers && isResize){...}。
      这个也可以使用Replace Temp with Query来重构
      public boolean isMSC(){retrun platform.toUpperCase().indexOf("MSC");}
      public boolean isBrowsers(){browers.toUpperCase.indexOf("IE");}
      public boolean isResize(){size()>0}
      if(isMSC() && isBrowsers() && isResize()){...}
    (4) Split Temporary Variable 解剖临时变量
    在程序中临时变量超过一次,它既不是循环变量,也不是集中临时变量。则每次给临时变量赋值,创造一个独立的,对应的临时变量
    double temp = 2*(width+height);
    System.out.println(temp);
    temp = width*height;
    System.out.println(temp);
    替换=》
    final double perimeter = 2*(width+height);
    System.out.println(perimeter);
    final double area = widht * height;
    System.out.println(area);
    final 关键字的作用是让这两个变量只被赋值一次
    (5) Remove Assignments Parameters
  对一个参数进行赋值操作,以一个临时变量来取代该参数的位置
  int disCount(int nInput, int quantity){
    if (nInput>50){
    nInput -= 2;
    }
  替换=》
  int disCount(int nInput, int quantity){
    int result = nInput;
    if (nInput>50){
    result -=2;
    }
  }
  (6) Replace Mehtod with Method Object
  将所有的局部变量都变成函数对象(Mehtod Class)的值域(Field)。然后你就可以对这个新的对象使用Extract Method 来创造新的函数
  (7) Substitute Algorithm(替换算法)
  String findPersion(String[] persion){
    for (int i = 0; i<persion.length; i++){
    if(persion[i].equals("Don")){
      return "Don";
    }
   
    if(persion[i].equals("John")){
      return "John";
    }
   
    if(persion[i].equals("Kent")){
      return "Kent";
    }
    }
  }
  替换=》
  String findPersion(String[] persion){
    List<String> perList = Arrays.asList(new String[]{"Don","John","Kent"});
    for (int i = 0; i<persion.length; i++){
    if(perList.containts(persion[i])){
      return persion[i];
    }
    }
    return "";
  }

更多详情见请继续阅读下一页的精彩内容:

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 下一页

相关内容

    暂无相关文章