《Effective C#》讀書筆記——條目21:限制類型的可見度

來源:互聯網
上載者:User

   在保證類型可以完成其工作的前提下,我們應該儘可能的給類型分配最小的存取層級。可見度越低那麼以後升級更改時所需的變化也就越少——因為能訪問你的功能的代碼越少,以後可能出現的修改也就會越少。

 

使用內部類來限制類型範圍

  建立內部類是一種常被忽略的限制類型範圍的方法,在建立一個類時,應該仔細考慮這個新類型的作用範圍:是將被所有的客戶使用?還是僅僅用在程式集的內部。內部的類可以讓你在稍後的任意替換其具體的實現,只要兩個類實現同樣的介面即可。例如下面驗證電話號碼的類:

1 public class PhoneValidator2 {3     public bool ValidateNumber(phoneNumber ph)4     {5         //驗證號碼的代碼...略6         return true;7     }8 }

 

現在該類是完全可以工作的,但是隨著項目的升級,現在出現了一個新的需求,需要同時處理多種格式的電話號碼,例如國際電話號碼。為了不把所有的功能都混在一個類中,我們應該盡量降低兩個不同功能間的耦合。我們通過介面來暴露功能,建立一個驗證電話的介面:

1 public interface IPhoneValidator2 {3     bool ValidateNumber(phoneNumber ph);4 }

 

接著把原來的 PhoneValidator類的存取層級改成internal類型,並實現IPhoneValidator介面:

1 internal class CNPhoneValidator:IPhoneValidator2 {3     public bool ValidateNumber(phoneNumber ph)4     {5         //驗證號碼的代碼...略6         return true;7     }8 }

 

隨後建立支援驗證國際電話格式的類:

1 internal class InternationalPhoneValidator:IPhoneValidator2 {3     public bool ValidateNumber(phoneNumber ph)4     {5         //驗證號碼的代碼...略6         return true;7     }8 }

  上面的例子只是部分實現,通過使用原廠模式可以根據不同的電話號碼給出對應的驗證器。在程式集外部,只要介面是可見的。而那些針對不同地區的電話號碼驗證器則只在程式集的內部可見。你可以再任意地為不同的地區添加各自的驗證類,而不會擔心影響系統內的其他程式集。這樣限制了類的作用範圍之後,也就減少了日後升級和拓展整個系統時需要更改的代碼。這裡其實可以為PhoneValidator建立一個公有的抽象基類,其中包含一些公有的實現邏輯,這裡使用介面是由於:現在各個實現中的公有邏輯很少。

 

小節:

  更少的公有類型可以讓單元測試變得簡單,減少了公有類型的數量也就意味著要為公有類型建立的單元測試數量也會變少。同時,更多的使公有API通過介面暴露,在單元測試中也跟容易使用替代類型。以公有類型暴露給外界的類和介面將成為你組件的契約,必須認真對待。介面越複雜,日後修改也就越加受限。暴露的公有類型越少,今後更新擴充時選擇的餘地就會更大。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.