web-dev-qa-db-ja.com

外部コードで任意の関数/クラスの呼び出しを禁止する

私は、システムの悪影響を防ぐために外部ライブラリとフレームワークのAPIへのアクセスを制限することが重要であるケースを経験しました。

たとえば、SharePointアプリケーションでは、たとえループであっても、spList.Items.GetItemByIdを呼び出してリストアイテムを取得するのは自然なことかもしれません。

また、SmtpClientの使用を禁止して、全員が独自のクラスを使用して電子メールを送信するように強制し、テスト環境ですべての電子メールを適切にプロキシおよびモックできるようにする必要がある場合もあります。

私たち自身のコードの特定の場所を除いて、外部コードにこれらの制約を達成するための信頼でき、合理的に簡単な方法はありますか?すべての状況で、たとえばリフレクションまたは単にある種の無効化によって、これらのメソッド/クラスへのアクセスを完全に禁止する必要はありません。むしろ、それらを使用してはならないという厳密な警告である必要があります。できればプログラマがこれらの制約を無効にするために積極的に対策を講じることを強制することが望ましいです。

12
Alex

独自のコードの特定の場所を除いて、外部コードにこれらの制約を達成するための信頼性が高く、合理的に簡単な方法はありますか?

問題は特にC#に関するものであるため、このようなルールを適用するためにここで使用できるコンパイラベースのソリューションがあります: Roslyn Analyzers 。特定のAPIへのアクセスをコンパイルエラーまたは警告として報告する独自のアナライザーを作成できます。

独自のコードの作成に関する多くのサンプルコードを提供するアナライザーのサンプルセットは StyleCop Analyzers であり、C#の古いStyleCop機能の代わりに使用されます。

そうは言っても、そのような自動化されたチェックは、「ルールを破る」と決意された人々によって常に回避できます。したがって、このアプローチは、カールビーレフェルトの回答で説明されているコードレビューの代わりにはなりません。それはそのようなレビューを助けることができますが、それらを置き換えるべきではありません。

8
David Arno

外部APIの周りに不要な操作を除外するラッパーを書くなど、時間のかかる作業を行うことができますが、トレーニングやコードレビューに勝るものはありません。標準や技術的な手段を講じれば、人々はそれらを回避するための創造的な方法を見つけるからです。 。

たとえば、Scalaで書かれたサービスがいくつかあり、コードレビュー時に私たちが求めることの1つは不変性ですが、 vars を取り除くことでそれを伝えることがよくあります。先日の誰かが val x:ListBuffer [Boolean] を使用して、単一の可変変数をリスト内の唯一のアイテムとして保持しました。別のListBufferをxに割り当てることはできませんが、リストの項目を好きなだけ置き換えることができます。 varを使用するのと同じくらい良くありませんが、それでもかまわないです。

言い換えれば、人々があなたの技術的な解決策を回っているかどうかを確認する必要があります。これらの技術的なソリューションにコストがかかり、複雑さが増す場合は、それらが正しくコーディングされていることを確認してください。

25
Karl Bielefeldt

カールの答えは100%正しいです。適合を保証する方法はありません。ただし、トレーニングとコードレビューに加えて、静的分析ツールを使用してコンプライアンスを確保することを検討してください。 (注:Karlが述べたのとまったく同じ方法でそれらをバイパスすることができるため、「に加えて」と言いました)。

静的分析ツールを使用する利点は、「IEnumerableの複数使用」のインスタンスや、今見ている週のパフォーマンスの問題(または、少なくとも、私がいつも感じていること)を探す退屈な人間のコード分析を削除することです。見つめている)。これにより、コードレビューとトレーニングで、より「興味深い」問題に集中できます。

具体的には、C#については、以下の提案を含めました。これらをビルド環境にプラグインすれば、準備は完了です。しかし、一般的には、使用している言語に関係なく、どこかに静的分析ツールがあります。

Wikipediaページから直接コピー/貼り付け、最新の情報とリンクについてはWikiページを使用: https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#.NET

  • .NETコンパイラプラットフォーム(コードネームRoslyn)– Microsoft .NETによって開発されたC#およびVisual Basic .NET用のオープンソースコンパイラフレームワーク。構文を分析および操作するためのAPIを提供します。
  • CodeIt.Right –静的コード分析と自動リファクタリングをベストプラクティスに組み合わせ、コードエラーと違反の自動修正を可能にします。 C#およびVB.NETをサポートします。
  • CodeRush –ユーザーにベストプラクティスの違反を警告するVisual Studioのプラグイン。
  • FxCop – CILにコンパイルされるMicrosoft .NETプログラムの無料の静的分析。スタンドアロンで、一部のMicrosoft Visual Studioエディションに統合されています。マイクロソフト。
  • NDepend –コードの依存関係の分析と視覚化、設計ルールの定義、影響分析の実行、およびコードの異なるバージョンの比較により、複雑な.NETコードベースの管理を簡素化します。 Visual Studioに統合します。
  • Parasoft dotTEST – Visual Studio用の静的分析、単体テスト、コードレビュープラグイン。 C#、VB.NET、ASP.NET、Managed C++など、Microsoft .NET Frameworkおよび.NET Compact Frameworkの言語で動作します。
  • Sonargraph – C#、JavaおよびC/C++をサポートし、依存関係分析、自動アーキテクチャチェック、メトリック、およびカスタムメトリックとコードチェッカーを追加する機能に重点を置いています。
  • StyleCop – C#ソースコードを分析して、一連のスタイルと一貫性のルールを適用します。 Microsoft Visual Studioの内部から実行することも、MSBuildプロジェクトに統合することもできます。
0
Reginald Blue