对重构的认识

来源:互联网 发布:福建师范大学网络 编辑:程序博客网 时间:2024/04/27 14:42

Martin Fowler的名著《重构》一书中,他把重构定义为:在不改变代码外在行为的前提下对代码做出修改,以改进代码的内部结构的过程。

重构自己代码的目的是让自己的代码能够更好的阅读,也为自己的后期维护带来极大的方便,更有利于团队成员之间的协同工作。

Visual Studio 为程序员提供了“重命名、提取方法、封装字段、提取接口、将局部变量提升为参数、移除参数、重新排序参数”这几种重构方式。就拿提取方法来说,这和复制代码段之后,再写个方法体将其粘贴进去相比,倒方便了不少。

下面看一个示例:

简单的冒泡排序:

Code:
  1. public static void Sort(int[] arr)   
  2.   
  3.         {   
  4.   
  5.             int i, j, temp;   
  6.   
  7.             bool done = false;   
  8.   
  9.             j = 1;   
  10.   
  11.             while ((j < arr.Length) && (!done))//判断长度       
  12.   
  13.             {   
  14.   
  15.                 done = true;   
  16.   
  17.                 for (i = 0; i < arr.Length - j; i++)   
  18.   
  19.                 {   
  20.   
  21.                     if (arr[i] > arr[i + 1])   
  22.   
  23.                     {   
  24.   
  25.                         done = false;   
  26.   
  27.                         temp = arr[i];   
  28.   
  29.                         arr[i] = arr[i + 1];//交换数据       
  30.   
  31.                         arr[i + 1] = temp;   
  32.   
  33.                     }   
  34.   
  35.                 }   
  36.   
  37.                 j++;   
  38.   
  39.             }   
  40.   
  41.         }   
  42.   

简单重构之后:

Code:
  1. public static void Sort(int[] arr)   
  2.   
  3.         {   
  4.   
  5.             int i, j;   
  6.   
  7.             bool done = false;   
  8.   
  9.             j = 1;   
  10.   
  11.             while ((j < arr.Length) && (!done))//判断长度       
  12.   
  13.             {   
  14.   
  15.                 done = true;   
  16.   
  17.                 for (i = 0; i < arr.Length - j; i++)   
  18.   
  19.                 {   
  20.   
  21.                     if (arr[i] > arr[i + 1])   
  22.   
  23.                     {   
  24.   
  25.                         done = false;   
  26.   
  27.                         Swap(ref arr[i],ref arr[i+1]);   
  28.   
  29.                     }   
  30.   
  31.                 }   
  32.   
  33.                 j++;   
  34.   
  35.             }   
  36.   
  37.         }   
  38.   
  39.     
  40.   
  41.         /// <summary>   
  42.   
  43.         /// 交换两个变量的值   
  44.   
  45.         /// </summary>   
  46.   
  47.         /// <param name="m">第一个变量</param>   
  48.   
  49.         /// <param name="n">第二个变量</param>   
  50.   
  51.         private static void Swap(ref int m, ref int n)   
  52.   
  53.         {   
  54.   
  55.             int temp;   
  56.   
  57.             temp = m;   
  58.   
  59.             m = n;   
  60.   
  61.             n = temp;   
  62.   
  63.         }   
  64.   

Bob大叔的比喻非常好:

         重构就好比用餐后对厨房的清理工作。第一次你没有清理它,你用餐是会快一点。但是由于没有对盘碟和用餐环境进行清洁,第二天做准备工作的时间就要更长一点。这会再一次促使你放弃清洁工作。的确,如果跳过清洁工作,你今天总是能够很快的用完餐,但是脏乱在一天天地积累。最终,你得花费大量的时间去寻找合适的烹饪器具,凿去盘碟上已经干硬的食物残余,并把它们洗擦干净以使它们适合于烹饪。饭是天天要吃的。忽略掉清洁工作并不能真正加快做饭速度。