最近在對項目中的代碼進行重構,在重構的過程中發現了一些很有趣的東西,就是泛型和委托!
泛型和委托給我的重構帶來了很大的便利,我也對它們在重構的技術上有了一些新的認識!
如果小菜說的不對,還請園友們幫我指出,我會虛心接受的,謝謝~!
下面我只是說泛型和委托在重構時的一些觀點,不包含泛型和委托的所有知識點!
一丶泛型
重構前代碼:
1 public class Test 2 { 3 public object TestOne(int number) 4 { 5 switch (number) //根據傳過來的number來選擇對象 6 { 7 case 1: 8 return Test1(); 9 case 2: 10 return Test2(); 11 default: 12 return null; 13 } 14 } 15 16 public Person1 Test1() //很簡單,返回一個對象實例 17 { 18 Person1 person1 = new Person1(); 19 return person1; 20 } 21 22 public Person2 Test2() //這個也是返回一個對象實例 23 { 24 Person2 person2 = new Person2(); 25 return person2; 26 } 27 } 28 29 public class Person1 30 { } 31 32 public class Person2 33 { }
分析:
①首先看到有兩個方法的操作行為都是返回對象實例!
②也就是操作行為是相似的,但是返回的類型是不一樣的!
③找到了相同點之后,我們就要對經常變化的點進行封裝了,也就是我們要封裝類型的變化點!
③最后我們很容易想到用泛型實現這樣的需求!
重構后代碼:
1 public class Test 2 { 3 public object TestOne(int number) 4 { 5 switch (number) 6 { 7 case 1: 8 return TestTwo<Person1>(); 9 case 2: 10 return TestTwo<Person2>(); 11 default: 12 return null; 13 } 14 } 15 16 public T TestTwo<T>() where T : class,new() //通過泛型來封裝類型變化點 17 { 18 T t = new T(); 19 return t; 20 } 21 } 22 23 public class Person1 24 { } 25 26 public class Person2 27 { }
結論:泛型封裝類型變化點
通過泛型來傳遞類型,規定現在我們應該使用哪一種類型,這樣就可以做到類型封裝,從而做到以不變應萬變!
二丶委托
重構前代碼:
1 public class Test 2 { 3 public void Test1() 4 { 6 DataTable table = new DataTable(); //獲取數據源 7 //生成Entity 8 foreach (DataRow item in table.Rows) 9 { 10 GenerateEntity1(item); 11 } 12 } 13 14 public void Test2() 15 { 17 DataTable table = new DataTable(); //獲取數據源 18 //生成Entity 19 foreach (DataRow item in table.Rows) 20 { 21 GenerateEntity2(item); 22 } 23 } 24 25 public void GenerateEntity1(DataRow dataRow) 26 { 27 //生成Entity1 28 } 29 30 public void GenerateEntity2(DataRow dataRow) 31 { 32 //生成Entity2 33 } 34 }
分析:
①首先會看到Test1和Test2方法中在生成Entity時會有foreach循環的重復代碼!
②要想提取出兩邊的通用代碼,需要分析兩邊哪些代碼是一樣的,哪些是變化的,這樣我們就能提取出不變的代碼,而用一些技術來封裝變化點,最終做到通用!
③我們很容易發現foreach循環的代碼是一樣的,生成entity是不一樣的,但是在仔細看一下生成entity方法的參數和返回值是一樣的!
④那么怎么來封裝那個經常變化的點呢?
⑤我們想到委托,通過委托來傳遞操作行為來做到變化!
重構后代碼:
1 public class Test2 2 { 3 public void Test1() 4 { 5 DataTable table = new DataTable(); //數據源 6 GenerateEntity(table, GenerateEntity1); 7 } 8 9 public void Test2() 10 { 11 DataTable table = new DataTable(); //數據源,跟上面不同的數據源 12 GenerateEntity(table, GenerateEntity2); 13 } 14 15 public void GenerateEntity1(DataRow dataRow) 16 { 17 //生成Entity1 18 } 19 20 public void GenerateEntity2(DataRow dataRow) 21 { 22 //生成Entity2 23 } 24 25 private void GenerateEntity(DataTable table, Action<DataRow> action) //通過委托來實現操作行為的傳遞 26 { 27 foreach (DataRow item in table.Rows) 28 { 29 action(item); 30 } 31 } 32 }
結論:委托封裝行為操作變化點
通過傳遞委托實例來指定我需要使用那種操作行為,如果發現返回值不一樣,那么再加上泛型來封裝類型的變化點,最后就構成了委托和泛型的綜合利用!
三丶總結
其實就是想說在實踐中進行思考,進行總結,最終一定會有不一樣的收獲!
已同步至:個人文章目錄索引