1

NDepend を使用して、タスク (TPL) によってコンパイラによって生成されたサイクル依存関係を依存関係マトリックスから削除するにはどうすればよいでしょうか。

それらを削除できない場合、注意が必要な重要なサイクルの依存関係とどのように簡単に区別できるでしょうか。

コンパイラが生成したサイクルの依存関係を処理するためのベスト プラクティスはありますか?

編集:

コンパイラによって生成された依存関係サイクルは、図の左上で確認できます。

コンパイラによって生成された依存関係サイクルは、図の左上で確認できます。

依存関係サイクルを生成するコード (.Net 4.0 でコンパイル)

*ロガーは私のクラスのフィールドです

  private void WriteJsonFileToDiskAsync(string filePath, string json)
    {
        Task.Factory.StartNew(() => WriteJsonFileToDisk(filePath, json))
            .ContinueWith(HandleWriteException);
    }

    private void WriteJsonFileToDisk(string filePath, string json)
    {
        Stream fileStream = null;
        try
        {
            fileStream = File.Create(filePath);
            using (var writer = new StreamWriter(fileStream))
            {
                fileStream = null;
                writer.Write(json);
            }

            logger.InfoIfDebuggerIsAttached(string.Format(CultureInfo.InvariantCulture, "Persisted file: {0}", filePath));
        }
        finally
        {
            if (fileStream != null)
                fileStream.Dispose();
        }
    }

    private static void HandleWriteException(Task task)
    {
        if (task.IsFaulted)
        {
            //TODO: Handle Exception
        }
    }
4

1 に答える 1

1

アレクサンドル、あなたのソース コードをコンパイルした後、次の依存関係マトリックスを取得します。

ここに画像の説明を入力

コンパイラが内部で宣言されたサブタイプを生成したことがわかりProgramます。名前付きのこの生成された型Program+<>c__DisplayClass1は、単なるコンパイラの体操であり、ソース コードの一部ではありません。これは、これらの両方のタイプが相互に依存しており、多くのことを行うことができないという問題ではありません。

生成された型を破棄するには、次のようなクエリを記述できます...

from t in Application.Types
where !t.IsGeneratedByCompiler
select t

...そして、結果の一部をマトリックスにエクスポートします。

ここに画像の説明を入力

最後に、型が相互に依存していることは、一般的には問題ではないことを付け加えたいと思います。よく知られているGoF 設計パターンのほとんどは、相互に依存する型を必要とします。

問題は、相互に依存するコンポーネントがある場合、特にこれらのコンポーネントが名前空間である場合です。このトピックに関するホワイトブックが2 冊あり、NDepend の Web サイトで公開されています。

型が相互に依存していることが問題となるケースの 1 つは、基本クラスが派生物を使用している場合です (デフォルトの CQLinq ルール「基本クラスはそのために派生物を使用しないでください」があります)。

于 2013-05-23T16:24:32.503 に答える