1 現實中的問題
在任何一個公司,每個程序員編寫的習慣可能都是不一樣的,大到命名空間,小到變量的名字。甚至,我們去github,里面的大牛每個開源的項目的命名規則可能都不一樣。
我們通常會遇到下面的問題
1 一個webapi,版本1是一種寫法,版本2認知到版本1的寫法過於老舊又換了一種寫法
2 一個webapi,程序員老王習慣返回大寫,程序員小張喜歡返回小寫
3 各個業務類似的webapi,名字都不相同,例如供應商有的用vendor 有的用supplier 有的干脆用拼音
4 公司有實際的編碼規范,但檢測成本太高,久而久之,公司的規范也就作廢了
5 數據庫規范、編碼規范、api規范可能不盡相同,有沖突,制造了轉換成本
這實際上會給我們增加溝通成本,當遇到bug的時候,代價是巨大的。
前段實際阿里發布了java規范,可謂行業標桿,微軟為啥就沒有發布一個可推廣的編碼規范呢。
2 編碼規范的目的及基本情況
我認為編碼規范的目的是為了使代碼不依賴與代碼編寫者而存在。就是無限增加代碼的可讀性,易維護性。
我們不光要考慮程序代碼的可讀性還要考慮
1 數據庫的可讀性
2 程序代碼的可讀性
3 對外開放的api可讀性
這三種情況的業務場景對代碼規范又不盡相同。
數據庫
數據庫因為受限於數據庫軟件,需要強制對數據庫命名進行約束
SQL SERVER數據庫,目前在windows上已知的是沒有什么大小寫限制,在Linux上未知沒有試過
mysql 數據庫,推薦全部小寫,英文之間加下划線_,例如 useraddress 表示為user_address
oracle數據庫,推薦全部大寫,因為之間加下划線_,例如useraddress表示為 USER_ADDRESS
程序編碼
C# 基本上 類名UpperCamelCase,公共方法 UpperCamelCase 私有方法 LowerCamelCase
對外的API
json一般建議是的 小寫,下划線寫法
xml到時沒有什么特定的規范
我們這里要討論的是,這三種如何統一,如何轉換的問題
3 如何保證編碼規范的可執行性
任何脫離可執行的規范文件都是耍流氓
1.數據庫,我們可以編寫程序遍歷數據庫,檢測是否合規
2.代碼,可以使用Roslyn編寫分析器
4 C#代碼規范
C#代碼規范可以參考StyleCop做簡單的說明,一共171條規則,新版已經刪除了部分規則並新增了部分規則。一個規則可能有多個代碼分析器,所以實際上是看起來很多而已。
我們可以下載源碼對其進行修改編輯,形成自己公司的代碼規范。
SA1600 ElementsMustBeDocumented 元素必須添加注釋 SA1601 PartialElementsMustBeDocumented Partial修飾的成員必須添加注釋 SA1602 EnumerationItemsMustBeDocumented 枚舉必須添加注釋 SA1603 DocumentationMustContainValidXml 注釋必須合法(注釋中的關鍵字不能有錯誤) SA1604 ElementDocumentationMustHaveSummary 元素注釋必須包含Summary關鍵字 SA1605 PartialElementDocumentationMustHaveSummary Partial修飾的成員注釋必須包含Summary關鍵字 SA1606 ElementDocumentationMustHaveSummaryText Summary節點內部必須添加文本 SA1607 PartialElementDocumentationMustHaveSummaryText Partial修飾的成員注釋Summary節點內部必須添加文本 SA1608 ElementDocumentationMustNotHaveDefaultSummary Summary注釋不能使用編譯器自帶的注釋文本 SA1609 PropertyDocumentationMustHaveValue 屬性的注釋中必須包含<Value>節點 SA1610 PropertyDocumentationMustHaveValueText 屬性的注釋<Value>節點必須包含文本值 SA1611 ElementParametersMustBeDocumented 參數必須注釋 SA1612 ElementParameterDocumentationMustMatchElementParameters 參數的個數必須與注釋里的個數一致 SA1613 ElementParameterDocumentationMustDeclareParameterName 參數的注釋里必須有參數的名稱 SA1614 ElementParameterDocumentationMustHaveText 參數注釋節點里不能空着 SA1615 ElementReturnValueMustBeDocumented 返回值必須添加注釋 SA1616 ElementReturnValueDocumentationMustHaveText 返回值注釋的節點內必須有文本值 SA1617 VoidReturnValueMustNotBeDocumented 空返回值一定不能有返回值注釋 SA1618 GenericTypeParametersMustBeDocumented 生成的類型(泛型)參數必須有注釋 SA1619 GenericTypeParametersMustBeDocumentedPartialClass SA1618情況如果有Partial類存在都要有注釋 SA1625 ElementDocumentationMustNotBeCopiedAndPasted 各個參數的注解不能完全相同(避免copy SA1626 SingleLineCommentsMustNotUseDocumentationStyleSlashes 單行注釋不能采取三個斜線的注釋方式,斜線的個數必須是二的倍數 SA1627 DocumentationTextMustNotBeEmpty 注釋節點內部不能為空(必須有文本值) SA1628 DocumentationTextMustBeginWithACapitalLetter 注釋節點內部的文本必須以大寫字母開頭 SA1629 DocumentationTextMustEndWithAPeriod 注釋節點內部的文本必須英文的句號結束 SA1630 DocumentationTextMustContainWhitespace 注釋節點內部的文本必須包含空格 SA1631 DocumentationMustMeetCharacterPercentage 注釋節點內部的文本中不能包含過多的字符(舉例包含’---------------’是不允許的) SA1632 DocumentationTextMustMeetMinimumCharacterLength 已經作廢的規則,不允許有太短的字符串(如’Aname’中的A字母) SA1642 ConstructorSummaryDocumentationMustBeginWithStandardText 構造函數注釋標准 SA1643 DestructorSummaryDocumentationMustBeginWithStandardText 析構函數注釋標准 SA1644 DocumentationHeadersMustNotContainBlankLines 注釋中不能出現空白行 SA1645 IncludedDocumentationFileDoesNotExist 如果注釋中包含文件,要確定這個文件存在,舉例 SA1646 IncludedDocumentationXPathDoesNotExist 如果注釋中包含文件,路徑不存在。 SA1647 IncludeNodeDoesNotContainValidFileAndPath 如果注釋中包含文件文件與路徑都要合法 SA1648 InheritDocMustBeUsedWithInheritingClass 這項不明白是什么意思,還請知道的分享給我,謝謝。 SA1649 FileHeaderFileNameDocumentationMustMatchTypeName 文件頭注釋必須匹配類型 SA1650 ElementDocumentationMustBeSpelledCorrectly 注釋不能有拼寫錯誤(對中文支持不好,不建議使用該項) SA1651 DoNotUsePlaceholderElements 不要使用Placeholder元素 SA1500 BracesForMultiLineStatementsMustNotShareLine 當存在多行程序的時候,花括號不能再同一行。 SA1501 StatementMustNotBeOnASingleLine 語句不能共享一行 SA1502 ElementMustNotBeOnASingleLine 元素不能共享一行 SA1503 BracesMustNotBeOmitted 花括弧即使在單行代碼的情況下也不能省略。 SA1504 AllAccessorsMustBeSingleLineOrMultiLine 讀寫屬性,要么在同一行業要么在分多行寫,不可規則不統一(個人建議分多行寫)。 SA1505 OpeningBracketsMustNotBeFollowedByBlankLine 開始的花括弧后面不能有空白行 SA1506 ElementDocumentationHeadersMustNotBeFollowedByBlankLine 元素頭部注釋跟元素之間不能有空白行 SA1507 CodeMustNotContainMultipleBlankLinesInARow 不允許有多行空白行緊挨着(個人建議寫一個空白行即可) SA1508 ClosingCurlyBracketsMustNotBePrecededByBlankLine 結尾的花括弧不能再一個空白行之前 SA1509 OpeningBracketsMustNotBePrecededByBlankLine 開始的花括弧不能再一個空白行之前 SA1510 ChainedStatementBlocksMustNotBePrecededByBlankLine 相連的語句之間不能有空白行,如try語句與catch語句之間不能有空白行 SA1511 WhileDoFooterMustNotBePrecededByBlankLine 與SA1510相同,Do語句與While語句之間不能有空白行 SA1512 SingleLineCommentsMustNotBeFollowedByBlankLine 單行注釋不能后跟空白行 SA1513 ClosingBracketMustBeFollowedByBlankLine 結束花括弧之后必須有一個空白行 SA1514 ElementDocumentationHeaderMustBePrecededByBlankLine 頭部注解之前必須有一個空白行 SA1515 SingleLineCommentMustBePrecededByBlankLine 單行注釋之前要有一個空白行,還一種方法是不加空白行而用四個斜線注釋”////”建議采取第一種方法 SA1516 ElementsMustBeSeparatedByBlankLine 鄰近的元素之間要有一個空白行 SA1517 CodeMustNotContainBlankLinesAtStartOfFile 代碼文件頭部字符之前不能出現空白行 SA1518 CodeMustNotContainBlankLinesAtEndOfFile 代碼文件尾部字符之后不能出現空白行 SA1119 StatementMustNotUseUnnecessaryParenthesis 語句中不可以出現多余的括弧,無意義的括弧增加了代碼的可讀性 SA1400 AccessModifierMustBeDeclared 必須定義訪問修飾符 SA1401 FieldsMustBePrivate 字段必須定義為私有的 SA1402 FileMayOnlyContainASingleClass 一個CS文件里只定義一個類 SA1403 FileMayOnlyContainASingleNamespace 一個CS文件只包含一個命名空間 SA1404 CodeAnalysisSuppressionMustHaveJustification Suppression特性(取消報告特定的靜態分析工具規則沖突,允許一個代碼項目上應用多個取消報告設置)必須要有合理理由 SA1405 DebugAssertMustProvideMessageText 參見代碼:“Debug.Assert(value != true"The value must always be true.");” SA1406 DebugFailMustProvideMessageText 參見代碼:“Debug.Fail("The code should never reach this point.");” SA1407 ArithmeticExpressionsMustDeclarePrecedence 算數表達式必須用明確的標明其優先級(此條與SA1119沖突) SA1408 ConditionalExpressionsMustDeclarePrecedence 條件表達式必須明確的標明其優先級(此條與SA1119沖突) 舉例:“if (x || (y && z && a) || b)” SA1409 RemoveUnnecessaryCode 移除無用的代碼 SA1410 RemoveDelegateParenthesisWhenPossible 調用一個c#匿名方法不包含任何方法參數必須要包括一個空括號(本人不建議使用匿名方法 SA1411 AttributeConstructorMustNotUseUnnecessaryParenthesis 特性構造函數如果是空參的形式,不要包括那個空括號 SA1412 StoreFilesAsUtf8 文件是否已utf8格式存儲 SA1413 UseTrailingCommasInMultiLineInitializers 初始化對象變量之間使用逗號隔開 SA1300 ElementMustBeginWithUpperCaseLetter 首字母必須大寫(個人理解應該是字段以外的東西) SA1301 ElementMustBeginWithLowerCaseLetter 不會出現的情況 SA1302 InterfaceNamesMustBeginWithI 接口必須以“I”字母開頭 SA1303 ConstFieldNamesMustBeginWithUpperCaseLetter Const 常量首字母大寫 SA1304 NonPrivateReadonlyFieldsMustBeginWithUpperCaseLetter 非私有非制度的字段必須首字母大寫 SA1305 FieldNamesMustNotUseHungarianNotation 除了列表外的字符不可以出現匈牙利命名規則在”Style Setting”里的” Hungarian”Tab里設置 SA1306 FieldNamesMustBeginWithLowerCaseLetter 字段名必須首字母小寫 SA1307 AccessibleFieldsMustBeginWithUpperCaseLetter public或者internal字段首字母大寫 SA1308 VariableNamesMustNotBePrefixed 變量名不能有前綴 SA1309 FieldNamesMustNotBeginWithUnderscore 字段名不能以下滑線開頭 SA1310 FieldNamesMustNotContainUnderscore 字段名不能包括下滑線 SA1311 StaticReadonlyFieldsMustBeginWithUpperCaseLetter static與readonly字段首字母大寫 SA1312 VariableNamesMustBeginWithLowerCaseLetter 變量名必須是駝峰命名法 SA1313 ParameterNamesMustBeginWithLowerCaseLetter 參數名稱必須是駝峰命名法 SA1314 TypeParameterNamesMustBeginWithT 類型變量必須以T開頭 SX1309 FieldNamesMustBeginWithUnderscore 字段名稱必須是下划線開頭 這是netcore中官方建議的的編寫 SX1309S StaticFieldNamesMustBeginWithUnderscore 靜態字段名稱必須是下划線開頭 這是netcore中官方建議的的編寫 SA1200 UsingDirectivesMustBePlacedWithinNamespace using部分必須在Namespace內部 SA1201 ElementsMustAppearInTheCorrectOrder 所有的元素必須出現在正確的位置上(個人不建議使用該規則,用region把一個類文件里的元素分好組即可,字段 SA1202 ElementsMustBeOrderedByAccess 元素的修飾符有一個固定的順序(個人不建議使用該規則,用region把一個類文件里的元素分好組即可,字段 SA1203 ConstantsMustAppearBeforeFields 常量字段擺放在其它字段之上 SA1204 StaticElementsMustAppearBeforeInstanceElements Static 元素擺放在前面 SA1205 PartialElementsMustDeclareAccess Partial 修飾的元素必須聲明讀寫權限 SA1206 DeclarationKeywordsMustFollowOrder 舉例 SA1207 ProtectedMustComeBeforeInternal Protected在Internal之前 SA1208 SystemUsingDirectivesMustBePlacedBeforeOtherUsingDirectives 系統級的引用在其他引用之前(格式化代碼就會自動按照這個規則編排using部分) SA1209 UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives using部分起別名的在最后排布 SA1210 UsingDirectivesMustBeOrderedAlphabeticallyByNamespace using部分按照字母順序編排 SA1211 UsingAliasDirectivesMustBeOrderedAlphabeticallyByAliasName 別名的按照別名的字母編排 SA1212 PropertyAccessorsMustFollowOrder 屬性按照先get在set SA1213 EventAccessorsMustFollowOrder 時間先remove在add SA1214 StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements StaticReadonly元素在StaticNonReadonly元素之前 SA1216 UsingStaticDirectivesMustBePlacedAtTheCorrectLocation 靜態指令按順序放 SA1217 UsingStaticDirectivesMustBeOrderedAlphabetically 靜態指令按順序放 SA1100 DoNotPrefixCallsWithBaseUnlessLocalImplementationExists SA1101 PrefixLocalCallsWithThis ‘this.’前綴不能省略 SA1106 CodeMustNotContainEmptyStatements 不允許有空白的聲明 SA1107 CodeMustNotContainMultipleStatementsOnOneLine 同一行里不允許出現多個聲明語句 SA1108 BlockStatementsMustNotContainEmbeddedComments 非法用例 SA1109 BlockStatementsMustNotContainEmbeddedRegions 非法用例 SA1110 OpeningParenthesisMustBeOnDeclarationLine 方法開始的括弧要在聲明的那一行 SA1111 ClosingParenthesisMustBeOnLineOfLastParameter 方法結束括弧與最后一個參數同行 SA1112 ClosingParenthesisMustBeOnLineOfOpeningParenthesis 如果是空參的情況,開始於結束括弧在同一行 SA1113 CommaMustBeOnSameLineAsPreviousParameter 逗號必須與前一個參數同行 SA1114 ParameterListMustFollowDeclaration 確保參數列表與開始括號同行,或者另起一行 參數整體要在同一行 SA1115 ParameterMustFollowComma 參數與參數之間不能隔空白行 SA1116 SplitParametersMustStartOnLineAfterDeclaration 所有參數在同一行或者如下示例 SA1117 ParametersMustBeOnSameLineOrSeparateLines 同上 SA1118 ParameterMustNotSpanMultipleLines 實際調用是參數要在同一行 SA1120 CommentsMustContainText 注釋必須節點內部必須有文本 SA1121 UseBuiltInTypeAlias 使用內嵌的類型別名 SA1122 UseStringEmptyForEmptyStrings 示例代碼:“string s = string.Empty;”不能寫成” string s = ""; ” SA1123 DoNotPlaceRegionsWithinElements 不使用region(個人較反對這條,個人傾向於用region規整類里的元素) SA1124 DoNotUseRegions 不使用region(個人較反對這條,個人傾向於用region規整類里的元素) SA1125 UseShorthandForNullableTypes 使用簡寫版的可空類型 如”int?” SA1126 PrefixCallsCorrectly 調用類成員的時候要帶上“this”前綴 SA1127 GenericTypeConstraintsMustBeOnOwnLine 泛型約束必須在同一行 SA1128 ConstructorInitializerMustBeOnOwnLine 同上 SA1129 DoNotUseDefaultValueTypeConstructor 不要使用默認值類型構造函數。 SA1130 UseLambdaSyntax 使用Lambda表達式 SA1131 UseReadableConditions 使用可讀的條件 SA1132 DoNotCombineFields SA1133 DoNotCombineAttributes SA1134 AttributesMustNotShareLine SA1136 EnumValuesShouldBeOnSeparateLines SA1137 ElementsShouldHaveTheSameIndentation SA1139 UseLiteralSuffixNotationInsteadOfCasting SX1101 DoNotPrefixLocalMembersWithThis SA1000 KeywordsMustBeSpacedCorrectly 關鍵字不能拼寫錯誤 SA1001 CommasMustBeSpacedCorrectly 逗號前面擺放一個空格 SA1002 SemicolonsMustBeSpacedCorrectly 分號前面擺放一個空格 SA1003 SymbolsMustBeSpacedCorrectly 操作符與元素之間不加空格 SA1004 DocumentationLinesMustBeginWithSingleSpace “///”注釋的每一行以一個空格開頭 SA1005 SingleLineCommentsMustBeginWithSingleSpace 單行注釋以一個空格開頭 SA1006 PreprocessorKeywordsMustNotBePrecededBySpace 預處理關鍵字內部不允許出現空格 如“# if Debug”是不允許的 SA1007 OperatorKeywordMustBeFollowedBySpace 操作必須要在一個空格之后 SA1008 OpeningParenthesisMustBeSpacedCorrectly 開始括弧放置合理的空格 SA1009 ClosingParenthesisMustBeSpacedCorrectly 結尾括弧放置合理的空格 SA1010 OpeningSquareBracketsMustBeSpacedCorrectly 開始方括號放置合理的空格 SA1011 ClosingSquareBracketsMustBeSpacedCorrectly 結束方括號放置合理的空格 SA1012 OpeningCurlyBracketsMustBeSpacedCorrectly 開始花括號放置合理的空格 SA1013 ClosingCurlyBracketsMustBeSpacedCorrectly 結束花括號放置合理的空格 SA1014 OpeningGenericBracketsMustBeSpacedCorrectly 同上 SA1015 ClosingGenericBracketsMustBeSpacedCorrectly 同上 SA1016 OpeningAttributeBracketsMustBeSpacedCorrectly 特性開始括號同上 SA1017 ClosingAttributeBracketsMustBeSpacedCorrectly 特性結尾括號同上 SA1018 NullableTypeSymbolsMustNotBePrecededBySpace 空類型前不放置空格 SA1019 MemberAccessSymbolsMustBeSpacedCorrectly 成員訪問關鍵字前后有空格 SA1020 IncrementDecrementSymbolsMustBeSpacedCorrectly 自增自減關鍵字要有空格 SA1021 NegativeSignsMustBeSpacedCorrectly 負號要有空格 SA1022 PositiveSignsMustBeSpacedCorrectly 正號要有空格 SA1023 DereferenceAndAccessOfMustBeSpacedCorrectly SA1024 ColonsMustBeSpacedCorrectly 冒號運算符要有空格 SA1025 CodeMustNotContainMultipleWhitespaceInARow 同一行不允許出現多個空格 SA1026 CodeMustNotContainSpaceAfterNewKeywordInImplicitlyTypedArrayAllocation new關鍵字之后不允許出現空格 SA1027 TabsMustNotBeUsed 不用tab字符 SA1028 CodeMustNotContainTrailingWhitespace 代碼后面不能有空格 SA0001 XmlCommentAnalysisDisabled 禁用XML注釋 SA0002 InvalidSettingsFile 無效的配置文件