私は、システムの悪影響を防ぐために外部ライブラリとフレームワークのAPIへのアクセスを制限することが重要であるケースを経験しました。
たとえば、SharePointアプリケーションでは、たとえループであっても、spList.Items.GetItemById
を呼び出してリストアイテムを取得するのは自然なことかもしれません。
また、SmtpClientの使用を禁止して、全員が独自のクラスを使用して電子メールを送信するように強制し、テスト環境ですべての電子メールを適切にプロキシおよびモックできるようにする必要がある場合もあります。
私たち自身のコードの特定の場所を除いて、外部コードにこれらの制約を達成するための信頼でき、合理的に簡単な方法はありますか?すべての状況で、たとえばリフレクションまたは単にある種の無効化によって、これらのメソッド/クラスへのアクセスを完全に禁止する必要はありません。むしろ、それらを使用してはならないという厳密な警告である必要があります。できればプログラマがこれらの制約を無効にするために積極的に対策を講じることを強制することが望ましいです。
独自のコードの特定の場所を除いて、外部コードにこれらの制約を達成するための信頼性が高く、合理的に簡単な方法はありますか?
問題は特にC#に関するものであるため、このようなルールを適用するためにここで使用できるコンパイラベースのソリューションがあります: Roslyn Analyzers 。特定のAPIへのアクセスをコンパイルエラーまたは警告として報告する独自のアナライザーを作成できます。
独自のコードの作成に関する多くのサンプルコードを提供するアナライザーのサンプルセットは StyleCop Analyzers であり、C#の古いStyleCop機能の代わりに使用されます。
そうは言っても、そのような自動化されたチェックは、「ルールを破る」と決意された人々によって常に回避できます。したがって、このアプローチは、カールビーレフェルトの回答で説明されているコードレビューの代わりにはなりません。それはそのようなレビューを助けることができますが、それらを置き換えるべきではありません。
外部APIの周りに不要な操作を除外するラッパーを書くなど、時間のかかる作業を行うことができますが、トレーニングやコードレビューに勝るものはありません。標準や技術的な手段を講じれば、人々はそれらを回避するための創造的な方法を見つけるからです。 。
たとえば、Scalaで書かれたサービスがいくつかあり、コードレビュー時に私たちが求めることの1つは不変性ですが、 vars
を取り除くことでそれを伝えることがよくあります。先日の誰かが val x:ListBuffer [Boolean] を使用して、単一の可変変数をリスト内の唯一のアイテムとして保持しました。別のListBuffer
をxに割り当てることはできませんが、リストの項目を好きなだけ置き換えることができます。 var
を使用するのと同じくらい良くありませんが、それでもかまわないです。
言い換えれば、人々があなたの技術的な解決策を回っているかどうかを確認する必要があります。これらの技術的なソリューションにコストがかかり、複雑さが増す場合は、それらが正しくコーディングされていることを確認してください。
カールの答えは100%正しいです。適合を保証する方法はありません。ただし、トレーニングとコードレビューに加えて、静的分析ツールを使用してコンプライアンスを確保することを検討してください。 (注:Karlが述べたのとまったく同じ方法でそれらをバイパスすることができるため、「に加えて」と言いました)。
静的分析ツールを使用する利点は、「IEnumerableの複数使用」のインスタンスや、今見ている週のパフォーマンスの問題(または、少なくとも、私がいつも感じていること)を探す退屈な人間のコード分析を削除することです。見つめている)。これにより、コードレビューとトレーニングで、より「興味深い」問題に集中できます。
具体的には、C#については、以下の提案を含めました。これらをビルド環境にプラグインすれば、準備は完了です。しかし、一般的には、使用している言語に関係なく、どこかに静的分析ツールがあります。
Wikipediaページから直接コピー/貼り付け、最新の情報とリンクについてはWikiページを使用: https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#.NET