溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

.NET項目開發(fā)—淺談面向?qū)ο蟮目v橫向關(guān)系、多態(tài)入口,單元測試(項目小結(jié))

發(fā)布時間:2020-07-06 22:30:47 來源:網(wǎng)絡(luò) 閱讀:784 作者:王清培 欄目:編程語言

閱讀目錄:

  • 1.開篇介紹

  • 2.使用委托消除函數(shù)串聯(lián)調(diào)用

    • 2.1.使用委托工廠轉(zhuǎn)換兩個獨立層面的對象


  • 3.多態(tài)入口(面向?qū)ο罄^承體系是可被擴(kuò)展的)

  • 4.多態(tài)的受保護(hù)方法的單元測試(Protected成員的單元測試)

1】開篇介紹

一如既往,這篇文章是我最近在工作中總結(jié)出的一點小小的經(jīng)驗,特此寫出來與大家分享,因為我覺得日常開發(fā)中這些點點滴滴很有用;

2】使用委托消除函數(shù)串聯(lián)調(diào)用

在一般的函數(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:

.NET項目開發(fā)—淺談面向?qū)ο蟮目v橫向關(guān)系、多態(tài)入口,單元測試(項目小結(jié))

這個時候我們可以試著使用委托來封裝調(diào)用的方法,然后將委托實例傳入到第一層使用的函數(shù)中去,當(dāng)然要分清使用場景,不是所有的場景都合適;

圖2:

.NET項目開發(fā)—淺談面向?qū)ο蟮目v橫向關(guān)系、多態(tài)入口,單元測試(項目小結(jié))

當(dāng)然需要平衡好這里的內(nèi)聯(lián)變量ProductContent,如果可以的話盡量將委托放入到專門創(chuàng)建委托的委托工廠中去,這樣方便全局管理,甚至進(jìn)一步抽象就可以將委托移除程序硬編碼到配置文件;

2.1】使用委托工廠轉(zhuǎ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很??;

3】多態(tài)入口(面向?qū)ο罄^承體系是可以被擴(kuò)展的)

很多時候我們在設(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)部去,所以特此分享一下;

4】多態(tài)的受保護(hù)方法的單元測試

受保護(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)利。


向AI問一下細(xì)節(jié)

免責(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)容。

AI