8

オブジェクトをインターフェイス (IFoo など) として渡し、コード内の任意の場所でそれらをそれらのインターフェイスの具体的な実装 (MyConcreteFoo など) に自発的にキャストする傾向がある継承コードがあります。

これはばかげた例です:

public bool IsThisFooScaredOfMonkeys(IFoo foo)
{
    if (foo is MyConcreteFoo)
    {
        return ((MyConcreteFoo)foo).BelievesMonkeysAreEvil;
    }
    return false;
}

私がやりたいのは、NDepend CQL クエリを記述して、これらの種類のキャストを取得し、メソッドごと、タイプごと、または実際に何かをカウントすることです。キャストを無作為に探してコードを調べさせるのではなく、この特定のブランドの愚かさを取り除くためにどこから努力を集中できるかを知っているだけです...

それを行う方法があるかどうか誰かが知っていますか?私はそうではないと思います(その特定の機能を必要とする人が多すぎることはあり得ません)が、最初にここで質問することにしました... :-)

もちろん、キャストハンティングを高速化する方法に関する他のアイデアも同様に高く評価されます.

4

1 に答える 1

2

これは非常に素晴らしいことですが、NDependは、個々のステートメントをカバーしない一連のエンティティに限定されます。

NDepend エンティティ

  1. メソッド
  2. 田畑
  3. 種類
  4. 名前空間
  5. アセンブリ

この制限にもかかわらず、NDepend は依然として非常に優れています。おそらくこれはバージョンの次の機能です。

パトリック・スマッキアが違うことを教えてくれるかもしれないので、私は彼にこの質問をするつもりです. 彼はかなり物事の上にいるので、私はすぐに返事を返すことを期待しています.

補足:

ReSharper 5.0を使用している場合、このようなステートメントを見つけることができる構造検索があります。自分で検索を作成する必要がありますが、これは非常に強力なツールです。

このパターンは、上記の例をキャッチします。

if($fooObject$ is $concreteFoo$)
{
    return (($concreteFoo$)$fooObject$).$anyIdentifier$;
}
于 2010-08-26T19:34:27.003 に答える