web-dev-qa-db-ja.com

禁止されているサードパーティの方法について警告する

注:この質問は、JavaまたはC#で記述されたコードを参照しています。

私はいくつかの大規模なプロジェクトを管理しており、サードパーティ/ SDKのメソッドで問題(必ずしもバグではない)を発見し、代わりに使用する必要がある独自の拡張機能を作成しました。これらのメソッドを使用することは、このプロジェクトでは推奨されないことを開発者に覚えておいてください。

独自のライブラリを使用していた場合は、そのメソッドを簡単に削除したり、廃止/非推奨にしたりできますが、作成していないライブラリに対してはそうすることはできません。

例として、2つのオーバーロードを提供するライブラリを使用します。

acme.calculate(int quantity_, double priceInUsDollars_);
acme.calculate(int quantity_, string currencyCode_, double priceInCurrency_);

開発者には常に最初のものを使用して、独自の標準FXレートシステムから米ドルで価格を取得してもらいたいです。また、IDE(Eclipse/Visual Studio))が最初の開発者を使用するときに開発者に警告するのは良いことです。コンパイラの警告でも十分です。

現在のところ、現状では、コードレビュー担当者にそのようなエラーを発見してもらう必要があります。ご覧のとおり、これは信頼できるアプローチではありません。

私が準備する1つの可能な方法は、独自のチェックスタイルチェック( http://checkstyle.sourceforge.net/writingchecks.html )を記述することです。でも、シンプルなものが使えるかなと思っていました。私が説明したようなIDE /コンパイラの警告を達成する方法を知っている人はいますか?

IDE /コンパイラ以外のソリューションは大歓迎です。

9
Apoorv Khurasia

NDepend / JavaDepend のようなツールを使用して、カスタムCQLクエリを記述し、これらの非常に特殊なケースに対して警告を生成できます。

あなたは質問でIDE /コンパイラに開発者に警告したいと言っていました。 NDepend/JDependはIDEと密接に統合されているため、これで問題が解決する可能性があります。

7
MattDavey

「ホワイトリストアプローチ」:ラッパーライブラリをライブラリに書き込みます。ライブラリ自体と基本的に同じインターフェイスシグネチャを使用しますが、禁止されている関数は除外します。ラッパーは、各メソッド呼び出しを対応するライブラリ呼び出しに委任する必要があります。次に、開発者が元のライブラリの代わりにそのラッパーのみを使用/リンクできるようにします。ラッパーは、ライブラリの拡張機能に適した場所でもあります。

Libが数百の関数を持つ非常に大きなAPIを持っている場合、それは実用的ではないかもしれません。次に、提案した「チェックスタイル」ソリューションのような「ブラックリストアプローチ」を実装します。

4
Doc Brown

JavaのReflectionの強力な機能の1つは、実行時にメソッドプロパティを変更できることです。使用方法の1つは、プライベートメソッドをパブリックにして、とにかくそれを使用できるようにすることです。実行時に不要なメソッドをプライベートにすることで、逆にうまく機能する可能性があります。コンパイル時には表示されませんが、プロジェクトがテストされるとすぐに表示されます。

この記事 は、実行時にメソッドのプロパティを変更する方法を示しています。ここに興味深い部分があります:

Class theClass = MyClass.class;
Class[] paramTypes = { Integer.TYPE, String.class };
Method method = theClass.getDeclaredMethod("myMethodName", paramTypes);
method.setAccessible(false); // this makes the metod private
System.out.println("Making method  myMethodName(int,String) private");
2
XGouchet

これらの方法を使用することは、このプロジェクトでは推奨されないことを開発者に覚えておいてください。

場合によっては、すでに置換メソッドを作成する必要があるため。ライブラリ全体のラッパークラスを作成し、ラッパークラスのみを使用します。

ライブラリが更新された場合は、とにかくコードを更新する必要があります。ラッパークラスは更新が簡単です。

それでも、開発者が間違ったメソッドを使用するのを防ぎます....私はあえて開発者が彼が使用することを想定していないメソッドを覚えておくことができるはずだと言います。

0
Ramhound