.NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计
6.1 擴(kuò)展機(jī)制
6.1.1 非密封類
密封類即無(wú)法派生子類,也無(wú)法擴(kuò)展。與此相反,非密封類可以派生子類進(jìn)行擴(kuò)展
?//string cannot be inherited from
public sealed class String{}
//TraceSource can be inherited from
public class TraceSource{}
正因?yàn)槿绱?#xff0c;如果需要既簡(jiǎn)單有開銷不大的擴(kuò)展方法,那么沒有聲明任何虛成員或保護(hù)成員的非密封類時(shí)不錯(cuò)的選擇。
考慮用不包含任何虛成員或保護(hù)成員的非密封類來為框架提供擴(kuò)展性,這種方法的開銷不高,用戶也喜歡。
6.1.2 保護(hù)成員
保護(hù)成員本身并不能提供任何的擴(kuò)展性,但它們能夠加強(qiáng)派生子類這一擴(kuò)展機(jī)制。
考慮將保護(hù)成員用于高級(jí)定制
要在對(duì)安全性。文檔及兼容性進(jìn)行分析時(shí),把非密封類中保護(hù)成員作為公有成員來對(duì)待
6.1.3 事件與回調(diào)函數(shù)
回調(diào)函數(shù)是一種擴(kuò)展機(jī)制,它使框架能夠通過委托來調(diào)用用戶代碼,這些委托通常是作為方法的參數(shù)傳遞給框架的。
事件是一種特殊的回調(diào)函數(shù),它為用戶提供了一致的語(yǔ)法,使用戶能夠非常方便的把委托提供給框架
考慮使用回調(diào)函數(shù)來讓框架能夠執(zhí)行用戶提供的代碼
考慮用事件來讓用戶定制框架的行為,這樣就不需要用用戶對(duì)面向?qū)ο笤O(shè)計(jì)有深入了解。
要游戲使用事件,而不是簡(jiǎn)單的回調(diào)函數(shù),其原因在于廣大開發(fā)人員更熟悉事件,而且事件與Visual Studio的statement completion特性集成在一起。
避免在對(duì)性能要求很高的API中使用回調(diào)函數(shù)。
要理解在調(diào)用委托時(shí)可以執(zhí)行任何代碼,這可能會(huì)引起安全性,正確行及兼容性的問題。
6.1.4 虛成員
與回調(diào)函數(shù)相比,虛成員的主要的缺點(diǎn)在于它的行為只能靜態(tài)修改(在編譯時(shí)修改),而回調(diào)函數(shù)的行為則可以動(dòng)態(tài)修改(在運(yùn)行時(shí)修改)。
不要使用虛成員,除非有合適的理由,同時(shí)你對(duì)設(shè)計(jì)、測(cè)試及維護(hù)虛成員的開銷有清楚的認(rèn)識(shí)。
在以擴(kuò)展性為 名義做決定前,請(qǐng)確保你完全理解了自己對(duì)擴(kuò)展的需求。
考慮只有在絕對(duì)必須的時(shí)候才用虛成員提供擴(kuò)展性,并使用Template Method模式。
要優(yōu)先使用受保護(hù)的虛成員,而不是公有虛成員。公有虛成員應(yīng)該通過調(diào)用受保護(hù)的虛成員的方式來提供擴(kuò)展性。
類的公有成員應(yīng)該為類的直接使用者提供正確的功能集。虛成員的設(shè)計(jì)目的是為了讓子類覆蓋。而受保護(hù)的訪問權(quán)限是一種很好的方法,可以對(duì)其使用范圍加以限制。
6.1.5 抽象(抽象類型與抽象接口)
抽象就是描述一個(gè)協(xié)定但是并不為該協(xié)定提供完整實(shí)現(xiàn)的類型。抽象通常實(shí)現(xiàn)為抽象類或接口,并帶有一些參考文檔,來描述實(shí)現(xiàn)該協(xié)定類型必須具備的那些語(yǔ)義。
不要提供抽象,除非為該抽象開發(fā)出具體實(shí)現(xiàn)并用到該抽象的API隊(duì)其進(jìn)行過實(shí)際測(cè)試。
要在設(shè)計(jì)抽象時(shí)謹(jǐn)慎地選擇抽象類或是抽象接口
考慮為抽象的具體實(shí)現(xiàn)提供參考測(cè)試。這類測(cè)試應(yīng)該告訴用于,他們是否正確實(shí)現(xiàn)餓了協(xié)定。
6.2 基類
? 我們把基類限定為這樣的類:其設(shè)計(jì)目的不是為了直接使用或提供常用的抽象,而是為了讓其他類通過繼承類重用它的默認(rèn)實(shí)現(xiàn)。
考慮使用基類為抽象類,即使他們并不包含任何抽象成員。這能夠清楚地告訴用戶,設(shè)計(jì)這些類的目的的完全是為了讓用戶從他們派生自己的子類。
考慮把基類與用于主要場(chǎng)景的類型分開,放到單獨(dú)的名字空間中。根據(jù)定義,基類是為了高級(jí)擴(kuò)展而設(shè)計(jì)的,因此大多數(shù)用戶對(duì)它們并不感興趣。
避免在命名基類時(shí)使用“Base”后綴,如果該類會(huì)用于公用API。
6.3 密封
密封是一種阻止擴(kuò)展的有效機(jī)制。開發(fā)人員既可以密封整個(gè)類,也可以密封類中的單個(gè)成員。密封整個(gè)類使用戶不能自該類繼承,而密封一個(gè)成員則使用戶不能覆蓋該成員。
不要把類密封起來,除非有恰當(dāng)?shù)睦碛伞?/p>
把類密封起來的恰當(dāng)理由包括:
類為靜態(tài)類
類的保護(hù)成員保存了需要高度保密的機(jī)密信息
類繼承了許多虛成員,把這些成員一個(gè)一個(gè)都密封起來的代價(jià)太高,還不如把整個(gè)類都密封起來。
類時(shí)attribute,需要能再運(yùn)行的時(shí)候快速查找
不要在密封類中聲明保護(hù)成員或虛成員
考慮在覆蓋成員時(shí)將其密封
?
轉(zhuǎn)載于:https://www.cnblogs.com/lufangtao/archive/2012/04/10/2441276.html
總結(jié)
以上是生活随笔為你收集整理的.NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让IE7/8使用CSS中first-ch
- 下一篇: 分享一个超棒的在线jQuery mobi