代碼重構~提取到類
提取到類(Extract Class) : 將多個類所公用的部分(包括方法,屬性,事件等等)抽象出來,形成一個新的類型,這個類被稱為它們的基類(base class)或者父類,而使用面向對象語言的特性,在基類中使用抽象對象或者虛對象,讓子類可以直接使用基類的成員或者根據自己的邏輯去覆寫基類的成員,提交到類經常被用到產品族的概念中,如一個數據操作基類,它的子類可能是user操作類,product操作類,order操作類等,具體看一下代碼:
userRespository類型是用來對user表進行直接的單純的數據操作的,它可以是這樣的
而對于userRespository來說,它可能需要一個DB數據源對象(可能是linq to sql,ef的一種),還有一些標準的CURD操作的方法,而這些對于productRespository類型也是一樣需要的,這時,我們就應該將userRepository和productRepository公用的部分提取出來,行成它們的基類,即RepositoryBase
在這個RepositoryBase基類中,還使用了接口,它實現了對所有數據基類(可能是linq to sql基類,ef基類,內存數據源基類,緩存數據源基類等)操作的統一性和一致性。
我們在進行“提取到類”時,需要注意的幾個概念是:
抽象方法:abstract method,在基類去定義方法規范,由子類去實現它的邏輯
虛方法:virtual method,在基類去實現了這個方法,但子類可以根據自己的邏輯去override它
抽象類:一般基類都是不能被直接實例化的,所以一般是抽象類
如果上面的代碼不容易理解,可以看一面簡單的demo,一個boy類,它有一個屬生name和一個方法display(),name表示為男孩的姓名,display輸出男孩的姓名;而另外一個類girl,它也一樣有name和display,這時,我們可以將boy和girl公有的屬性和方法進行抽取,放在person類,而它應該有兩個屬性name和gander,代表人的姓名和性別,有一個方法是display(),用來輸出人的姓名和性別,這個簡單的例子很好的說明了提取到類的使用場合,它的代碼如下:
1 //男孩子 2 class Boy 3 { 4 public string Name{get;set;} 5 6 public void Display() 7 { 8 Console.Write("男孩姓名是{0}",Name); 9 } 10 } 11 //女孩子 12 class Girl 13 { 14 public string Name{get;set;} 15 16 public void Display() 17 { 18 Console.Write("女孩姓名是{0}",Name); 19 } 20 } 21 //而把方法修改后變為 22 23 class Person 24 { 25 public string Name{get;set;} 26 public string Gander{get;set;} 27 public virtual void Display() 28 { 29 Console.Write("{0}姓名是{1}",Gander,Name); 30 } 31 } 32 33 //男孩根據自己的需要,去override Display()這個方法 34 class Boy 35 { 36 public string Name{get;set;} 37 38 public void Display() 39 { 40 Console.Write("性別:{0},姓名:{1}",Gander,Name); 41 } 42 }
其實,代碼重構它不僅是對代碼本身的重構(代碼執行性能),更重要的是對面向對象的重構(代碼的邏輯表現)。
浙公網安備 33010602011771號