2

次のような C# コードを表すデータ構造があります。

class Namespace:
    string Name;
    List<Class> Classes;

class Class:
    string Name;
    List<Property> Properties;
    List<Method> Methods;
    List<Method> Constructors;
    List<Field> Fields;
    List<Class> InnerClasses;
    Class Parent;
    List<Interface> Implements;

...単純なレクサー/パーサーの組み合わせを使用して構築しています。ツリーをトラバースして、大量のルール セット (3000 以上) を適用する必要があります。ツリー内でさまざまな (そして非常に複雑な) パターンに遭遇すると、ルールが実行されます。たとえば、クラスが同じアセンブリ内のインターフェイスのみを実装する場合に実行されるルールがあります。

私の最初の素朴な実装は、各ルールを反復し、次に各ルールがツリーを走査して特定のパターンを探します。もちろん、ソースコードが少量であっても、これにはかなりの時間がかかります。

これは、大量のバイナリ コードの複雑なパターンを認識して、ウイルス対策ソフトウェアがどのように機能するかにたとえることができると思います。

この種のソフトウェアをどのように実装することをお勧めしますか?

EDT: 追加したい: いいえ、FxCop を再実装していません。

ありがとう

4

3 に答える 3

1

3000 のルールを集約してみることができます。3000 のうちのいくつかは、3000 の別のメンバーを想定していると思います。たとえば、ルール 12 が「クラスがインターフェイスを実装している」ことをチェックするとします。ルール 85 は、「クラスは同じアセンブリ内のインターフェイスのみを実装する」かもしれません。ルール 12 が失敗した場合、ルール 85 を実行する必要はまったくありません。

このアプローチ (アルファ ベータ プルーニング) では、アルゴリズムを再構築してクラス ツリーを検索し、すべてのルール パターンを同時に検索する必要があります。または、以前のルール パスが現在のルール パスが無関係であることを識別したというレコードを隠します。

コメント: 私は nub レベルのアカウントを持っているので、直接コメントすることはできません。多分あと2つのルールの例を挙げていただけますか? 私は現在、あなたのアルゴリズムが 0(n*n) であると考えています (大きな 0 表記の投稿からコピーしたものに続きます)

O(n*log(n)): ある種の分割統治戦略を実行するアルゴリズム。nが大きいと痛い。典型例:マージソート

O(n*n): ある種のネストされたループ。nが小さくても痛い。単純な行列計算で一般的です。可能であれば、この種のアルゴリズムは避けたいと思います。

于 2009-01-09T23:34:43.697 に答える
0

@ジミー・マクナルティ

それは素晴らしいアプローチです。アルファベータ剪定って言うの?ルールを再編成して、1 つが失敗した場合に他のルールを除外します。私は正しいですか?私はそれを調べるつもりです。

その他のルールの例を次に示します。

  • クラスは final であり、アセンブリの外部でクラスを実装または拡張しません。
  • メソッドは仮想ですが、クラスはプライベートまたは内部です。
  • クラスまたはメソッドには特定の属性があります。
  • メソッド パラメータはコンパイル時に認識されます。

この種のロジックをより速く/よりスマートに実行できるようにする他の手法について聞きたいです。

ありがとう

于 2009-01-10T02:49:20.057 に答える
0

パターン/コンテキストの何らかの表現を作成してから、パターンから一連のアクションへのハッシュ マップを作成することを検討します。要件の詳細を知らなければ、より具体的にすることは困難ですが、例として、文字列"Namespace/Class"は、名前空間とそれに含まれる単一のクラスを知ることに依存する一連のアクションのキーになる可能性があり、セットのキーになる"Class/Interface"可能性があります単一のクラスとそれが実装する単一のインターフェースを扱うアクションなど。

ツリー トラバーサル アルゴリズムは、独自のコンテキスト (親ノード、現在のノードなど) を追跡し、ツリー内の場所に基づいてキーを形成し、そのキーに設定されたアクションを取得して、それらすべてのアクションを実行できます。キーパターンに対応する実際のノードを提供する引数構造をそれぞれに与えます。

Cこれは、「もし私がクラスを持っていて、それがインターフェースを実装している場合、次のIようにして...Cと」という形式のルールを扱う特別な目的のルールエンジンを作成することになりますI

于 2009-01-10T00:18:18.960 に答える