




已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1. 前言1.1. 目的本文檔用于規(guī)范.NET代碼編寫工作。任何代碼編寫工作都需按照此規(guī)范執(zhí)行。1.2. 約定在每小節(jié)下面都有一些要求必須遵守,或者建議遵守的規(guī)范。通過O(Obey)表示必須遵守,A(advise)表示建議遵守。O2-001XXX。表示第一章第一個必須遵守的規(guī)范。A2-001XXX。表示第一章第一個建議遵守的規(guī)范。1.3. 參考資料編號資料名稱簡介作者日期出版單位001Framework Design Guidelines:Conventions,Idioms,and Patterns for Reusable.NET Lbraries框架設(shè)計師和開發(fā)人員的權(quán)威指南。Krzyszof CwalinaBrad Abrams2006年7月Microsoft Corporation002Code CompleteSteve、McConnell2006年Microsoft Corporation1.4. 術(shù)語序號術(shù)語備注123456789102. 命名規(guī)范2.1. 通用命名約定本節(jié)描述了一些通用的命名約定,它們涉及到單詞的選擇、單詞縮寫和首字母縮寫詞的使用規(guī)范以及如何避免使用編程語言特有的名字。 2.1.1. 單詞的選擇A. O2-001要為標識符選擇易于閱讀的名字; a) 解釋對標識符的名字來說,很重要的一點是要一目了然。標識符的名字應(yīng)該清楚地說明每個成員做什么,以及每個類型和參數(shù)表示什么。b) 示例一個命為HorizontalAlignment 的屬性就比AlignmentHorizontal 更易于閱讀。 B. O2-002要更看重可讀性,而不是更看重簡短性。a) 解釋名字的意思清楚要比長度短更重要。名字應(yīng)該與場景、系統(tǒng)的邏輯組成或物理組成以及為人熟知的概念相對應(yīng),而不應(yīng)該與技術(shù)或框架相對應(yīng)。b) 示例屬性名CanScrollHorizontally要勝于ScrollableX(不太明顯地引用了X坐標軸)。C. O2-003不要使用下劃線、連字符以及其他任何既非字符也非數(shù)字的字符。a) 解釋用大小寫來區(qū)分單詞,而不是用下劃線、連字符或其它字符。b) 示例不要使用user_name來表示用戶名屬性,而是用UserName。D. O2-004不要使用匈牙利命名法。a) 解釋匈牙利命名法過于繁瑣,命名應(yīng)該用于說明標識符的含義而不是它的類型。b) 示例不要使用CDocument來定義文檔類,而是使用Document。E. O2-005不要使用與廣泛使用的編程語言的關(guān)鍵字有沖突的標識符。a) 解釋根據(jù)CLS(公共語言規(guī)范)的第4條規(guī)則,所有符合規(guī)范等語言必須提供一種機制,允許用戶訪問以該語言的關(guān)鍵字來命名的標識符。例如,C#在這種情況下使用符號作為轉(zhuǎn)義機制(escape mechanism)。但是,由于在使用方法時,用轉(zhuǎn)義序列(escape sequence)要比不用轉(zhuǎn)義序列麻煩得多,因此避免使用常見的關(guān)鍵字仍然是個好習(xí)慣。b) 示例 不要定義一個Type class;的變量來表示類型,而應(yīng)該用Type type;2.1.2. 使用單詞縮寫和首字母縮寫詞A. O2-006不要使用縮寫詞和縮約詞作為標識符名字的一部分a) 解釋一般來說,不要在標識符中使用單詞縮寫或首字母縮寫詞。正如前面所講,對名字來說,可讀性比簡短更重要。另外有一點也同樣重要,即不要使用未被廣泛接受的單詞縮寫和首字母縮寫詞,也就是說,大多數(shù)非領(lǐng)域?qū)<业娜四軌蛄⒖讨浪鼈兪鞘裁匆馑?。b) 示例要用GetWindow,而不要用GetWin。B. O2-007不要使用未被廣泛接受的首字母縮寫詞,即使是被廣泛接受的首字母縮寫詞,也應(yīng)該在必須的時候才使用a) 解釋例如,UI用來表示User Interface,HTML用來表示 Hypertext Markup Language。在框架的標識中使用它們?nèi)允遣缓玫淖龇ā?.1.3. 避免使用語言特有的名字對那些所謂的基本類型,CLR平臺上的編程語言通常都有自己的名字(別名)來稱呼它們。例如,int 是C#中System.Int32 的別名。為了確??蚣苣軌虺浞掷每缯Z言協(xié)作-CLR的核心特性之一,避免在標識中使用語言特有的類型名是很重要的。A. O2-008要給類型名使用語義上有意義的名字,而不要使用語言特有的關(guān)鍵字b) 示例例如:GetLength這個名字比GetInt要好。B. O2-009要使用CLR的通用類型名,而不要使用語言特有的別名-如果除了類型之外,標識符沒有其他的語義a) 示例一個把類型轉(zhuǎn)換為System.Int64的方法應(yīng)該被命名為ToInt64,而不是Toloong(因為System.Int64是CLR類型名,它對應(yīng)于C#特有的別名long)。表3-3列出了有別名的基本類型在CLR中的類型名(以及與C#、Visual Basic、C+相對應(yīng)的類型名)。 C. O2-010要使用常見的名字,比如value 或item,而不要重復(fù)類型的名字-如果除了類型之外, 標識符沒有其他的語義,而且參數(shù)的類型不重要a) 示例類提供的這些方法可以把各種不同的數(shù)據(jù)類型寫入流中:void Write(double value);void Write(float value);void Write(short value); 2.1.4. 為已有API的新版本命名有時無法將一個新特征添加到一個已有的類型中去,即使已有類型的名字意味著它是新特征的最佳歸宿。在這種情況下需要添加一個新類型,但由于要給新類型找一個好的新名字,因此這通常給框架設(shè)計師出了難題。類似地,在需要提供額外的功能時,經(jīng)常會無法對已有的成員進行擴展或重載,為此,只能用新名字來添加新成員。下面的規(guī)范描述了當用新類型和新成員接替或取代已有的類型或成員時,如何為它們選擇名字。A. O2-011要在創(chuàng)建已有API的新版本使用與舊API相似的名字。這有助于突出API之間的關(guān)系a) 示例class AppDomain Obsolete(“AppDoMain.SetCachePath has been deprecated”) public void SetCachePath(String psth). class AppDomainSetup public string CachePath get; set; B. O2-012要優(yōu)先使用后綴而不是前綴來表示已有API的新版本。 這有助于在瀏覽文檔或使用Intellisense 時發(fā)現(xiàn)新版本。由于大多數(shù)瀏覽器和Intellisense按字母的順序顯示標識符,因此舊API與新API在位置上會非常接近 C. A2-001考慮使用全新但有意義的標志符號,而不是簡單地給已有標識符添加后綴或前綴。D. O2-013要使用數(shù)字后綴來表示已有API的新版本,如果已有API的名字是唯一有意義的名字(也就是說,它是一個工業(yè)標準),不適宜添加后綴(或改名)E. O2-014不要在標識符中使用“Ex”(或類似的)后綴來區(qū)分相同API的不同版本。 a) 示例public class CarEx /the wrong way F. O2-015要在引入對64位整數(shù)(long)而非32位整數(shù)進行操作的新版本API時使用“64”后綴。只有當已經(jīng)存在32位的API時才需要采用這種方法,對只有64位版本的全新API則不需要這要做2.2. 大小寫約定因為CLR支持許多編程語言,這些語言有的區(qū)分大小寫,有的不區(qū)分,所以不應(yīng)該只用大小寫來區(qū)分名字。但是,大小寫對增強名字可讀性的重要性怎么強調(diào)也不過分。本章中的規(guī)范展示了一種使用大小寫的簡單方法,如果一致地使用,那么會使類型、成員以及參數(shù)的標識符更易于閱讀。2.2.1. 標識符的大小寫規(guī)則為了區(qū)分一個標識符中的多個單詞,把標識符中的每個單詞的首字母大寫。不要用下劃線來區(qū)分單詞,或者在標識符中的任何地方使用下劃線。有兩種合適的方法來大寫標識符中的字母,這取決于所使用的標識符:PascalCasingcalmelCasingPascalCasing約定被用于除了參數(shù)名、變量名、私有字段名之外的所有標識符,它把標識符中每個單詞的首字母(包括長度為兩個字符以上的首字母縮寫詞)大寫,如下面的例子所示: HtmlTag兩個字母長的首字母縮寫詞是一個特例,在這種情況下兩個字母都要大寫,如下面的標識符所示:IOStreamcamelCasing約定用于參數(shù)、變量、私有字段的名字,它把標識符中除了第一個單詞之外的所有單詞的首字母大寫,如下面的例子所示。在例子中,如果camolCasing風(fēng)格的標識符以兩個字母長的首字母 ,那么兩個字母都要小寫。ioStreomhtmlTagA. O2-016要把PascalCasing用于由多個單詞構(gòu)成的名字空問、類型以及成員的名字a) 示例使用Textcolor而不是Textcolor或Text_color。單個單詞(比如Button)直接首字母大寫。始終作為一個單詞的復(fù)合詞(比如endpoint)視為一個單詞,只有第一個字母大寫。B. O2-017要把camelCasing用于參數(shù)的名字b) 示例表2-1 不同類型的標識符的大小寫規(guī)則 -標識符大小寫樣例-命名空間:Pascal namespace System.Security .類型: Pascalpublic class StreamReader接口:Pascalpublic class StreamReader方法:Pascal public class Object public virtual string ToString();屬性: Pascal public class Stringpublic int Length get;事件 Pascal public class Processpublic event EventHandler Exited;字段(靜態(tài))Pascal public MessageQueuepublic static readonlyTimeSpanInfiniteTimeout;枚舉值 Pascal FileMode Append, 參數(shù) Camel public class Convert public static intToInt32(string value ); -2.2.2. 首字母縮寫詞的大小寫 一般來說,避免在標識符的名字中使用首字母縮寫詞是很重要的,除非它們是普遍使用的,能夠立刻使用框架的人所理解。例如,HTML、XML和IO很容易理解,但不怎么常用的首字母縮寫詞絕對應(yīng)該避免。 2.3. 程序集和DLL的命名程序集是一個部署單元,同時還代表托管代碼程序的身份。雖然程序集可以分布在一個或多個文件中,但一般來說一個程序集僅與一個DLL想對應(yīng)。因此,本節(jié)只討論DLL的命名約定,程序集的命名約定與次類似。 命名空間與DLL和程序集是不同的概念。命名空間對開發(fā)人員來說是一組邏輯實體,而DLL和程序集則是在打包和部署時的一個單元。DLL可以因產(chǎn)品的組織及其他原因而包含多個命名空間。由于命名空間的組織方法與DLL不同,因此應(yīng)該單獨設(shè)計。例如,如果決定把DLL命名為MyConpany.MyTechnology,這并不意味著DLL必須包含名為MyCompany.MyTechnology的命名空間。 A. O2-018要為程序集和DLL選擇提示性的名字a) 示例比如System.Data,這樣很容易就知道它的大致功能。程序集和DLL的名字不一定要和命名空間相對應(yīng),但在給程序集命名時遵循命名空間的名字也是合情合理的。 考慮按照下面的模式給DLL命名 .dll 其中包含一個或多個以點號分隔的子句 Microsoft.VisualBasic.dllMicrosoft.VisualBasic.Vsa.dll Fabrikam.Security.dll Litware.Controls.dll 2.4. 命名空間的命名與其他的命名規(guī)范一樣,為命名空間命名的目的是清晰,這樣對使用框架的程序員來說,他們就能立刻知道一個命名空間中大概有些什么。下面的模版給出了命名空間命名的一般規(guī)則: .(|). A. O2-019要用公司名稱作為命名空間的前綴,這樣就可以避免與另一家公司使用相同的名字a) 示例微軟提供的Microsoft Office 自動化API應(yīng)該放在Microsoft.Office命名空間中。 B. O2-020要用穩(wěn)定的、與版本無關(guān)的產(chǎn)品名稱作為命名空間的第二層。C. O2-021不要根據(jù)公司的組織架構(gòu)來決定命名空間的層次結(jié)構(gòu),因為公司內(nèi)部組織的的名稱一般來說不會持續(xù)太長的時間D. O2-022要使用PascalCasing大小寫風(fēng)格,并用點號來分隔命名空間中的各部分a) 示例Microsoft.Office.PowerPoint,如果商標使用了非傳統(tǒng)的大小寫風(fēng)格,那么即使該跟個與常規(guī)的大小寫風(fēng)格相背,也還是應(yīng)該遵循商標的大小寫風(fēng)格。 E. A2-002考慮在適當?shù)臅r候在命名空間中使用復(fù)數(shù)形式a) 示例要用System.Collections,而不要用System.Collection,但是,商標名稱和首字母縮寫詞例外。例如,要用System.IO,而不要用System.IOs。 F. O2-023不要用相同的名字來命名命名空間與位于該命名空間中的類型a) 示例不要先將命名空間命名為Debug,然后又在該命名空間中提供一個名為Debug的類。許多編譯器都要求用戶在使用這樣的類型時要加上完整的限定符。 這些guifan 涵蓋了命名空間命名的一般規(guī)范,下一節(jié)將為某些特殊的子命名空間提供一些有針對性的規(guī)范。 命名空間與類型名的沖突命名空間用來把類型組織成一個邏輯的、易于瀏覽的層次結(jié)構(gòu)。對解決在導(dǎo)入多個命名空間時可能引起的類型名的二義性,它們同樣是不可或缺的。但即便如此,對那些通常會在一起使用的不同命名空間來說,仍不應(yīng)該以此為借口在類型之間引入二義性。在常見的場景中,開發(fā)人員應(yīng)該不需要給類型名加上限定符。 G. O2-024不要引入太一般化的類型名a) 示例比如Element、Node、Log 以及Message。這樣的名字很可能會在常見的場景中引起類型名的沖突。應(yīng)該給這些一般化的類型名加上修飾語( FormElement、XmlNode、EventlogSoapMessage)。 對不同類型的命名空間,有具體的規(guī)范來避免類型名的沖突。命名空間可以分為下面的類別:應(yīng)用程序模型命名空間(application model namespace)基礎(chǔ)設(shè)施命名空間(infrastructure namespace)核心命名空間(core namespace)技術(shù)命名空間組(technology namespace group)2.4.1. 應(yīng)用程序模型命名空間 屬于單個應(yīng)用程序模型的命名空間經(jīng)常在一起使用,但是它們幾乎從不和屬于其他應(yīng)用程序模型的命名空間一起使用。例如,System.Windows.Forms命名空間很少和System.Web.UI命名空間一起使用。下面列出了眾所周知的應(yīng)用程序模型的命名空間組。 System.Windows* System.Web.UI*A. O2-025不要給位于同一個應(yīng)用程序模型的命名空間中的類型起相同的名字b) 示例不要給System.Web.UI.Adapters 命名空間增加一個名為Page 的類型,因為System.Web.UI 命名空間已經(jīng)包含了一個名為Page的類型。2.4.2. 基礎(chǔ)設(shè)施命名空間這個類別包含了一些在開發(fā)常用的應(yīng)用程序時很少會導(dǎo)入的名字名劍。a) 示例.Design命名空間主要在開發(fā)編程工具時使用。避免和這些命名空間中的類型產(chǎn)生沖突并不是至關(guān)重要的。 System.Windows.Forms.Design *.Design *.Permissions2.4.3. 核心命名空間核心命名空間包括了所有的System命名空間,但應(yīng)用程序模型命名空間和基礎(chǔ)設(shè)施命名空間除外。核心命名空間包含System、System.IO、System.Xml 以及System.Net 等等。A. O2-026不要給類型起會與核心命名空間中的任何類型沖突的名字a) 示例絕對不要用Stream來作類型名。它會和System.IO.Stream產(chǎn)生沖突,而后者是一個很常用的類型。B. O2-027同樣的道理,不要給System.Diagnstics.Events命名空間增加一個名為EventLog的類型a) 解釋因為System.Diagnostics命名空間已經(jīng)包含了一個名為EventLog的類型。 2.4.4. 技術(shù)命名空間組這個類別包括所有那些以相同的兩個前綴(.*)開始的命名空間,比如Microsoft.Build.Utilities和Microsoft.Build.Tasks。屬于同一個技術(shù)的類型彼此之間不產(chǎn)生沖突是很重要的。 A. O2-028不要給類型起會與位于同一技術(shù)中的其他類型產(chǎn)生沖突的名字B. O2-029不要在技術(shù)命名空間和應(yīng)用程序模型命名空間的類型之間引入類型名沖突(除非不打算將該技術(shù)與應(yīng)用程序模型一起使用)2.5. 類、結(jié)構(gòu)和接口的命名一般來說,類型名應(yīng)該是名詞詞組,因為它們代表系統(tǒng)中的實體。一條很好的經(jīng)驗法則是,如果無法為類型找到一個名詞詞組,那么可能應(yīng)該重新考慮該類型的總體設(shè)計。 另一個重要的考慮因素是最易于識別的名字應(yīng)該用于最常用的類型,即便從純技術(shù)的角度來說該名字更適合其他某個不太常用的類型。例如,在一個主要場景中用來把打印作業(yè)提交到打印隊列的類型應(yīng)該命名為Printer,而不是PrintQueue,雖然從技術(shù)上說,該類型代表一個打印隊列而不是物理設(shè)備(打印機),但是從場景的角度來說,PRINTER 是最理想的名字,因為大多數(shù)人對提交打印作業(yè)感興趣,對與物理打印機相關(guān)的其他操作(如配置打印機)并不感興趣。如果需要提供另一個類型來對應(yīng)物理打印機 。如果需要提供另一個類型來對應(yīng)物理打印機,比如用在配置場景中,那么該類型可以被命名為PrinterConfiguration或PrinterManager。 與此相似,最常用的類型名應(yīng)該反映出使用場景,而不是繼承層次。大多數(shù)用戶只使用繼承層次的葉結(jié)點,它們肌膚不會關(guān)心類層次的結(jié)構(gòu)。然而,API設(shè)計者常常把繼承層次作為選擇類型名的最重要的標準。例如 ,Stream、StreamReader、TextReader、StringReader以及FileStream都相當好地描述了每個類型在繼承層次中的位置,但它們模糊了對大多數(shù)用戶來說最為重要的信息:為了從文件中讀取文本,哪個類型才是他們需要實例化的。 下面的命名規(guī)范使用于一般的類型名。 A. O2-030要用名詞或名詞詞組來給類型命名,在少數(shù)情況下也可以用形容詞詞組來給類型命名B. O2-031在命名時要使用PascalCasing 大小寫風(fēng)格a) 解釋這使類型名和方法區(qū)分開,后者用動詞詞組來命名。 C. O2-032不要給類名加前綴(例如“C”)D. A2-003考慮讓派生類的名字以基類的名字結(jié)尾a) 解釋這樣可讀性會非常好,而且能清楚地解釋它們之間的關(guān)系。b) 示例ArgumentOutOfRangeException,它是一種Exception;SerializableAttribute,它是一種Attribute。但是,在運用這一條時,很重要的一點是要做出合理的判斷;即使Button類的名字中沒有出現(xiàn)Control字樣,它仍是一種Control事件。下面是一些正確命名的例子:public class FileStream:Streampublic class Button :Control E. O2-033要讓借口的名字以字母I開頭,這樣可以顯示出該類型是一個接口a) 示例Icomponent(描述性的名字)、IPersistable(形容詞)都是恰當?shù)慕涌诿帧M渌愋兔粯?,要筆描使用單詞縮寫。 F. O2-034要確保一對類/接口及其標準實現(xiàn)-Component類為例說明本條規(guī)范a) 示例public interface Icomponent public class Component : Icomponent2.5.1. 泛型類型參數(shù)的命名泛型是.NET框架2.0版的一個主要新特征,它引入了一種稱為類型參數(shù)(type parameter) 的新標識符。下面的規(guī)范描述了與類型參數(shù)有關(guān)的命名約定。A. O2-035要用描述性的名字來命名泛型類型參數(shù)-除非一個字母就足夠了,而且描述性的名字并不能增添什么價值B. A2-004考慮用T來命名參數(shù)類型如果類型只有一個類型參數(shù),且類型參數(shù)只有一個字母a) 示例public int Icomparepublic delegate bool Ptedicate(T item);public struct Nullable where T : structC. O2-036要給描述性的類型參數(shù)名加上T前綴a) 示例public interface TsessionChannel where Tsession:Tsession Tsession Session get; D. A2-005考慮在類型參數(shù)名中顯示出施加于該類型參數(shù)上的限制a) 示例可以把一個被限制為ISession的類型參數(shù)命名為TSession。2.5.2. 常用類型的命名如果要從.NET框架所包含的類型派生新類型,或者要實現(xiàn).NET框架中的類型,那么遵循本節(jié)中的規(guī)范是非常重要的。A. O2-037要遵循表2-3中描述的規(guī)范如果要從.NET框架的類型派生新類,或者要實現(xiàn).NET框架中的類型a) 解釋這些后綴的規(guī)范適用于某個特定的類型為基類的整個繼承層次。例如,不僅僅是直接派生自System.Exception的類型才需要后綴,那些派生自Exception的子來信的類型也需要。應(yīng)該把這些后綴留給那些在下表中列出的類型,對那么派生自或?qū)崿F(xiàn)其他類型的類型來說,不應(yīng)該使用這些后綴。b) 示例 表 2-3 派生自或?qū)崿F(xiàn)某些特定的核心類型的命名規(guī)則-基類 派生類型/實現(xiàn)類型的規(guī)范-System.Attribute 要給自定義的attribute 類添加“Attribute”后綴System.EventArgs 要添加“EventArgs”后綴 2.5.3. 枚舉類型的命名一般來說,枚舉類型(也稱為 enum)的命名應(yīng)該遵循標準的命名規(guī)則(PasacalCasing 大小寫風(fēng)格等等)。但是,還有另外一些針對枚舉類型的具體規(guī)范。 B. O2-038要用單數(shù)名字類命名枚舉類型,除非它表示的是位域(bit field) C. O2-039要用復(fù)數(shù)名詞來命名表示位域的枚舉類型,這樣的枚舉類型也稱為標記枚舉(flag enum)D. O2-040不要給枚舉類型的名字添加 “Enum” 后綴 a) 示例下面的命名就不好:public enum ColorEnum A. O2-041不要給枚舉類型的名字添加“Flag”或“Flags”后綴a) 示例下面的命名就不好:Flagspublic enum ColorFlags E. O2-042不要給枚舉類型值的名字添加前綴(例如,給ADD枚舉類型加“ad”前綴,給rich text 枚舉類型加“rtf” 前綴)2.6. 類型成員的命名類型由方法、屬性、事件、構(gòu)造函數(shù)以及字段等成員組成。下面幾節(jié)描述了為類型成員命名的規(guī)范。 2.6.1. 方法的命名方法是用來執(zhí)行操作的,框架設(shè)計的規(guī)范要求方法名必須是動詞或動詞詞組。它還用來把方法同屬性和類型名區(qū)分開,屬性和類型名是名詞或形容詞詞組。 F. O2-044要用動詞或動詞詞組來命名方法a) 示例public class Stringpublic int CompateTo;public string Trim(); 2.6.2. 屬性的命名 與其他成員不同,屬性應(yīng)該用名詞詞組或形容詞詞組來命名,這是因為屬性代表數(shù)據(jù),因此它的名字應(yīng)該反應(yīng)出這一點,在命名屬性時要始終使用PascalCasing 大小寫風(fēng)格。G. O2-045要用名詞、名詞詞組或形容詞來命名屬性H. O2-046不要讓屬性名看起來與“Get” 方法的名字相似,如下面的例子所示a) 示例public string TextWriter get. ; set public string GetTextWriter(int value)這中情況一般說明該屬性實際上應(yīng)該是一個方法。 I. O2-047要用肯定行的短語(CanSeek 而不是CantSeek)來命名布爾屬性。如果有幫助,還可以有選擇性地給布爾屬性添加“Is”、“Can”或”Has”等后綴J. A2-006考慮用屬性的類型名來命名屬性a) 示例下面這個屬性的作用是取得和設(shè)置一個名為Color的枚舉值,因此它被命名為Color: public Enum Color public class Control public Color Colorget ;set 2.6.3. 事件的命名 A. O2-048事件總是表示一些動作,要么是正在發(fā)生的,要么是已經(jīng)發(fā)生的。因此,時間和方法一樣要用動詞來命名,但除此之外,還要用動詞的動態(tài)來表示事件發(fā)生的時間B. O2-049要用現(xiàn)在時和過去時來賦予事件名以之前和之后的概念C. O2-050不要用“Before”或“After”前綴或后綴來區(qū)分前置事件和后置事件D. O2-051要在命名事件處理函數(shù)(用作事件類型的委托)時加上“EventHandler”后綴E. O2-052要在時間處理函數(shù)中用sender 和e作為兩個參數(shù)的名字a) 解釋參數(shù)sender表示觸發(fā)該事件的對象。雖然參數(shù)sender可以是一個更為具體的類型,但一般來說起類型就是object。整個.NET框架一致地使用了這個模式。F. O2-053要用動詞或動詞短語來命名事件G. O2-054要在命名事件的參數(shù)類時加上“EventArgs”后綴a) 示例public class ClickedEventArgs: EventArgsint x;int y;public ClickedEventArgs:EventArgs this.x=x;this.y=y;public int xget return x;public int yget return y; 2.6.4. 字段的命名 字段的名稱規(guī)范適用于靜態(tài)公有字段和靜態(tài)受保護字段。這些規(guī)范并未涵蓋內(nèi)部字段和私有字段,依據(jù)第5章描述的成員設(shè)計的規(guī)范,實例的公有字段或受保護字段是不允許使用的。H. O2-055要在命名字段時使用PascalCasing大小寫風(fēng)格I. O2-056要用名詞或名詞短語來命名字段J. O2-057不要給字段名添加前綴a) 示例不要用“g_” 來區(qū)分靜態(tài)和非靜態(tài)字段。 2.7. 參數(shù)的命名 遵循參數(shù)的命名規(guī)則是很重要的,除了可讀性這個顯而易見的原因之外,還因為參數(shù)會在文檔中顯示,另外如果可視化的設(shè)計工具提供了 Intellisense和類瀏覽功能的話,那么它們還會在設(shè)計工具中顯示。K. O2-058要在命名參數(shù)時使用camelCasing 大小寫風(fēng)格L. O2-059要使用具有描述性的參數(shù)名a) 解釋參數(shù)名應(yīng)該具備足夠的描述性,使得在大多數(shù)情況下,用戶根據(jù)參數(shù)的名字和類型就能夠確定它的意思??紤]根據(jù)參數(shù)的意思而不是參數(shù)的類型類命名參數(shù)。開發(fā)工具必須向用戶提供關(guān)于類型的有用信息,這樣用戶就能更好地利用參數(shù)名來描述語義,而不是描述類型。偶爾使用基于類型的參數(shù)是完全可以的,但在采用這些規(guī)范再回到匈牙利命名法則是絕對不應(yīng)該的。 2.8. 資源的命名 本地化的資源就好比是屬性,可以通過特定的對象來引用。因此,資源的命名規(guī)范與屬性的命名規(guī)范相似。M. O2-060要在命名資源關(guān)鍵字時使用PascalCasing大小寫風(fēng)格N. O2-061要使標識符的名字具有描述性而不是使名字變短O. O2-062應(yīng)該盡可能地使名字簡短,但前提是不能犧牲可讀性 P. O2-063不要使用各主要CLR編程語言特有的關(guān)鍵字Q. O2-064要在命名資源時僅使用字母、數(shù)字和下劃線R. O2-065要用點號給標識符清楚地劃分層次S. O2-066要在為異常的消息資源命名時遵循西面的命名約定T. O2-067資源標識符應(yīng)該是異常的類型名加上一個簡短的異常標識符,之間以點號分隔a) 解釋ArgumentException.IllegalCharactersArgumentException.InvalidNameArgumentException.FileNameIsMalformed 3. 編程風(fēng)格約定3.1. 通用風(fēng)格約定3.1.1. 花括號的使用A. 03-001要把左花括號放在下一條語句的開始a) 解釋if(someExpression)DoSomething();B. 03-002要使右花括號與左花括號所在行的行首對齊,除非花括號內(nèi)只有一條語句a) 解釋if(someExpression)DoSomething();C. 03-003要把右花括號放在新的一行的開始處a) 示例if(someExpression)DoSomething();D. A3-001考慮把只有一條語句的代碼塊和左右花括號寫在同一行中。屬性的訪問方法經(jīng)常使用這種風(fēng)格a) 示例public int Fooget return foo;setfoo=value; E. A3-002考慮把只有一個訪問方法的屬性的所有花括號寫在同一行中a) 示例public int Foogetreturn f00;F. 03-004要使右花括號單獨占一行,除非它后面是else、else if或whilea) 示例if(someExpression)doDoSomething();while(someOtherCondition);G. 03-005避免省略花括號,即使編程語言允許這樣做H. 03-006不應(yīng)該認為花括號是可以省略的,即使對只有一條語句的代碼塊,仍應(yīng)該使用花括號I. 03-007只有在極少數(shù)情況下才可以省略花括號,比如在原來僅有的一條語句后再添加新的語句是不可能的或是非常罕見的a) 解釋本條約定的另一個例外是case語句。由于case和break語句已經(jīng)表示了代碼塊的起始和結(jié)束,因此這些花括號可以被省略。在throw語句后再添加任何語句都是沒有意義的b) 示例If(someExpression) throw new ArgumentOutOfRangeException();Case 0:DoSomething();break; 3.1.2. 空格的使用A. 03-008要在左花括號之后和右花括號之前加一個空格a) 示例public int Foogetreturn f00;B. 03-009避免在左花括號之前加空格a) 示例最好如此:if(someExpression)可以接受;if(someExpression)C. 03-010要在形式參數(shù)之間的逗號后加一個空格a) 示例正確:public void Foo(char bar, int x, int y)錯誤:public void Foo(char bar,int x,int y)D. 03-011避免在實際參數(shù)之間加空格a) 示例最好如此:Foo(myChar,0,1)可以接受:Foo(myChar, 0, 1)E. 03-012避免在左圓括號之后或右圓括號之前加空格a) 示例最好如此:Foo(myChar,0,1)可以接受:Foo( myChar,0,1)F. 03-0113不要在成員的名字和左圓括號之間加空格a) 示例正確:Foo()錯誤:Foo()G. 03-014不要左方括號之后或右方括號之前加空格a) 示例正確:x=dataArrayindex;錯誤:x=dataArray index ;H. 03-015不要在控制流語句之前加空格a) 示例正確:while(x=y)錯誤: while (x=y)I. 03-016避免在二元操作符之前和之后加空格a) 示例最好如此:if(x=y)可以接受:if(x =y)J. 03-017不要在一元操作之前或之后加空格。a) 示例正確: if(!y)錯誤: if(! y)3.1.3. 縮進的使用A. 03-018不要用連續(xù)的空格符來進行縮進B. 03-019要用制表符(tab)來進行縮進C. 03-020要對代碼塊中的內(nèi)容進行縮進a) 示例if(someExpression)DoSomething();D. 03-021要對case代碼塊進行縮進,盡管沒有使用花括號a) 示例switch(someExpression)case 0:DoSomething();Break; 3.2. 注釋規(guī)范應(yīng)該用注釋來描述代碼的用意、大致的算法以及邏輯流程。最好的情況是,代碼編寫者之外的人能夠通過獨自閱讀注釋來理解函數(shù)的行為和目的。雖然注釋并不存在一個最低標準,而且一些非常短小的函數(shù)根本不需要注釋,但對大多數(shù)函數(shù)來說,通過注釋來反映程序員的意圖和所采用的方法仍然是值得的。A. 03-022不要用注釋來描述一些對任何人都顯而易見的事B. 03-023避免使用塊注釋語法(/*/)。即使注釋會有多行,也最好是使用單行注釋語法(/)C. 03-024不要把注釋放在行尾,除非注釋非常短3.2.1. 類屬性注釋在類的屬性必須以以下格式編寫屬性注釋a) 示例在類的屬性必須以以下格式編寫屬性注釋:/ / / 3.2.2. 方法注釋在類的方法聲明前必須以以下格式編寫注釋a) 示例/ / depiction:/ / param name=/ / 3.3. 文件的組織A. 03-025不要在一個源文件中包含一個以上的公用類型,除非有嵌套類,或各類型之間的不同之處僅在于泛型參數(shù)的數(shù)量a) 說明一個文件中有多個內(nèi)部類型是允許的。B. 03-026要用相同的名字來命名源文件及其包含的公用類型a) 解釋String類應(yīng)該在string.cs文件中,而ListT類則應(yīng)該在List.cs文件中。C. 03-027要用相同的層次結(jié)構(gòu)來組織文件目錄和命名空間。a) 解釋應(yīng)該把system.Collections.Generic.ListT的源文件放在SystemCollec-tionsGeneric目錄中。D. A3-003考慮根據(jù)下面給出的順序和組別來對成員進行分組l 所有字段。l 所有構(gòu)造函數(shù)。l 公有屬性及受保護的屬性。l 方法。l 事件。l 所有顯式實現(xiàn)的接口成員。l 內(nèi)部成員。l 私有成員。l 所有嵌套類型。E. 03-028要把不能公開訪問的成員和顯式實現(xiàn)的接口成員放在分別放在自己的#region塊中a) 示例#region internal members#endregion#region private members#endregionF. A3-004考慮在每個組別內(nèi)根據(jù)字母順序來組織成員G. A3-005考慮根據(jù)由簡單到復(fù)雜的順序來組織重載成員H. 03-029要把using指令放在命名空間的聲明之外a) 示例using Systerm;Namespace System.Collections4. 類型設(shè)計規(guī)范要確保每個類型由一組定義明確、相互關(guān)聯(lián)的成員組成,而不僅僅是一些無關(guān)功能的隨機集合。能用簡單的一句話來描述一個類型是非常重要的。一個好的定義應(yīng)該還能去除那些不怎么有關(guān)的功能。如果你為了使一個類型對某些人更有用而一下子增加了太多的成員,那么很可能你是在使這個類型對任何人都沒有用。4.1. 類型和命名空間在設(shè)計一個大型的框架之前,你應(yīng)該決定如何將功能劃分到一組功能域中,這些功能域由命名空間表示。為了確保一組有條理的命名空間包含的類型能很好地集成,不發(fā)生沖突,以及不會重復(fù),這樣的自頂向下的架構(gòu)設(shè)計是很重要的。當然命名空間的設(shè)計過程是迭代的,會隨著一個的版本中新類型的加入而進行調(diào)整。這導(dǎo)致了下面的規(guī)范。A. O4-001要用命名空間把類型組織成一個相關(guān)的特性域的層次結(jié)構(gòu)a) 示例該層次結(jié)構(gòu)應(yīng)該為開發(fā)人員更容易地瀏覽框架并找到想要的API而優(yōu)化。B. O4-002避免非常深的命名空間層次。這樣的層次難于瀏覽,因為用戶不得不經(jīng)常地回溯C. O4-003避免有太多的命名空間a) 解釋在最常見的場景中,框架的用戶應(yīng)該不需要導(dǎo)入許多的命名空間。只要有可該,就應(yīng)把常見場景中一起使用的類型放在一個單獨的命名空間中。D. O4-004避免把為高級場景而設(shè)計的類型和為常見編程任務(wù)而設(shè)計的類型放在同一個命名空間中a) 解釋這使得用戶不僅更容易地理解框架的基本概念,而且能更容易地在常見的場景中使用框架。E. O4-005不要不指定命名空間就定義類型a) 解釋這把相關(guān)的類型組織到一個層次結(jié)構(gòu)中,而且有助于解決可能存在的名字沖突。請注意命名空間有助于解決名字沖突的事實并不意味著應(yīng)該引入這樣的沖突。很少使用的類型應(yīng)該放在子命名空間中,以免攪亂主命名空間。我們確定了幾組類型,應(yīng)該把它們從主命名空間中分離出來。b) 示例System.Windows.Forms.DesignF. O4-006要用帶“.Design”后綴的命名空間來容納那些為基本命名空間提供設(shè)計時的功能的類型4.2. 類和結(jié)構(gòu)之間的選擇作為一條經(jīng)驗法則,框架中的大多數(shù)類型應(yīng)該是類。但是在有些情況下,由于值類型所具備的特征,使用結(jié)構(gòu)會更為合適。A. A4-001考慮
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源汽車電控工程師崗位面試問題及答案
- 2025屆重慶市主城四區(qū)高一下化學(xué)期末復(fù)習(xí)檢測試題含解析
- 廣西玉林、柳州市2025年高一下化學(xué)期末聯(lián)考模擬試題含解析
- 廣東省深圳市南山區(qū)南頭中學(xué)2025屆高二下化學(xué)期末預(yù)測試題含解析
- 江蘇省南京梅山高級中學(xué)2025年化學(xué)高二下期末檢測試題含解析
- 2025屆湖北省鄂東南五校一體聯(lián)盟聯(lián)考高二下化學(xué)期末質(zhì)量跟蹤監(jiān)視試題含解析
- 縣區(qū)培訓(xùn)材料管理辦法
- 跨境旅游品牌策略-洞察及研究
- 村級畜牧獸醫(yī)管理辦法
- 廈門采購方式管理辦法
- 外賣配送人員勞動合同
- 《義務(wù)教育數(shù)學(xué)課程標準(2022年版)》初中內(nèi)容解讀
- 精神疾病患者的麻醉管理
- 高一物理競賽試題及答案
- 醫(yī)院預(yù)約平臺建設(shè)方案
- 生命體征課件教學(xué)課件
- 2024年全國環(huán)保產(chǎn)業(yè)職業(yè)技能競賽(工業(yè)廢水處理工)考試題庫(含答案)
- 《烏魯木齊市國土空間總體規(guī)劃(2021-2035年)》
- HJ 651-2013 礦山生態(tài)環(huán)境保護與恢復(fù)治理技術(shù)規(guī)范(試行)
- SY-T 5333-2023 鉆井工程設(shè)計規(guī)范
- 冠脈介入進修匯報
評論
0/150
提交評論