閱讀目錄:
成都創(chuàng)新互聯(lián)專注于古城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供古城營(yíng)銷型網(wǎng)站建設(shè),古城網(wǎng)站制作、古城網(wǎng)頁(yè)設(shè)計(jì)、古城網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造古城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供古城網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
1.開篇介紹
2.使用委托消除函數(shù)串聯(lián)調(diào)用
2.1.使用委托工廠轉(zhuǎn)換兩個(gè)獨(dú)立層面的對(duì)象
3.多態(tài)入口(面向?qū)ο罄^承體系是可被擴(kuò)展的)
4.多態(tài)的受保護(hù)方法的單元測(cè)試(Protected成員的單元測(cè)試)
一如既往,這篇文章是我最近在工作中總結(jié)出的一點(diǎn)小小的經(jīng)驗(yàn),特此寫出來與大家分享,因?yàn)槲矣X得日常開發(fā)中這些點(diǎn)點(diǎn)滴滴很有用;
在一般的函數(shù)調(diào)用情況下,我們都習(xí)慣性的將參數(shù)傳入到某個(gè)被調(diào)用的方法,這可能就是我們考慮調(diào)用方法的慣用思維,但是現(xiàn)在的C#語(yǔ)言得到了很大的提升,我們可以很自然的使用委托來減少函數(shù)之間的參數(shù)依賴;有時(shí)候會(huì)經(jīng)??匆娨粋€(gè)函數(shù)的內(nèi)部邏輯并沒有使用到傳入的某個(gè)參數(shù),而傳入的真正目的是為了再傳入到本函數(shù)需要調(diào)用的另外一個(gè)函數(shù)中去;
圖1:
這個(gè)時(shí)候我們可以試著使用委托來封裝調(diào)用的方法,然后將委托實(shí)例傳入到第一層使用的函數(shù)中去,當(dāng)然要分清使用場(chǎng)景,不是所有的場(chǎng)景都合適;
圖2:
當(dāng)然需要平衡好這里的內(nèi)聯(lián)變量ProductContent,如果可以的話盡量將委托放入到專門創(chuàng)建委托的委托工廠中去,這樣方便全局管理,甚至進(jìn)一步抽象就可以將委托移除程序硬編碼到配置文件;
一般情況下,我們?cè)趹?yīng)用層會(huì)通過數(shù)據(jù)訪問層的代碼獲取到數(shù)據(jù)源中的對(duì)應(yīng)數(shù)據(jù)實(shí)體,然后將其進(jìn)行DomainModel話,只有這樣我們才能使用到面向?qū)ο蟮膹?qiáng)大功能;這個(gè)時(shí)候我們只需將創(chuàng)建DomainModel的委托工廠構(gòu)造好,然后作為參數(shù)傳入到數(shù)據(jù)訪問接口中去;由于應(yīng)用層是全局協(xié)調(diào)層,它可以去完成多層之間的協(xié)調(diào)操作,所以對(duì)于應(yīng)用層的設(shè)計(jì)可以盡量飽滿一點(diǎn),而不是很簡(jiǎn)單的一個(gè)靜態(tài)方法集合,這樣就會(huì)使得Application Layer很薄;
很多時(shí)候我們?cè)谠O(shè)計(jì)一個(gè)框架的時(shí)候我們都會(huì)注意對(duì)象的繼承體系,但是我們基本上都沒有為這些內(nèi)部對(duì)象留有對(duì)外的擴(kuò)展入口;現(xiàn)假設(shè)你有一個(gè)框架內(nèi)部的類XmlConvert,該類被XmlConvertSetting全局靜態(tài)類引用著,如果不能通過XmlConvertSetting對(duì)XmlConvert進(jìn)行設(shè)置,就無法使用到XmlConvert的所有對(duì)外提供的擴(kuò)展方法;
public class XmlConvert { protected virtual string ConvertReplace(StringBuilder NodeString) { return NodeString.ToString().Replace("XXX", "LLL"); } }
有一個(gè)很簡(jiǎn)單的XmlConvert類,是框架內(nèi)部使用的,現(xiàn)在它提供了一個(gè)Virtual方法ConvertReplace,我們想使用這個(gè)框架內(nèi)部的類進(jìn)行擴(kuò)展;
public class CustomerXmlConvert : XmlConvert { protected override string ConvertReplace(StringBuilder NodeString) { return base.ConvertReplace(NodeString).Replace("JJJ", "AAA"); } }
但是如果未能提供給我們一個(gè)多態(tài)入口,我們這個(gè)自定義的CustomerXmlConvert無法起作用;最近發(fā)現(xiàn)很多自定義的框架設(shè)計(jì)上就有這個(gè)問題,留有了擴(kuò)展的類型和相應(yīng)的方法,但是無法插入到框架內(nèi)部去,所以特此分享一下;
受保護(hù)方法的單元測(cè)試一直都不太好解決,但是我們可以通過簡(jiǎn)單的繼承方式來輕松的處理,就拿上面提到的XmlConvert類來舉例;
public class XmlConvert { protected virtual string ConvertReplace(StringBuilder NodeString) { return NodeString.ToString().Replace("XXX", "LLL"); } }
如果我們想測(cè)試它,直接使用類型繼承就可以:
[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"); } }
這里有一個(gè)很好的設(shè)計(jì)啟發(fā)就是將方法碎片化盡量保持有返回值的操作,這樣很好的進(jìn)行Assert;其實(shí)提到單元測(cè)試,冥冥之中總覺得它與面向?qū)ο笥兄幻}相承的感覺,甚至單元測(cè)試、重構(gòu)、面向?qū)ο蠖紩?huì)起到互補(bǔ)的作用;
內(nèi)容不多,只是簡(jiǎn)單的項(xiàng)目小小的總結(jié),希望對(duì)大家有用,謝謝;
作者:王清培
出處:http://wangqingpei557.blog.51cto.com/
本文版權(quán)歸作者和51CTO共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
新聞標(biāo)題:.NET項(xiàng)目開發(fā)—淺談面向?qū)ο蟮目v橫向關(guān)系、多態(tài)入口,單元測(cè)試(項(xiàng)目小結(jié))
鏈接地址:http://jinyejixie.com/article12/poesgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、微信小程序、靜態(tài)網(wǎng)站、App設(shè)計(jì)、虛擬主機(jī)、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)