0

一連の属性とメソッドを持つクラスがあります (もちろん、[属性メソッドではなく] 他のクラス メソッドを呼び出すことができます)。

クラスのソース コードと 1 つのメソッド名を入力として受け取るツールを作成する必要があります。このツールは、メソッド チェーンのコードによって変更された可能性のあるクラス属性のリストを返す必要があります。例えば:

private int a;
private int b;
private int c;

public void M1()
{
    if (a == 2)
    {
        this.M3();
    }
}

public void M2()
{
    a = 3;
    this.M3();
}

public void M3()
{
    if (a == 7)
    {
        b = 1;
    }
    else
    {
        c = 2;
    }
}

この場合、M1 を要求するとbcが返され、M2 を要求するとabcが返され、M3 を要求するとbcが返されます。

以前にコードを解析したことがないので、これをどこに置くべきかわかりません...事前に感謝します。

編集:明確にするために、さまざまなパスを評価する必要はありません。M3をチェックすると、bとcに影響すると常に言います。実際の変更ではなく、可能な変更のみを気にします。

4

1 に答える 1

1

ツールは 2 つの方法で実行する必要があると思います。最初のクエリは、各メソッドでどの変数が割り当てられているか、各メソッドでどのメソッドが呼び出されているかを特定します。2 番目のクエリはメソッド名を取得し、他のメソッドへの呼び出しをトレースし、その後にトレースされて呼び出される各メソッドから、どの変数が割り当てられているかをコンパイルします。

変数への代入を検出するには (構文解析でコードを簡素化し、行ごとに調べて空白を削除することをお勧めします)、代入演算子 (「=」、ただし「==」、「*=」ではなく) を探します。 '+=' などと私は思います -> および他の人も同様に割り当てることができます。MSDN は完全な可能性を教えてくれます。知っている場合は正規表現を試してください)。次に、割り当てられている変数、つまり変数を識別する必要があります。その演算子のすぐ左側に名前を付けます (ほとんどの場合)。メソッドごとにこれらの変数割り当ての記録を保存します。

コード内のメソッド呼び出しを検出するには、調べているメソッド内でメソッド名を探し、その 2 番目のメソッドを再帰的に調べて他のメソッドなどを見つける必要があります...上記と同じ方法で検出できますメソッドが呼び出し、独自に考えたデータ構造を使用して、その方法でループして検索します。

その上、コメントアウトされたコードについて心配する必要がありますが、これが初期段階のプロジェクトである場合は、まだ心配する必要はありません :)

于 2013-09-19T16:00:01.450 に答える