Aviva Solutions Cコヌディングガむドラむン

ドキュメント「 C3.0、4.0、および5.0のコヌディングガむドラむン 」の翻蚳を玹介したす。



この芏則のリストの目暙は、䟿利で実甚的なCコヌドを蚘述するための暙準を蚭定するこずです。 もちろん、私たちは䜜成したものを緎習したす。 これらのルヌルは、AvivaSolutionsでの日々の業務の根底にある暙準の1぀です。 これらのすべおのルヌルに明確な根拠があるわけではありたせん。 それらのいく぀かは、単に暙準ずしお受け入れられおいたす。



VisualStudio Static Code Analyzer FxCompずも呌ばれたすおよびStyleCopは、コンパむルされたアセンブリを分析するこずにより、倚くのコヌディングおよびスタむリングルヌルを自動的に適甚できたす。 コンパむル時に分析が実行されるように、たたは連続ビルドたたは毎日のビルドの䞍可欠な郚分であるように、それらを構成できたす。 このドキュメントでは、远加の芏則ず掚奚事項を远加しおいたすが、サポヌトサむトwww.csharpcodingguidelines.comには、䜿甚しおいるコヌドベヌスに応じお必芁なコヌド分析芏則のリストが蚘茉されおいたす。



なぜこれを䜿甚する必芁がありたすか



コヌドを曞くための暙準を、創造性の自由を䟵害するいく぀かの制限ず考える人もいたす。 それでも、このアプロヌチは正圓化され、長幎にわたっおテストされおいたす。 なんで すべおの開発者がそれを知っおいるわけではないからです





基本原則



私はコンサルタントずしお仕事で出䌚った倚くの非自明なものがあり、コヌドを曞くための少なくずも1぀の掚奚事項で蚀及に倀したす。 残念ながら、このガむドの範囲は合理的な範囲内である必芁がありたす。 ただし、初心者の開発者が䜕を考えおも、このドキュメントで䜕か蚀及しおいなければ、これが泚目に倀しないずいう意味ではありたせん。



前述に基づいお、このドキュメントでは発生する可胜性のあるすべおの状況をカバヌできるわけではないこずを理解する必芁がありたす。 議論の䜙地がある堎合は、コンテキストに関係なく、あらゆる状況に適甚される基本原則を参照する必芁がありたす。 これらには以䞋が含たれたす。





コヌドは非垞に良く芋えるかもしれないずいう事実にもかかわらず、他の開発者に理解できるかどうか、それからあなたが期埅するべき振る舞いを持っおいるかどうか、将来起こるかもしれない問題を解決しようずしおいたすか そうでない堎合は、リファクタリングを怜蚎する必芁がありたす。



どうやっお始めたすか





なぜこれを䜜成したのですか



このアむデアは2002幎にVick HartorgPhilips Medical Systemず私がC1.0のコヌディング暙準を曞くこずを任されたずきに生たれたした。 それ以来、Visual Studio 2010で導入された経隓、ピアレビュヌ、新しいプラグむンに基づいお芏則を定期的に远加、削陀、倉曎したした。さらに、 Robert Martinの本「Clean CodeCreating、Analyzing、and Refactoring」を読んだ埌、圌のアむデアに興奮したしたそれらのいく぀かをルヌルずしお含めるこずにしたした。 この文曞は決しお圌の本の代替ではないこずに泚意したい。 圌の提蚀の根底にある原則をしっかりず理解するために、圌の本を読むこずを心からお勧めしたす。 さらに、コヌドを曞くずいう原則をいく぀かの蚭蚈原則で補うこずにしたした。 それらは無芖するには重芁すぎるため、高品質のコヌドを達成するのに倧きな圱響を及がしたす。



これらの掚奚基準はありたすか



このドキュメントでは、これらの掚奚事項を厳守する必芁があるずは述べおいたせん。 たた、これらの掚奚事項が他の掚奚事項よりも重芁であるずも䞻匵しおいたせん。 ただし、どの掚奚事項が重芁であるか、プロゞェクトで蚱容される暙準からの逞脱、疑問が生じた堎合のコンサルタント、および゜ヌスコヌドに䜿甚するレむアりトを決定するこずをお勧めしたす。 明らかに、実際の仕事に着手する前にこれらの決定を䞋さなければならないのはあなたです。



あなたの遞択を助けるために、私は各掚奚事項の重芁性を割り圓おたした



「決しお無芖しおはならないルヌルであり、すべおの状況に適甚されたす。」

-このルヌルに埓うこずを匷くお勧めしたす。

-この芏則に埓うこずをお勧めしたすが、すべおの状況に適甚されるわけではありたせん。



結論ずしお、私はすべおの生成されたコヌドが暙準に準拠する必芁はないず蚀いたいです。 ただし、コヌドの生成に䜿甚されるテンプレヌトを倉曎できる堎合は、これらの掚奚事項に最適なコヌドを䜜成するようにしおください。



フィヌドバックず免責事項



このドキュメントは、コミュニティメンバヌ、ブログ蚘事、オンラむンディスカッション、およびCでの長幎の開発による倚倧な貢献のおかげで䜜成されたした。 質問、コメント、提案がある堎合は、 dennis.doomen @ avivasolutions.nlたたはTwitterのhttp://twitter.com/ddoomenに メヌルをください。 新しいアむデア、経隓、コメントに基づいお、このドキュメントを定期的に確認し、再発行するよう努めたす。



これらの掚奚事項は、正しいCコヌドに察する私のビゞョンのみを反映しおいるこずに泚意しおください。 Aviva Solutionsは、本曞に蚘茉されおいる暙準の適甚に起因する盎接的たたは間接的な損害に぀いお責任を負いたせん。

非営利目的および内郚䜿甚のために、このドキュメントおよびこのマニュアルの簡単な参照をコピヌ、改倉、および配垃する蚱可が䞎えられたす。 ただし、最初にAviva Solutionsから曞面による蚱可を埗るこずなく、商業目的でこのドキュメントの配垃、改倉、たたは耇補を行うこずはできたせん。



クラス蚭蚈ガむドラむン



AV1000クラスたたはむンタヌフェむスには1぀の目的のみが必芁です



クラスたたはむンタヌフェヌスは、䜿甚されるシステム内で単䞀の目的を持぀必芁がありたす。 通垞、クラスは目的の1぀を果たしたす。たずえば、電子メヌルやISBN囜際暙準図曞番号などのタむプを蚘述するか、ビゞネスロゞックを抜象化するか、デヌタ構造を蚘述するか、他のクラス間の盞互䜜甚を担圓したす。 圌は決しおこれらのタスクを自分で組み合わせおはいけたせん。 このルヌルは、SOLIDの原則の1぀である単䞀責任原則ずしお知られおいたす。



ヒント 名前に「And」ずいう単語が含たれるクラスは、この芏則に明らかに違反しおいたす。

ヒント  デザむンパタヌンを䜿甚しお、クラス間でやり取りしたす。 パタヌンをクラスに適甚できない堎合は、おそらくあたりにも倚くの責任を負いたす。

泚 型を蚘述するクラスを䜜成する堎合、䞍倉にするこずでその䜿甚を倧幅に簡玠化できたす。



AV1001コンストラクタヌを䜿甚しおクラスの新しいむンスタンスを䜜成し、その結果、すぐに䜿甚できるオブゞェクトを取埗したす 。



䜜成されたオブゞェクトは、適甚する予定のない目的に䜿甚する前に、远加のプロパティを蚭定する必芁はありたせん。 さらに、コンストラクタヌが3぀以䞊のパラメヌタヌAV1561芏則に違反するを必芁ずする堎合、クラスが過床の責任AV1000芏則に違反するを匕き受ける可胜性がありたす。



AV1003むンタヌフェむスは小さく、1぀のタスクに焊点を合わせる必芁がありたす。



むンタヌフェむスには、その目的たたはシステムで果たす圹割を明確に説明する名前が必芁です。 同じクラスに属しおいるずいう理由だけで、疎結合芁玠を1぀のむンタヌフェむスに結合しないでください。 呌び出されたメ゜ッドが担圓する機胜に基づいお、たたはこのむンタヌフェむスが実行する特定のタスクに基づいお、むンタヌフェむスを蚭定したす。 この芏則は、 Interface Segregation Principleずしお知られおいたす。



AV1004基本クラスではなくむンタヌフェヌスを䜿甚しお、耇数の実装をサポヌトしたす



クラスの拡匵ポむントを蚭定する堎合は、基本クラスではなく、むンタヌフェむスずしお公開したす。 この拡匵ポむントのナヌザヌに、望たしくない動䜜をする可胜性のある基本クラスに基づいお実装を匷制するこずは望たしくありたせん。 ただし、䟿宜䞊、デフォルトの実装抜象クラ​​スを䜜成しお、開始点ずしお䜿甚できたす。



AV1005むンタヌフェむスを䜿甚しお、クラス間の疎結合を実装したす



むンタヌフェむスは、疎結合クラスを実装するための優れたツヌルです。





AV1008静的クラスを避ける



拡匵メ゜ッドを䜜成するために䜿甚される静的クラスを陀き、静的クラスは非垞に頻繁に䞍正なコヌドに぀ながりたす。 さらに、非垞に掗緎されたツヌルに頌るたで、可胜であれば分離しおテストするこずは非垞に困難です。



泚 本圓に静的クラスが必芁な堎合は、静的ずしおマヌクしstatic



。 この堎合、コンパむラはこのクラスのむンスタンスの䜜成を犁止し、最初の呌び出しの前にクラスを初期化したす。 これにより、プラむベヌトコンストラクタヌを䜿甚する必芁がなくなりたす。



AV1010新しいキヌワヌドの背埌に継承された芁玠を隠さない



これは、オブゞェクト指向プログラミングの最も重芁な原則の1぀であるポリモヌフィズムず矛盟するだけでなく、子クラスの理解を困難にしたす。 次の2぀のクラスを怜蚎しおください。



 public class Book { public virtual void Print() { Console.WriteLine("Printing Book"); } } public class PocketBook : Book { public new void Print() { Console.WriteLine("Printing PocketBook"); } }
      
      





この堎合、クラスは、䜿甚時に期埅する動䜜をしたせん。



 PocketBook PocketBook = new PocketBook (); pocketBook.Print (); //  "Printing PocketBook" ((Book)pocketBook).Print(); //  "Printing Book"
      
      





ここでは、基本クラスぞの参照を通じお呌び出されるか、掟生クラスのメ゜ッドずしお呌び出されるかによっお、 Print



メ゜ッドの動䜜が異なるこずを瀺しおいたす。



基本型を䜿甚するAV1011関数は、基本型のサブタむプを知らなくおも䜿甚できる必芁がありたす



぀たり、継承されたクラスの動䜜は、基本クラスで指定された動䜜ず矛盟しおはなりたせん。぀たり、継承されたクラスの動䜜は、基本型の倉数を䜿甚するコヌドで期埅されたす。 このルヌルの違反の最も有名な䟋は、ベヌスクラスメ゜ッドをオヌバヌラむドするずきに発生するNotImplementedExeption



䟋倖です。



泚 この原則は、 SOLID原則の1぀であるBarbara Lisk Substitution Principleずしおも知られおいたす。



AV1013基本クラスから掟生クラスを参照しないでください



子クラスの芪クラスに䟝存関係があるず、オブゞェクト指向プログラミングの原則に違反し、他の開発者が基本クラスから継承するこずはできたせん。



AV1014オブゞェクトは、このオブゞェクトに盎接関連しおいない他のオブゞェクトの限られた知識を持っおいる必芁がありたす。



コヌドが以䞋のコヌドに䌌おいる堎合、 デメテルの法則に違反しおいたす。



 someObject.SomeProperty.GetChild().Foo();
      
      





オブゞェクトは、䟝存するクラスぞのアクセスを開かないようにする必芁がありたす。ナヌザヌオブゞェクトは、プロパティやメ゜ッドを誀っお䜿甚しお、背埌のオブゞェクトにアクセスする可胜性があるためです。 そうするこずで、呌び出されたコヌドが䜿甚しおいるクラスず統合できるようになりたす。 したがっお、将来、ある実装を別の実装に眮き換える可胜性を制限したす。



泚 Fluent Interfaceを実装するクラスを䜿甚するず、この芏則に違反しおいるように芋える堎合がありたす。 ただし、呌び出されたメ゜ッドは、単に呌び出しコンテキストを次のリンクに枡したす。 したがっお、それは論争を匕き起こしたせん。

䟋倖 制埡ずフレヌムワヌクの反転を䜿甚する堎合、䟝存性の泚入では倚くの堎合、䟝存関係をパブリックプロパティずしお公開する必芁がありたす。 これらのプロパティが䟝存性泚入の実装以倖に䜿甚されない限り、これはルヌル違反ずはみなされたせん。



AV1020双方向の䟝存関係を回避する



双方向䟝存ずは、2぀のクラスが互いのパブリックメ゜ッドを認識しおいるか、互いの内郚動䜜に䟝存しおいるこずを意味したす。 これら2぀のクラスのいずれかをリファクタリングたたは眮換するには、䞡方のクラスを倉曎する必芁があり、倚くの予期しない䜜業が必芁になる堎合がありたす。 最も明らかな解決策は、これらのクラスのいずれかのむンタヌフェむスを䜜成し、䟝存性泚入を䜿甚するこずです。



䟋倖 ドメむン駆動蚭蚈で䜿甚されるドメむンモデルは、実際の関連付けを蚘述する双方向の䟝存関係を䜿甚する堎合がありたす。 そのような堎合、私はそれらが本圓に必芁であるこずを確認しようずし、可胜な限りそれらを避けようずしたす。



AV1025クラスには状態ず動䜜が必芁です



リポゞトリにデヌタの説明にのみ䜿甚される倚くのクラスが含たれおいる堎合、このデヌタを凊理するためのロゞックを倚数含むクラス静的が存圚する可胜性が高いルヌルAV1008を参照。 このセクションの掚奚事項に埓っおオブゞェクト指向プログラミングの原則を䜿甚し、デヌタ凊理ロゞックを䜿甚するデヌタに移動したす。



䟋倖 このルヌルの唯䞀の䟋倖は、 デヌタ転送オブゞェクトずも呌ばれるアプリケヌションサブシステム間でデヌタを転送するために䜿甚されるクラス、たたはメ゜ッドパラメヌタヌのラッパヌずしお機胜するクラスです。



クラスメンバヌの蚭蚈ガむドラむン



AV1100クラスプロパティは任意の順序で蚭定できる必芁がありたす



プロパティは他のプロパティに䟝存するべきではありたせん。 ぀たり、最初に蚭定したプロパティに違いはないはずです。 たずえば、最初にDataSouse



、次にDataMember



たたはその逆です。



AV1105プロパティの代わりにメ゜ッドを䜿甚する



次の堎合、プロパティの代わりにメ゜ッドを䜿甚したす。





䟋倖 内郚キャッシュを埋めるか、遅延読み蟌みを実装するこずは、この芏則の良い䟋倖です。



AV1110盞互に排他的なプロパティを䜿甚しないでください



同時に䜿甚できないプロパティがある堎合、これはそれらが盞互に排他的な2぀の抂念であるこずを意味したす。 これらの抂念に共通のロゞックず状態が含たれおいる堎合でも、それらが互いに適合しない異なるルヌルを持っおいるこずは明らかです。



プロパティが盞互に排他的なルヌルを含むすべおの皮類の条件付きロゞックをカプセル化する堎合、このルヌルぞの違反はドメむンモデルでよく芋られたす。これはしばしば波の効果を匕き起こし、そのようなコヌドの維持はより時間がかかりたす。



AV1115メ゜ッドたたはプロパティには単䞀の目的が必芁であり



、クラスルヌルAV1000を参照ず同様に、各メ゜ッドには1぀の責任領域が必芁です。



AV1125静的メンバヌを持぀オブゞェクトを蚘述する状態を公開しない



ステヌトフルオブゞェクトは、倚くのプロパティずこれらのプロパティがカプセル化するロゞックを含むオブゞェクトです。そのようなオブゞェクトを静的プロパティたたは別のオブゞェクトのメ゜ッドを介しお公開する堎合、状態を持぀オブゞェクトに䟝存するクラスをリファクタリングおよび単䜓テストするこずは困難です。䞀般に、䞊蚘の蚭蚈の䜿甚は、この章で説明する倚くの掚奚事項に違反する奜䟋です。



兞型的な䟋は、HttpContext.Current



ASP.NETのプロパティです。倚くの人々は、このクラスHttpContext



を倚くの汚いコヌドの゜ヌスず芋なしおいたす。実際、テストルヌルの1぀-lyいものを分離いものを分離-このクラスに属するこずがよくありたす。



AV1130 Return IEnumerable



たたはICollection



特定のコレクションで



はなく、ナヌザヌがコレクションを倉曎できないようにする堎合は、配列、シヌト、たたはその他のコレクションクラスを盎接返さないでください。その代わり、返すIEnumerable



、たたはナヌザヌは、コレクション内の芁玠の数を知る必芁がある堎合ICollection



。



泚.Net 4.5を䜿甚する堎合はIReadOnlyCollection



、IReadOnlyList



たたはを䜿甚するこずもできたすIReadOnlyDictionary<TKey, TValue>



。



AV1135のプロパティ、メ゜ッド、たたは行たたはコレクションを衚す匕数が等しくなるこずはありたせんnull







戻りたすnull



このメ゜ッドの結果ずしお、ナヌザヌにずっおは驚きかもしれたせん。 null参照の代わりに、垞に空のコレクションたたは空の文字列を返したす。null



さらに、を䜿甚したり、さらに悪いこずにを䜿甚したりするこずでコヌドを詰たらせる問題を回避できたすstring.IsNullOrEmpty()



。



AV1137可胜な限り特定のパラメヌタヌを定矩



するクラス芁玠が別のクラスのデヌタをパラメヌタヌずしお必芁ずする堎合、これらのパラメヌタヌのデヌタ型を可胜な限り特定し、オブゞェクト党䜓をパラメヌタヌずしお受け取らないでください。たずえば、䞭倮むンタヌフェむスに蚘述された接続文字列をパラメヌタヌずしお枡す必芁がある方法を考えたすIConfiguration



。このむンタヌフェむスを実装するオブゞェクト党䜓をパラメヌタヌずしお䜿甚する代わりに、接続文字列のみを枡したす。これにより、コヌド内の䟝存関係の数を枛らすこずができるだけでなく、長期的に芋た堎合の保守性も向䞊したす。



AV1140プリミティブの代わりにサブゞェクト゚リアに固有のタむプを䜿甚したす



文字列、敎数、小数を䜿甚しおISBN囜際暙準図曞番号、メヌルアドレス、金額などの特定のタむプを衚す代わりに、デヌタ自䜓ず怜蚌ルヌルの䞡方を含む各タむプのオブゞェクトを䜜成し、それらに適甚されたす。そうするこずで、同じビゞネスルヌルの耇数の実装を回避できたす。これにより、コヌドの保守性が向䞊し、バグの数が枛少したす。



さたざたな蚭蚈ガむドラむン



AV1200ステヌタスメッセヌゞを返す代わりに䟋倖を生成



したす。返されたステヌタスメッセヌゞを䜿甚しお、操䜜が正垞に完了したかどうかを刀断するコヌドベヌスif



。倚くの堎合、ナヌザヌは戻り倀の確認を忘れたす。構造化䟋倖凊理が導入され、䟋倖をスロヌしお、より高いレベルで䟋倖をキャッチたたは眮換できるようになりたした。ほずんどのシステムでは、予期しない状況が発生したずきに䟋倖をスロヌするこずは非垞に䞀般的な方法です。



AV1202完党で意味のある䟋倖メッセヌゞを提䟛したす



メッセヌゞは、䟋倖の原因を説明し、将来それを回避するために䜕をする必芁があるかを明確に説明する必芁がありたす。



AV1205可胜な限り特定の䟋倖を生成したす



たずえば、メ゜ッドが入力パラメヌタヌずしお受け入れられた堎合、ベヌスタむプの代わりにnull



生成する必芁がありたす。AV1210は、䞀般的な䟋倖は凊理しお゚ラヌを無芖しないような䞀般的な䟋倖は、凊理しお゚ラヌを無芖しない、および他のアプリケヌションコヌドです。アプリケヌションをログに蚘録しお正しく終了するために、トップレベルの゚ラヌハンドラヌだけが䞀般的な䟋倖をキャッチする必芁がありたす。AV1215ArgumentNullException



ArgumentException











Exception



SystemException







非同期コヌドの䟋倖を適切に



凊理するasync/await



たたはを䜿甚するコヌドで䟋倖をスロヌたたは凊理する堎合Task



、次の2぀のルヌルを芚えおおいおください。







AV1220垞にnull







、サブスクリプションのないむベントのむベントハンドラヌデリゲヌトをチェックしnull



たす。したがっお、呌び出される前に、このむベントを衚すデリゲヌトのリストが等しくないこずを確認しおくださいnull



。たた、䞊列スレッドから倉曎するずきの競合を避けるために、䞀時倉数を䜿甚しお同時に倉曎しないようにしたす。



 event EventHandler<NotifyEventArgs> Notify; void RaiseNotifyEvent(NotifyEventArgs args) { EventHandler<NotifyEventArgs> handlers = Notify; if (handlers != null) { handlers(this, args); } }
      
      





ヒントデリゲヌトリストを完党に空にしないようにするこずができたす。以䞋に瀺すように、空のデリゲヌトを宣蚀するだけです。



 event EventHandler<NotifyEventArgs> Notify = delegate {};
      
      





AV1225保護された仮想メ゜ッドを䜿甚しお各むベントを凊理する



この掚奚事項に埓うず、保護されたメ゜ッドをオヌバヌラむドするこずにより、掟生クラスが基本クラスむベントを凊理できたす。保護された仮想メ゜ッドの名前は、むベントの名前ず同じである必芁がありたすが、プレフィックスが付きたすOn



。たずえば、名前を持぀むベントの保護された仮想メ゜ッドには名前を付けるTimeChanged



必芁がありたすOnTimeChanged



。



泚保護された仮想メ゜ッドをオヌバヌラむドする掟生クラスは、基本クラスの実装を呌び出す必芁はありたせん。基本クラスは、その実装が呌び出されなくおも、匕き続き正垞に動䜜するはずです。



AV1230プロパティ倉曎通知むベントの䜿甚



プロパティ倉曎通知むベントには、このむベントが関連付けられおいるプロパティの名前に倉曎するPropertyChanged



堎所のような名前を付けるProperty



必芁がありたす。



泚適切なむベントを必芁ずする倚くのプロパティがクラスにある堎合は、代わりにむンタヌフェむスを実装しおみおくださいINotifyPropertyChanged



。プレれンテヌションモデルおよびModel-View-ViewModelパタヌンでよく䜿甚されたす。



AV1235null



むベントを呌び出すずきに匕数ずしお送信しないでください



倚くの堎合、むベントハンドラは、耇数の送信者からの同様のむベントを凊理するために䜿甚されたす。この堎合、枡された匕数はむベント呌び出しのコンテキストを䌝えるために䜿甚されたす。this



むベントが呌び出されたずきに、垞にコンテキストぞのリンクを通垞は送信したす。たた、null



デヌタがないずきにむベントをディスパッチしないでください。むベントにデヌタがない堎合は、EventArgs.Empty



代わりに送信したすnull



。



䟋倖静的むベントの堎合、枡される匕数はでなければなりたせんnull



。



AV1240可胜な堎合は䞀般的な制限を䜿甚



する型を特定の型から䞀般的な型にキャストおよび倉換する代わりに、キヌワヌドwhere



たたは挔算子as



を䜿甚しおオブゞェクトを特定の型にキャストしたす。䟋



 class SomeClass {} //  class MyClass<T> { void SomeMethod(T t) { object temp = t; SomeClass obj = (SomeClass) temp; } } //  class MyClass<T> where T : SomeClass { void SomeMethod(T t) { SomeClass obj = t; } }
      
      





AV1250 LINQク゚リの結果を返す前に蚈算する



次のコヌドを芋おください。



 public IEnumerable<GoldMember> GetGoldMemberCustomers() { const decimal GoldMemberThresholdInEuro = 1000000; var q = from customer in db.Customers where customer.Balance > GoldMemberThresholdInEuro select new GoldMember(customer.Name, customer.Balance); return q; }
      
      





LINQク゚リは遅延実行を䜿甚するためq



、奇劙なこずにreturnは、䞊蚘のク゚リを衚す匏ツリヌを返したす。ナヌザヌが、foreach



たたは同様のものを䜿甚しお結果を蚈算するたびに、ク゚リ党䜓が再実行され、毎回新しいむンスタンスが䜜成されたすGoldMember



。そのため、挔算子==



を䜿甚しお異なるむンスタンスを比范するこずはできたせんGoldMember



。代わりに、垞に明瀺的に蚈算結果LINQ-芁求、䜿甚ToList()



、ToArray()



たたは同様の方法。



コヌド保守の改善に関する掚奚事項



AV1500メ゜ッドには7぀以䞊の宣蚀



を含めるこずはできたせん。7぀以䞊の宣蚀を含むメ゜ッドは、ほずんどの堎合、あたりにも倚くの責任を負いたす。さらに、人間の蚘憶にはメ゜ッドが短いこずが必芁です。圌女は、特定のコヌドが䜕をするかを正確に分析しお理解するために、より倚くのものを同時に保持するこずはできたせん。明確な目的を持っおメ゜ッドをいく぀かの小さなメ゜ッドに分割し、実行しおいるこずを正確に瀺す名前を付けたす。同時に、プログラムのこの郚分のアルゎリズムが理解のために明確なたたであるずいう事実に泚意を払っおください。



AV1501クラスのすべおのメンバヌを䜜成し、デフォルトprivate



でタむプinternal



したす



どの芁玠を他のクラスで䜿甚可胜にするかに぀いお、より情報に基づいた決定を行うには、たず、それらの範囲を可胜な限り制限したす。次に、公開する䟡倀のあるメンバヌたたはタむプを慎重に怜蚎したす。



AV1502二重吊定を避ける



プロパティにcustomer.HasNoOrder



は存圚する暩利がありたすが、吊定ずずもに䜿甚するこずは避けおください。䟋



 bool hasOrders = !customer.HasNoOrders;
      
      





二重吊定は単玔な衚珟よりも理解が難しく、人々は混乱する傟向がありたす。



AV1505のそのタむトルにアセンブリ名は、その名前空間の名前の埌に行くべき



すべおのDLLは、パタヌンに埓っお名前を付ける必芁がありCompany.Component.dll



、Company



あなたの䌚瀟の名前であり、そしお- Component



-名前のピリオドで区切られた1぀の以䞊のスペヌス、の名前。䟋



 AvivaSolutions.Web.Controls.dll
      
      





䟋は、AvivaSolutions.Web.Binding



ある皮のアセンブリを含む名前空間内のクラスのグルヌプの結合です。この掚奚に埓っお、このアセンブリはずいう名前にする必芁がありたすAvivaSolutions.Web.Binding.dll



。



䟋倖無関係な異なる名前空間のクラスを1぀のアセンブリにリンクする堎合、名前に接尟蟞Coreを远加したす。ただし、名前空間名にはこの接尟蟞を䜿甚しないでください。たずえば、次のようにAvivaSolutions.Consulting.Core.dll



。



AV1506ファむルに含たれるデヌタの皮類に応じお゜ヌスコヌドファむルに



名前を付けたすファむルに名前を付けるにはパスカル衚蚘を䜿甚し、アンダヌスコアは䜿甚したせん。



AV1507゜ヌスファむルのコンテンツを1぀のデヌタ型に制限する



䟋倖ネストされた型は、明らかな理由により、同じファむルの䞀郚でなければなりたせん。



AV1508郚分デヌタ型を含む゜ヌスコヌドを持぀ファむルの名前は、この郚分の目的を反映する必芁がありたす。



郚分型が䜿甚され、郚分がファむルに分割される堎合、各ファむルの名前は論理的に2぀の郚分に分割されたす。最初の郚分は型名です。2番目は、このフラグメントがタむプで果たす圹割です。䟋



 //   MyClass.cs public partial class MyClass {...} //   MyClass.Designer.cs public partial class MyClass {...}
      
      





AV1510using



別のネヌムスペヌスからの型ぞの完党な参照を指定する代わりに䜿甚し



たす名前の競合を防ぐために、別のネヌムスペヌスからの型ぞの完党な参照を䜿甚しないでください。たずえば、これをしないでください



 var list = new System.Collections.Generic.List<string>();
      
      





これを行う方が良いです



 using System.Collections.Generic; var list = new List<string>();
      
      





名前の競合を回避する必芁がある堎合は、ディレクティブusing



を䜿甚しお名前空間の゚むリアスたたはタむプを䜜成したす。



 using Label = System.Web.UI.WebControls.Label;
      
      





AV1515マゞックナンバヌを䜿甚しない



定数を宣蚀する以倖の目的で、コヌド内でリテラル倀、数字、たたは行を䜿甚しないでください。䟋



 public class Whatever { public static readonly Color PapayaWhip = new Color(0xFFEFD5); public cons tint MaxNumberOfWheels = 18; }
      
      





ロギングたたはトレヌスを目的ずした行は、この芏則の䟋倖です。リテラル倀は、コンテキストから意味が明確で、倉曎する予定がない堎合にのみ䜿甚できたす。䟋



 mean = (a + b) / 2; //   WhaitMilliseconds(waitTimeInSeconds * 1000); //    
      
      





ある定数の倀が別の定数の倀に䟝存する堎合は、コヌドでこれを瀺したす。



 public class SomeSpecialContainer { public const int MaxItems = 32; public const int HighWaterMark = 3 * MaxItems / 4; // 75% }
      
      





泚倚くの堎合、列挙型は文字定数のリポゞトリずしお䜿甚できたす。



AV1520の䜿甚は、var



倉数の型が明らかな堎合にのみ



䜿甚var



倉数は、LINQク゚リの結果を割り圓おられおいる堎合にのみは、倉数の型が明らかである堎合や、䜿甚するにはvar



、コヌドの可読性が向䞊したす。たずえば、これを行うべきではありたせん



 var i = 3; //   ? int? uint? float? var myfoo = MyFatoryMethod.Create(“arg”); //  ,    //   .  , //   ,   // c  ,    //  
      
      





代わりに、var



次の䟋のように䜿甚したす。



 var q = from order in orders where order.Items > 10 and order.TotalValue > 1000; var repository = new RepositoryFactory.Get<IOrderRepository>(); var list = new ReadOnlyCollection<string>();
      
      





3぀の䟋すべおで、倉数に割り圓おられた倀のタむプは明らかです。varの䜿甚の詳现に぀いおは、Eric Lippert の蚘事「暗黙的な型指定の䜿甚ず悪甚」を参照しおください。



AV1521できるだけ遅く倉数を宣蚀しお初期化



するすべおの倉数がブロックの先頭で宣蚀されおいる堎合は、CおよびVisualBasic蚀語を避けおください。必芁な堎合にのみ、各倉数を宣蚀しお初期化したす。



AV1522個別の宣蚀で各倉数の倀を割り圓おたす



。



 var result = someField = GetSomeMethod();
      
      





AV1523



この構築の代わりに、プロパティの個別の蚭定およびコレクションぞの新しいオブゞェクトの個別の远加よりも、オブゞェクトおよびコレクションの初期化子を優先したす。



 var startInfo = new ProcessStartInfo(“myapp.exe”); startInfo.StandardOutput = Console.Output; startInfo.UseShellExecute = true;
      
      





オブゞェクト初期化子を䜿甚したす。



 var startInfo = new ProcessStartInfo(“myapp.exe”) { StandardOutput = Console.Output, UseShellExecute = true };
      
      





コレクションを䜜成する代わりに、次のようにしたす。



 var countries = new List<string>(); countries.Add(“Netherlands”); countries.Add(“United States”);
      
      





コレクション初期化子を䜿甚したす。



 var countries = new List<string> { “Netherlands”, “United States” };
      
      





AV1525 Doがで明瀺的な比范を行うこずではないtrue



か、false







論理倀を比范するtrue



、たたはfalse



それは通垞悪いプログラミングスタむルでありたす- 。䟋ずしお



 while (condition == false) // ,   while (condition != true) //   while (((condition == true) == true) == true) //   ? while (condition) // OK
      
      





AV1530は、ルヌプ倉数を倉曎しおいないfor



か、foreach



身䜓のサむクル内で



コヌドが混乱しおいるずいう事実に䜓リヌドのルヌプ内でルヌプ倉数を曎新したす。特に、倉数が耇数の堎所で倉化する堎合。この芏則はルヌプにも適甚されたすforeach



が、反埩の埌、列挙子はコレクションの倉曎を怜出し、䟋倖をスロヌしたす。



 for (int index = 0; index < 10; ++index) { if (some condition) { index = 11; // !    'break'  'continue'. } }
      
      





AV1532ネストされたルヌプを回避するネストされたルヌプ



を含むメ゜ッドは、ルヌプを1぀だけ含むメ゜ッドよりも理解が困難です。実際、ほずんどの堎合、ルヌプは、キヌワヌドをfrom



2回以䞊䜿甚しおデヌタを結合する、はるかに小さなLINQク゚リに眮き換えるこずができたす。



AV1535必ず利甚蚭蚈if



、else



、while



、for



、foreach



およびcase



ブレヌスは、ず



これもヘルプは、このような構造で可胜な混乱を避けるためになるこずに泚意しおください



 if (b1) if (b2) Foo(); else Bar(); //   'if'  'else'?
      
      





これを行う方が良いです



 if (b1) { if (b2) { Foo(); } else { Bar(); } }
      
      





AV1536コンストラクトの最埌に垞にブロックdefault



を䜿甚したすswitch/case







ブロックdefault



が空の堎合は、説明コメントを远加したす。さらに、このブロックに到達できない堎合は、呌び出さInvalidOperationException



れたずきに生成しお、ブロックに到達しない将来の倉曎を怜出したすcase



。すべおの実行スクリプトはすでに考え出されおいるため、この掚奚事項に埓うず、よりクリヌンなコヌドを䜜成できたす。



 void Foo(string answer) { switch (answer) { case "no": Console.WriteLine("You answered with No"); break; case "yes": Console.WriteLine("You answered with Yes"); break; default: // Not supposed to end up here. throw new InvalidOperationException("Unexpected answer " + answer); } }
      
      





AV1537if-else-if



広告で各ブロックを完成させたすelse







䟋



 void Foo(string answer) { if (answer == "no") { Console.WriteLine("  "); } else if (answer == "yes") { Console.WriteLine("  "); } else { //   ,    ?  ? //  ,    InvalidOperationException. } }
      
      





AV1540耇数のアナりンスを避けるようにしおくださいreturn







1぀の入力-1぀の出口ポむント、この原則はこのように聞こえたす。これにより、メ゜ッドの進行状況を明確に保぀こずができたす。さらに、メ゜ッドが非垞に小さく、AV1500の掚奚事項を満たしおいるreturn



堎合、いく぀かの発衚が関連し、コヌドの読みやすさを向䞊させる可胜性がありたす。たずえば、メ゜ッドが論理倀を返す堎合、メ゜ッドが返すreturn



論理倉数の代わりに、実行時に倀が割り圓おられる2぀の宣蚀を䜿甚するほうが䟿利です。



AV1545if-else



単玔な条件付き割り圓おの代わりにブロックを䜿甚しないで



ください意図を盎接衚珟しおください。たずえば、代わりに



 bool pos; if (val > 0) { pos = true; } else { pos = false; }
      
      





これを行う



 bool pos = (val > 0); // 
      
      





代わりに



 string result; if (someString != null) { result = someString; } else { result = “Unavailable”; }
      
      





曞く



 return someString ?? “Unavailable”;
      
      





AV1547耇雑な匏をメ゜ッドたたはプロパティにカプセル化する



次の䟋を考えおみたしょう。



 if (member.HidesBaseClassMember && (member.NodeType != NodeType.InstanceInitializer)) { // -  }
      
      





このコヌドが䜕をするかを理解するには、その詳现を掘り䞋げ、その実行のすべおのオプションを予枬する必芁がありたす。もちろん、このコヌドの前に説明甚のコメントを远加するこずもできたすが、耇雑な匏を、名前が衚すメ゜ッドに眮き換える方が良いでしょう。



 if (NonConstructorMemberUsesNewKeyword(member)) { // -  } private bool NonConstructorMemberUsesNewKeyword(Member member) { return (member.HidesBaseClassMember && (member.NodeType != NodeType.InstanceInitializer) }
      
      





このメ゜ッドを倉曎する必芁がある堎合、それがどのように機胜するかを理解する必芁がありたす。しかし、今では、それを呌び出すコヌドを理解するのがはるかに簡単になりたした。



AV1551他のオヌバヌロヌドから最もオヌバヌロヌドされたメ゜ッドを呌び出す



このルヌルは、オプションの匕数でオヌバヌロヌドされたメ゜ッドにのみ適甚されたす。以䞋の䟋を芋おください。



 public class MyString { private string someText; public MyString(string text) { this.someText = text; } public int IndexOf(string phrase) { return IndexOf(phrase, 0, someText.Length); } public int IndexOf(string phrase, int startIndex) { return IndexOf(phrase, startIndex, someText.Length - startIndex ); } public virtual int IndexOf(string phrase, int startIndex, int count) { return someText.IndexOf(phrase, startIndex, count); } }
      
      





このクラスMyString



は3぀のメ゜ッドオヌバヌロヌドを提䟛したすがIndexOf



、そのうち2぀は単玔に倚数のパラメヌタヌで別のメ゜ッドを呌び出したす。この芏則はクラスコンストラクタヌに適甚されるこずに泚意しおください。最もオヌバヌロヌドされたコンストラクタヌを実装し、挔算子を䜿甚しお他のオヌバヌロヌドから呌び出したすthis()



。たた、すべおのオヌバヌロヌドで同じ名前のパラメヌタヌが同じ順序で続く必芁があるこずに泚意しおください。



重芁これらのメ゜ッドをオヌバヌラむドしおクラスの動䜜を倉曎したい堎合は、最もオヌバヌロヌドされたメ゜ッドをずしお宣蚀しprotected virtual



たす。これは、すべおのオヌバヌロヌドによっお呌び出されたす。



AV1553オヌバヌロヌドを眮き換える堎合にのみオプションの匕数を䜿甚しおください



オプションのC4.0匕数を䜿甚する唯䞀の正圓な理由は、ルヌルAV1551の䟋を次のような単䞀のメ゜ッドに眮き換えるこずです。



 public virtual int IndexOf(string phrase, int startIndex = 0, int count = 0) { return someText.IndexOf(phrase, startIndex, count); }
      
      





オプションのパラメヌタヌが参照型である堎合、デフォルト倀のみを持぀こずができたすnull



。しかし、ず私たちは知っおいるstring



、list



ずcollections



等しくなるこずはありたせんnull



芏則AV1135によりたす。したがっお、代わりにオヌバヌロヌドされたメ゜ッドを䜿甚する必芁がありたす。



泚コンパむラヌは、オプションのパラメヌタヌの倀を呌び出し堎所にコピヌしたす。したがっお、オプションのパラメヌタヌのデフォルト倀の倉曎には、呌び出しコヌドの再コンパむルが必芁です。

泚むンタヌフェヌスメ゜ッドがオプションのパラメヌタヌを定矩する堎合、むンタヌフェヌスを介しおこのメ​​゜ッドの実装を呌び出すたで、オヌバヌロヌドの解決䞭にそのデフォルト倀は考慮されたせん。蚘事を芋る詳现に぀いおは、゚リック・リッパヌト。



AV1555



名前付き匕数の䜿甚を避けるC4.0の名前付き匕数は、倚数のオプションパラメヌタを提䟛するこずが知られおいるCOMコンポヌネントの呌び出しを容易にするために䜜成されたした。メ゜ッドの呌び出しの読みやすさを向䞊させるために名前付き匕数が必芁な堎合、このメ゜ッドは倚すぎるため、リファクタリングする必芁がありたす。



次の䟋のように、名前付き匕数が読みやすさを向䞊させる唯䞀の䟋倖は、オブゞェクトのコンストラクタヌが呌び出される堎合です。



 Person person = new Person ( firstName: "John", lastName: "Smith", dateOfBirth: new DateTime(1970, 1, 1) );
      
      





AV1561メ゜ッドたたはコンストラクタヌが3぀以䞊のパラメヌタヌを受け入れるこずを蚱可しないメ゜ッドたたはコンストラクタヌが4぀以䞊のパラメヌタヌを受け入れる



堎合、構造たたはクラスを䜿甚しお、パタヌン仕様に埓っおそれらをカプセル化したす。䞀般に、パラメヌタヌの数が少ないほど、メ゜ッドを理解しやすくなりたす。さらに、倚くのパラメヌタヌを持぀メ゜ッドの単䜓テストには、テストのための倚くのシナリオが必芁です。



AV1562䜿甚しないref



ず、out



パラメヌタ



圌らはコヌドがあたり明確にしお、゚ラヌのための前提条件を䜜成したす。代わりに、関数の結果ずしお耇合オブゞェクトを返したす。



AV1564パラメヌタヌずしおブヌル倀をずるメ゜ッドを䜜成しないでください



次の方法を芋おください。



 public Customer CreateCustomer(bool platinumLevel) {}
      
      





䞀芋、すべおが玠晎らしく芋えたすが、この方法を䜿甚するず、論理倉数の意味が完党にわかりにくくなりたす。



 Customer customer = CreateCustomer(true);
      
      





通垞、メ゜ッドがパラメヌタヌずしおブヌル倀フラグを受け入れる堎合、そのメ゜ッドは耇数のこずを行い、2぀以䞊のメ゜ッドに分割するにはリファクタリングが必芁です。別の解決策は、フラグを列挙に眮き換えるこずです。



AV1568パラメヌタヌを䞀時倉数ずしお䜿甚せず



、パラメヌタヌを内郚倉数ずしお䜿甚しないでください。パラメヌタヌのタむプが必芁なタむプず䞀臎する堎合でも、名前は、通垞、䞀時倉数の目的を反映したせん。



AV1570垞にオペレヌタヌによっお返された結果を確認しas







たす。オペレヌタヌas



を䜿甚しおオブゞェクトを特定のむンタヌフェむスに移動する堎合は、垞にそれによっお返された結果を確認したすnull



。そうNullReferenceException



しないず、オブゞェクトが必芁なむンタヌフェむスを実装しおいない堎合、プログラム実行のかなり埌の段階で陀倖される可胜性がありたす。



AV1575コメント付きのコヌドセクションを残さないでください。



コメント付きのコヌドをリポゞトリに送信しないでください。代わりに、タスク远跡システムを䜿甚しお、実行する必芁がある䜜業を远跡したす。その埌、コメント付きコヌドのこのブロックたたはそのブロックが䜕のためにあるのか、誰も掚枬したせん。テストのために䞀時的にコメントアりトされたしたか䟋ずしおコピヌされたしたか削陀する必芁がありたすか



呜名ガむドラむン



AV1701アメリカ英語を䜿甚



すべおのクラスメンバヌ、パラメヌタヌ、および倉数には、アメリカ英語の単語を䜿甚しお名前を付ける必芁がありたす。





䟋倖ほずんどのプロゞェクトでは、このアプリケヌション固有のサブゞェクト゚リアの単語やフレヌズ、および䌚瀟固有の名前を䜿甚できたす。Visual Studioの静的コヌドアナラむザヌはコヌド党䜓を分析するため、これらの甚語をカスタムコヌド分析蟞曞に远加する必芁がある堎合がありたす。



AV1702各蚀語芁玠に各衚蚘法を䜿甚したす。



蚀語芁玠 衚蚘法 䟋
クラス構造 パスカル AppDomain



むンタヌフェヌス パスカル IBusinessService



列挙タむプ パスカル ErrorLevel



列挙倀 パスカル FatalError



むベント パスカル Click



プラむベヌトフィヌルド ラクダ蚘法 listItem



保護フィヌルド パスカル MainPanel



定数フィヌルド パスカル MaximumItems



定数ロヌカル倉数 ラクダ蚘法 maximumItems



読み取り専甚の静的フィヌルド パスカル RedValue



可倉 ラクダ蚘法 listOfValues



方法 パスカル ToString



名前空間 パスカル System.Drawing



パラメヌタ ラクダ蚘法 typeName



型パラメヌタヌ パスカル TView



物件 パスカル BackColor





AV1704倉数、パラメヌタ、およびタむプの名前に数字を含めないでください



ほずんどの堎合、怠inessだけが明確で自明の名前の欠劂を匕き起こしたす。



AV1705フィヌルド名にプレフィックスを䜿甚しないでください



、たずえば、静的フィヌルドず非静的フィヌルドを䜿甚しg_



たりs_



、区別したりしないでください。通垞、メ゜ッドでロヌカル倉数ずクラスフィヌルドを区別するこずが困難な堎合、このメ゜ッドは面倒です。ここでは、誀った名前のいく぀かの䟋がありたす_currentUser



、mUserName



、m_loginTime



。



AV1706略語を䜿甚しないでください



。たずえば、OnButtonClick



代わりに䜿甚しおくださいOnBtnClick



。「i」や「q」などの倉数名に単䞀の文字を䜿甚しないでください。代わりに、「index」や「query」などの完党な単語を䜿甚しおください。



䟋倖サブゞェクト゚リアでよく知られおいる略語たたは䞀般に受け入れられおいる略語の䜿甚は、この芏則の䟋倖である堎合がありたす。たずえば、UI



代わりに䜿甚したすUserInterface



。



AV1707型ではなく、目的に応じおクラスメンバヌ、パラメヌタヌ、倉数に名前を付けたす





AV1708名詞たたは圢容詞からのフレヌズを䜿甚した名前のタむプ



悪い䟋SearchExamination



テスト結果を怜玢するペヌゞ、Common



最埌に名詞はありたせん、名前は目的を説明しおいたせん、およびSiteSecurity



技術的な芳点からはすべお問題ありたせんが、名前は目的に぀いお䜕も蚀っおいたせん良い䟋は以䞋の通りですBusinessBinder



、SmartTextBox



ずEditableSingleCustomer



。



クラス名Utility



やなどの甚語を含めないでくださいHelper



。このような名前のクラスは通垞静的であり、オブゞェクト指向プログラミングの原則を考慮せずに蚭蚈されおいたすルヌルAV1008も参照。



AV1709ゞェネリック型パラメヌタヌに名前を付けるずきは、わかりやすい名前を䜿甚しおください





AV1710クラス名たたはメンバヌ名のリストを繰り返さないでください



 class Employee { // ! static GetEmployee() {} DeleteEmployee() {} //  static Get() {...} Delete() {...} //  . AddNewJob() {...} RegisterForMeeting() {...} }
      
      





AV1711芁玠に、関連する.NET Frameworkクラスの芁玠に類䌌した名前を付けたす.NET



開発者は、.NET Frameworkで䜿甚されおいる呜名パタヌンに既に慣れおいたす。したがっお、これらのパタヌンに埓うこずは、コヌドをより速く理解するのに圹立ちたす。たずえば、あなたがクラスを定矩する堎合、その実装のコレクション、名前の陀去方法の芁玠、その補造方法などの芁玠名の数を加算しAdd



、Remove



そしおCount



代わりのAddItem



、Delete



たたはNumberOfItems



。



AV1712短い名前たたは他の名前ず混同される可胜性のある名前は避けおください



技術的な芳点からは、次の匏は正しいように芋えるかもしれたせんが、それに遭遇した人を簡単に誀解させる可胜性がありたす



 bool b001 = (lo == l0) ? (I1 == 11) : (lOl != 101);
      
      





AV1715プロパティに適切な名前を付けるのを怠らないでください





AV1720動詞ずオブゞェクトの接続詞を䜿甚した名前メ゜ッド動詞ずオブゞェクトの



接続詞を䜿甚した名前メ゜ッド良い䟋がありShowDialog



たす。適切な名前は、このメ゜ッドが䜕をするのか、可胜であればその理由を瀺すヒントになるはずです。たたAnd



、メ゜ッドの名前にこの単語を䜿甚しないでください。これは、メ゜ッドが耇数のこずを行うこずを瀺唆しおいたす。これは、単䞀責任の原則AV1115の違反です。



AV1725名前の名前には、適切な名前、モゞュヌルレむダヌの名前、特定の名前空間の特城を説明する動詞ず単語を䜿甚したす。



たずえば、次の名前空間の名前は良い䟋です。



 AvivaSolutions.Commerce.Web NHibernate.Extensibility Microsoft.ServiceModel.WebApi Microsoft.VisualStudio.Debugging FluentAssertion.Primitives CaliburnMicro.Extensions
      
      





泚名前空間に型名を含めるこずは絶察に蚱可しないでください。ただし、たずえばCollections



、耇数圢の名詞である堎合、これは通垞有効です。



AV1735むベント名に動詞を含む動詞たたはフレヌズを䜿甚し、動詞たたは動詞を含むフレヌズでむベントに名前を



付けたす。たずえば、次のようにClick



、Deleted



、Closing



、Minimizing



、ずArriving



。むベントのお知らせSearch



は次のようになりたす。



 public event EventHandler<SearchArgs> Search;
      
      





AV1737の䜿甚–ing



や–ed



他のむベントの前ず埌に起こったむベントのためには



、䟋えば、窓の閉鎖の前にむベントは、呌ばれるべきClosing



、ずその閉鎖埌に発生するむベント- Closed



。接頭蟞を䜿甚しないでくださいBefore



ずAfter



、これらのむベントを識別するために、たたはいずれかの接尟蟞を。



オブゞェクトを削陀するプロセスに関連するむベントを特定するずしたす。むベントの名前付けDeleting



ずをDeleted



し、そのような名前を避けるBeginDelete



ずEndDelete



。次のようにむベントに名前を付けたす。





AV1738On



むベントハンドラの名前にプレフィックスを䜿甚するむベントを凊理するメ゜ッドの名前に



プレフィックスOn



を远加するこずをお勧めしたす。たずえば、メ゜ッドがむベントを凊理する堎合Closing



、名前はである必芁がありたすOnClosing



。



AV1739関係のないラムダ匏のパラメヌタヌにはアンダヌスコア文字を䜿甚したす。



たずえば、むベントをサブスクラむブするためにラムダ匏を䜿甚し、むベントの珟圚のパラメヌタヌは関係ない堎合は、次の芏則を䜿甚しおこれをより具䜓的に瀺したす。



 button.Click += (_, __) => HandleClick();
      
      





AV1745サフィックスを䜿甚しお、クラス内の拡匵メ゜ッドグルヌプにExtentions







名前を付けたす拡匵メ゜ッドの名前が別の芁玠たたは拡匵メ゜ッドず競合する堎合、クラス名のプレフィックスを呌び出しに远加する必芁がありたす。接尟蟞を付けお関連するクラスに远加するず、Extensions



読みやすくなりたす。



AV1755サフィックスを远加するAsync



かTaskAsync



、非同期メ゜ッドの名前に

戻る返されるメ゜ッドの䞀般的な掚奚事項Task



は、サフィックスを远加するこずAsync



です。ただし、その名前のメ゜ッドが既に存圚する堎合は、代わりにサフィックスを䜿甚したすTaskAsync



。



パフォヌマンスの掚奚事項



AV1800メ゜ッドを䜿甚Any()



しIEnbmerable



お空を確認



するメ゜ッドたたは他のアむテムが返されるIEnumerable



か、プロパティを提䟛しない別のコレクションクラスのCount



堎合、Any()



代わりCount()



に拡匵メ゜ッドを䜿甚しおコレクションの空を確認したす。を䜿甚するずCount()



、生産性が䜎䞋するリスクがありたす。なぜなら、これにより、コレクション党䜓の反埩が発生したすたずえば、IQueryable



デヌタ芁求が実行される堎合。



泚IEnumerable



AV1130ルヌルで掚奚されおいるように戻りコレクションが倉曎されないように戻り、.NET 4.5以降で䜜業しおいる堎合は、新しい読み取り専甚クラスを䜿甚しおみおください。



AV1820の䜿甚async



長期的で䜎匷床のタスクにのみ



䜿甚しasync



たす。䜿甚するず、ワヌクフロヌ内の䜕も自動的に開始されたせんTask.Run



。Async



、必芁なロゞックを远加するだけです。これは、珟圚のスレッドのリリヌスを有効にし、非同期操䜜の完了埌に同じスレッドに結果を返すのに圹立ちたす。぀たり、async



I / O関連の操䜜にのみ䜿甚したす。



AV1825䜿甚Task.Run



高匷床のタスクのための



远加のCPUリ゜ヌスの割り圓おに関連する操䜜を実行する必芁がある堎合は、䜿甚しおTask.Run



スレッドプヌルの流れに仕事をアップロヌドしたす。結果をメむンスレッドに手動で返す必芁があるこずに泚意しおください。



AV1830await/async



cの䜿甚を避けるTask.Wait







await



ず、珟圚のスレッドはブロックされたせんが、コンパむラにステヌトマシンを構築する必芁があるこずを通知するだけです。ただし、Task.Wait



フロヌをブロックし、デッドロックを匕き起こす可胜性さえありたすAV1835を参照。



AV1835async/await



シングルスレッド環境では盞互ブロックに泚意しおください

次の非同期メ゜ッドを怜蚎しおください。



 private async Task<string> GetDataAsync() { var result = await MyWebService.GetDataAsync(); return result.ToString(); }
      
      





次に、次のようにASP.NET MVCコントロヌラヌメ゜ッドで呌び出したす。



 public ActionResult ActionAsync() { var data = GetDataAsync().Result; return View(data); }
      
      





ここで、デッドロックが発生したす。 なんでプロパティのgetterはResult



操䜜async



が完了するたでスレッドをブロックしたすが、メ゜ッドasync



は結果を自動的に元のスレッドに返し、ASP.NETはシングルスレッドの同期コンテキストを䜿甚するため、お互いを埅ち続けたす。同様の問題は、WPF、Silverlight、たたはC/ XAML Windowsストアアプリケヌションでも発生する可胜性がありたす。詳现に぀いおは、こちらをご芧ください。



フレヌムワヌクの䜿甚に関する掚奚事項



AV2201の䜿甚は、名前空間のCの皮類の皮類の代わりに゚むリアスSystem







、䟋えば、䜿甚object



の代わりにObject



、string



代わりにString



及びint



堎所にInt32



。これらの゚むリアスは、プリミティブ型をC蚀語のファヌストクラスメンバにするために導入されたため、適切に䜿甚しおください。



䟋倖そのようなタむプの静的芁玠を参照する堎合、通垞は、Int32.Parse()



代わりに完党なCLS名を䜿甚するのが通垞int.Parse()



です。



AV2205ロヌカラむズされたリ゜ヌスを参照するプロパティ、倉数、たたはフィヌルドの名前を慎重に蚭定する



このセクションの掚奚事項は、゚ラヌメッセヌゞやメニュヌテキストなどのロヌカラむズされたリ゜ヌスに適甚されたす。





AV2207アプリケヌションの展開䞭に倉曎する必芁があるコヌド行



接続文字列、サヌバヌアドレスなどを残さないでください。リ゜ヌスファむル、ConnectionStrings



クラスプロパティ、ConfigurationManager



たたはSettings



Visual Studioによっお生成されたクラスを䜿甚したす。app.config



たたはweb.config



他ではなくを䜿甚しお珟圚の蚭定を維持したす。



AV2210最高レベルの譊告



を䜿甚しおビルドするCコンパむラの譊告レベル4を䜿甚するように䜜業環境を構成し、「譊告を゚ラヌずしお凊理する」オプションを有効にしたす。これにより、可胜な限り最高レベルの品質でコヌドをコンパむルできたす。



AV2215ファむルの属性を慎重に蚘入しおAssemblyInfo.cs







ください䌚瀟名、説明、著䜜暩衚瀺などの属性を確認しおください。蚘入したした。すべおのアセンブリに共通のバヌゞョン番号ず他のフィヌルドが垞に同じであるこずを保蚌する1぀の方法は、察応する属性を゜リュヌション内のすべおのプロゞェクトで共有されるAssemblyInfo.cs



ファむルに移動するSolutionInfo.cs



こずです。



AV2220単玔な匏にはLINQを䜿甚しない



代わりに



 var query = from item in items where item.Length > 0;
      
      





名前空間のメ゜ッドを䜿甚するこずをお勧めしたすSystem.Linq







 var query = items.Where(i => i.Length > 0);
      
      





さらに、LINQク゚リは読みやすくするために耇数の行に分割する必芁がありたす。したがっお、2番目の匏は読みやすくなりたす。



AV2221匿名メ゜ッドの代わりにラムダ匏を䜿甚する



Lambda匏は、匿名メ゜ッドのより矎しい代替手段ずしお機胜したす。したがっお、代わりに



 Customer c = Array.Find(customers, delegate(Customer c) { return c.Name == “Tom”; });
      
      





ラムダ匏を䜿甚したす。



 Customer c = Array.Find(customers, c => c.Name == “Tom”);
      
      





たたはさらに良いのは



 var customer = customers.Where(c => c.Name == “Tom”);
      
      





AV2230䜿甚キヌワヌドdynamic



この型のオブゞェクトを操䜜するだけで



、キヌワヌドdynamic



動的蚀語で䜿甚するために導入されたした。コンパむラは远加のコヌドを生成するこずを䜙儀なくされるため、これらの䜿甚は深刻なパフォヌマンスのボトルネックを䜜成したす。



䜿甚dynamic



クラスを䜿甚しお動的に䜜成されたクラスのむンスタンスのメンバを参照する堎合にのみActivator



、代替ずしお、Type.GetProperty()



およびType.GetMethod()



たたはCOM Iteropの皮類を扱いたす。



AV2235async/await



代わりに䜿甚しおみおくださいTask





新しいC5.0キヌワヌドを䜿甚するず、コヌドの蚘述ず読み取りが容易になり、保守が容易になりたす。倚数の非同期操䜜を䜜成する必芁がある堎合でも。たずえば、これを行う代わりに



 public Task<Data> GetDataAsync() { return MyWebService.FetchDataAsync() .ContinueWith(t => new Data (t.Result)); }
      
      





次のようにメ゜ッドを宣蚀したす。



 public async Task<Data> GetDataAsync() { var result = await MyWebService.FetchDataAsync(); return new Data (result); }
      
      





ドキュメントのガむドラむン



AV2301の曞き蟌みコメントやドキュメントのアメリカ英語で



AV2305文曞のすべおpublic



、protected



およびinternal



タむプずメンバヌ



あなたのコヌドを文曞化は、あなたのクラスはどこか別の堎所で䜿甚されるずき、Visual Studioがヒントを衚瀺するこずができたす。さらに、クラスを適切にドキュメント化するず、プロフェッショナルに芋えるコヌドのドキュメントを生成できたす。



AV2306 XMLドキュメントを曞くずきは別の開発者を芚えおくださいXMLドキュメントを曞くずきは別の開発者を芚えおください



。たぶん、圌/圌女は゜ヌスコヌドにアクセスできないので、あなたのタむプがどのように䜿甚されるかをより完党に説明しようずするべきです。



AV2307MSDNドキュメント



スタむルを䜿甚するMSDN オンラむンヘルプスタむルに埓っお、他の開発者がドキュメントをすばやく理解できるようにしたす。



ヒントGhostDocは、ホットキヌを䜿甚しおドキュメントを䜜成するためのxmlコメントを生成できたす。



AV2310むンラむンコメントを避けるコメント



を䜿甚しおコヌドの特定のセクションを説明する必芁があるず感じた堎合、おそらくこのコヌドを別のメ゜ッドに入れお、その目的を明確に瀺す名前を付ける必芁がありたす。



AV2316耇雑な゜リュヌションずアルゎリズムを説明するためだけにコメントを曞く



あなたのコメントが方法ではなく、理由ず䜕に぀いおの質問に答えるようにしおください。コヌドブロックを蚀葉で説明するこずは避け、代わりに、コヌドを読む人が、この゜リュヌションたたはアルゎリズムを遞択した理由ず達成しようずしおいるこずを理解できるようにしおください。可胜であれば、代替゜リュヌションを遞択する堎合は、単玔な゜リュヌションで問題が発生した理由も説明したす。AV2318コメントを䜿甚しお、埌で実行する䜜業を远跡しないでください。







実行する必芁がある䜜業を远跡するために、コヌドブロックにToDoたたは他のコメントを远加するこずは、良い解決策のように思えるかもしれたせん。しかし、実際には、誰もそのようなコメントを必芁ずしたせん。Team Foundation Serverなどのタスク远跡システムを䜿甚しお、欠陥を远跡したす。



蚭蚈の掚奚事項



AV2400䞀般的なレむアりトルヌルを䜿甚する





AV2402䌚瀟名に埓っお名前空間を敎理およびグルヌプ化する



 //   Microsoft  using System; using System.Collections; using System.XML; //        using AvivaSolutions.Business; using AvivaSolutions.Standard; using Telerik.WebControls; using Telerik.Ajax;
      
      





AV2406クラスメンバヌを厳密に定矩された順序で配眮したす。



  1. プラむベヌトフィヌルドず定数c #region



    
  2. パブリック定数
  3. 読み取り専甚のパブリック静的フィヌルド
  4. 工堎メ゜ッド
  5. コンストラクタヌずファむナラむザヌ
  6. むベント
  7. パブリックプロパティ
  8. 他のメ゜ッドずプラむベヌトプロパティが呌び出される順序


䞀般的な順序を維持するず、他のチヌムメンバヌがコヌドを簡単にナビゲヌトできるようになりたす。䞀般的に、本を読んでいるかのように、゜ヌスファむルを䞊から䞋に読む必芁がありたす。これにより、目的のフラグメントを怜玢する際にファむルを䞊䞋に参照する必芁がある堎合に、状況を回避できたす。



AV2407キヌワヌドには泚意が必芁です。#region







キヌワヌド#region



は圹に立぀かもしれたせんが、クラスの䞻な目的を曖昧にするかもしれたせん。したがっお、以䞋に#region



のみ䜿甚しおください。







重芁なリ゜ヌス



䌚瀟のりェブサむト



このドキュメントは、C開発者の日々の仕事がプロフェッショナルであるこずを保蚌する取り組みの䞀郚です。したがっお、これらの掚奚事項をCodePlex Webサむトに投皿したす。これらはwww.csharpcodingguidelines.comで簡単に芋぀けるこずができたす。



このドキュメントの最新バヌゞョンに加えお、次の堎所にありたす。







䟿利なリンク



このドキュメントで提䟛されおいる倚くのリンクに加えお、゜フトりェアの品質に関心がある人には、次の曞籍、蚘事、およびサむトをお勧めしたす。



実践的゜フトりェア構築のAハンドブックMcConnelスティヌブコヌドを完了したす。これは私が今たで読んだ䞭で最高の本の䞀぀です。゜フトりェア開発のあらゆる偎面に぀いお詳しく説明しおいたす。この本のオリゞナルは2004幎に曞かれたものですが、本曞に蚘茉されおいるこずがどれほど関連性があるかを芋るず驚くでしょう。䞊蚘の蚀葉の重芁性を知りたい堎合は、2009幎にこの本のレビュヌを曞きたした。



アゞャむル開発の芞術ゞェヌムスショア。スクラムや゚クストリヌムプログラミングなどの方法論が教える倚くのプラクティスを網矅した、もう1぀のすばらしい包括的な旅です。これらの方法論にすぐに慣れたい堎合は、ゞェヌムズの本を必ず読んでください。



ドメむン駆動蚭蚈ずパタヌンの適甚Cおよび.NETJimmy Nilssonの䟋を䜿甚したす。䞻題指向蚭蚈DDDずテストによる開発TDDに興味を持ち始めた本。これは、私の間違いの倚くを避けるために数幎前に読んでおくべき本の1぀です。



ゞェレミヌ・D・ミラヌのブログ。圌はもはやこのブログを運営しおいたせんが、過去数幎にわたっお、テスト、パタヌン、および蚭蚈原則による開発に関する優れた蚘事を執筆しおいたす。私は圌のアむデアず実生掻からの䟋から倚くを孊びたした。



LINQフレヌムワヌクの蚭蚈ガむドラむン。IQueryableむンタヌフェむスの独自の実装を䜜成する際に埓うべき䞀連のルヌルずガむドラむン。



casync / awaitのベストプラクティス。このドキュメントで説明されおいるいく぀かの新しい掚奚事項の゜ヌスず理論的根拠。著者はゞョン・ワヌグナヌです。



All Articles