代碼重構(gou)~提取到類
提(ti)取到類(lei)(lei)(Extract Class) : 將(jiang)多個(ge)類(lei)(lei)所公用(yong)(yong)的部分(包括方法,屬性(xing),事件(jian)等(deng)等(deng))抽象(xiang)出來,形(xing)成一個(ge)新的類(lei)(lei)型,這個(ge)類(lei)(lei)被(bei)稱為它(ta)們的基(ji)(ji)類(lei)(lei)(base class)或者(zhe)(zhe)父類(lei)(lei),而使(shi)用(yong)(yong)面向對象(xiang)語言的特性(xing),在基(ji)(ji)類(lei)(lei)中使(shi)用(yong)(yong)抽象(xiang)對象(xiang)或者(zhe)(zhe)虛對象(xiang),讓子類(lei)(lei)可(ke)(ke)以直接使(shi)用(yong)(yong)基(ji)(ji)類(lei)(lei)的成員或者(zhe)(zhe)根據(ju)自(zi)己的邏(luo)輯去覆寫基(ji)(ji)類(lei)(lei)的成員,提(ti)交到類(lei)(lei)經常被(bei)用(yong)(yong)到產品(pin)族的概念中,如(ru)一個(ge)數(shu)據(ju)操作基(ji)(ji)類(lei)(lei),它(ta)的子類(lei)(lei)可(ke)(ke)能是user操作類(lei)(lei),product操作類(lei)(lei),order操作類(lei)(lei)等(deng),具體(ti)看一下代碼(ma):
userRespository類型是用來對user表進行直(zhi)接(jie)的(de)(de)單純的(de)(de)數據操作(zuo)的(de)(de),它可(ke)以是這樣的(de)(de)
而對(dui)(dui)于userRespository來(lai)(lai)說,它可能需要(yao)(yao)一(yi)個DB數據(ju)源(yuan)對(dui)(dui)象(可能是linq to sql,ef的(de)(de)一(yi)種),還(huan)有一(yi)些標準(zhun)的(de)(de)CURD操作的(de)(de)方法,而這(zhe)些對(dui)(dui)于productRespository類(lei)型也是一(yi)樣需要(yao)(yao)的(de)(de),這(zhe)時,我們就應該將userRepository和productRepository公用的(de)(de)部分提取(qu)出來(lai)(lai),行(xing)成它們的(de)(de)基類(lei),即(ji)RepositoryBase
在這個RepositoryBase基(ji)(ji)(ji)類(lei)(lei)中(zhong),還使(shi)用了(le)(le)接口,它實現了(le)(le)對所有數(shu)據基(ji)(ji)(ji)類(lei)(lei)(可(ke)能是linq to sql基(ji)(ji)(ji)類(lei)(lei),ef基(ji)(ji)(ji)類(lei)(lei),內(nei)存(cun)數(shu)據源(yuan)基(ji)(ji)(ji)類(lei)(lei),緩(huan)存(cun)數(shu)據源(yuan)基(ji)(ji)(ji)類(lei)(lei)等)操作的(de)統一性(xing)和一致性(xing)。
我們在進行(xing)“提取(qu)到(dao)類”時,需要注意的(de)幾個概(gai)念(nian)是:
抽(chou)象方(fang)(fang)法:abstract method,在基類(lei)去(qu)定義方(fang)(fang)法規范,由子類(lei)去(qu)實(shi)現它的邏輯
虛(xu)方法(fa):virtual method,在(zai)基類(lei)(lei)去實現了(le)這個方法(fa),但子(zi)類(lei)(lei)可(ke)以(yi)根(gen)據自己的邏輯去override它
抽象類:一(yi)般(ban)基類都是不能被(bei)直接實例化的,所以(yi)一(yi)般(ban)是抽象類
如果上(shang)面的(de)(de)代碼不容(rong)易理解,可(ke)(ke)以看一(yi)面簡(jian)單的(de)(de)demo,一(yi)個(ge)boy類,它有(you)(you)一(yi)個(ge)屬生name和(he)(he)一(yi)個(ge)方法display(),name表示為男孩的(de)(de)姓(xing)名(ming),display輸出男孩的(de)(de)姓(xing)名(ming);而(er)另外一(yi)個(ge)類girl,它也一(yi)樣(yang)有(you)(you)name和(he)(he)display,這時,我們可(ke)(ke)以將boy和(he)(he)girl公有(you)(you)的(de)(de)屬性和(he)(he)方法進行抽取,放在person類,而(er)它應(ying)該有(you)(you)兩個(ge)屬性name和(he)(he)gander,代表人的(de)(de)姓(xing)名(ming)和(he)(he)性別,有(you)(you)一(yi)個(ge)方法是(shi)display(),用來輸出人的(de)(de)姓(xing)名(ming)和(he)(he)性別,這個(ge)簡(jian)單的(de)(de)例子很好的(de)(de)說明了提取到類的(de)(de)使用場合,它的(de)(de)代碼如下(xia):
1 //男孩(hai)子(zi) 2 class Boy 3 { 4 public string Name{get;set;} 5 6 public void Display() 7 { 8 Console.Write("男(nan)孩姓名是{0}",Name); 9 } 10 } 11 //女孩子 12 class Girl 13 { 14 public string Name{get;set;} 15 16 public void Display() 17 { 18 Console.Write("女孩姓名是(shi){0}",Name); 19 } 20 } 21 //而把(ba)方法修改后變為 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 //男孩根據(ju)自己的需要,去override Display()這個方法 34 class Boy 35 { 36 public string Name{get;set;} 37 38 public void Display() 39 { 40 Console.Write("性別:{0},姓名(ming):{1}",Gander,Name); 41 } 42 }
其實,代碼(ma)重(zhong)構它不僅是(shi)對代碼(ma)本身的(de)重(zhong)構(代碼(ma)執行性(xing)能),更重(zhong)要(yao)的(de)是(shi)對面向對象的(de)重(zhong)構(代碼(ma)的(de)邏輯表現(xian))。