您好,登錄后才能下訂單哦!
閱讀目錄:
1.開篇介紹
2.使用委托消除函數(shù)串聯(lián)調(diào)用
2.1.使用委托工廠轉(zhuǎn)換兩個獨立層面的對象
3.多態(tài)入口(面向?qū)ο罄^承體系是可被擴(kuò)展的)
4.多態(tài)的受保護(hù)方法的單元測試(Protected成員的單元測試)
一如既往,這篇文章是我最近在工作中總結(jié)出的一點小小的經(jīng)驗,特此寫出來與大家分享,因為我覺得日常開發(fā)中這些點點滴滴很有用;
在一般的函數(shù)調(diào)用情況下,我們都習(xí)慣性的將參數(shù)傳入到某個被調(diào)用的方法,這可能就是我們考慮調(diào)用方法的慣用思維,但是現(xiàn)在的C#語言得到了很大的提升,我們可以很自然的使用委托來減少函數(shù)之間的參數(shù)依賴;有時候會經(jīng)常看見一個函數(shù)的內(nèi)部邏輯并沒有使用到傳入的某個參數(shù),而傳入的真正目的是為了再傳入到本函數(shù)需要調(diào)用的另外一個函數(shù)中去;
圖1:
這個時候我們可以試著使用委托來封裝調(diào)用的方法,然后將委托實例傳入到第一層使用的函數(shù)中去,當(dāng)然要分清使用場景,不是所有的場景都合適;
圖2:
當(dāng)然需要平衡好這里的內(nèi)聯(lián)變量ProductContent,如果可以的話盡量將委托放入到專門創(chuàng)建委托的委托工廠中去,這樣方便全局管理,甚至進(jìn)一步抽象就可以將委托移除程序硬編碼到配置文件;
一般情況下,我們在應(yīng)用層會通過數(shù)據(jù)訪問層的代碼獲取到數(shù)據(jù)源中的對應(yīng)數(shù)據(jù)實體,然后將其進(jìn)行DomainModel話,只有這樣我們才能使用到面向?qū)ο蟮膹?qiáng)大功能;這個時候我們只需將創(chuàng)建DomainModel的委托工廠構(gòu)造好,然后作為參數(shù)傳入到數(shù)據(jù)訪問接口中去;由于應(yīng)用層是全局協(xié)調(diào)層,它可以去完成多層之間的協(xié)調(diào)操作,所以對于應(yīng)用層的設(shè)計可以盡量飽滿一點,而不是很簡單的一個靜態(tài)方法集合,這樣就會使得Application Layer很??;
很多時候我們在設(shè)計一個框架的時候我們都會注意對象的繼承體系,但是我們基本上都沒有為這些內(nèi)部對象留有對外的擴(kuò)展入口;現(xiàn)假設(shè)你有一個框架內(nèi)部的類XmlConvert,該類被XmlConvertSetting全局靜態(tài)類引用著,如果不能通過XmlConvertSetting對XmlConvert進(jìn)行設(shè)置,就無法使用到XmlConvert的所有對外提供的擴(kuò)展方法;
public class XmlConvert { protected virtual string ConvertReplace(StringBuilder NodeString) { return NodeString.ToString().Replace("XXX", "LLL"); } }
有一個很簡單的XmlConvert類,是框架內(nèi)部使用的,現(xiàn)在它提供了一個Virtual方法ConvertReplace,我們想使用這個框架內(nèi)部的類進(jìn)行擴(kuò)展;
public class CustomerXmlConvert : XmlConvert { protected override string ConvertReplace(StringBuilder NodeString) { return base.ConvertReplace(NodeString).Replace("JJJ", "AAA"); } }
但是如果未能提供給我們一個多態(tài)入口,我們這個自定義的CustomerXmlConvert無法起作用;最近發(fā)現(xiàn)很多自定義的框架設(shè)計上就有這個問題,留有了擴(kuò)展的類型和相應(yīng)的方法,但是無法插入到框架內(nèi)部去,所以特此分享一下;
受保護(hù)方法的單元測試一直都不太好解決,但是我們可以通過簡單的繼承方式來輕松的處理,就拿上面提到的XmlConvert類來舉例;
public class XmlConvert { protected virtual string ConvertReplace(StringBuilder NodeString) { return NodeString.ToString().Replace("XXX", "LLL"); } }
如果我們想測試它,直接使用類型繼承就可以:
[TestClass] public class XmlConvertTests : XmlConvert { [TestMethod] public void XmlConvert_ConvertReplace_Normal() { StringBuilder testData = new StringBuilder("XXXJJJ"); string testResult = this.ConvertReplace(testData); Assert.AreEqual(testResult, "JJJ"); } }
這里有一個很好的設(shè)計啟發(fā)就是將方法碎片化盡量保持有返回值的操作,這樣很好的進(jìn)行Assert;其實提到單元測試,冥冥之中總覺得它與面向?qū)ο笥兄幻}相承的感覺,甚至單元測試、重構(gòu)、面向?qū)ο蠖紩鸬交パa(bǔ)的作用;
內(nèi)容不多,只是簡單的項目小小的總結(jié),希望對大家有用,謝謝;
作者:王清培
出處:http://wangqingpei557.blog.51cto.com/
本文版權(quán)歸作者和51CTO共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。