依存関係グラフで見つけやすい問題は何ですか?
-
03-07-2019 - |
質問
ディペンデンシーグラフを作成するとき、私が探しているものは何ですか?
別の言い方をすると、見栄えの良いグラフと悪いグラフの特徴は何ですか?
編集:ここでのコンテキストは、NDependのアセンブリを初めて見たときです。
解決
発見できる最大の問題は、間違いなく依存関係サイクルです。 NDependツールは、インタラクティブな依存関係マトリックスと依存グラフは、依存サイクル。免責事項:私はツールの開発者の一人です
依存行列は、グラフよりもスポットサイクルにはるかに適合していることに注意してください。サイクルは行列が三角形になるのを避けるためです。
他の問題の範囲は、アプリケーションの構造に関連しています。たとえば、UIがDBを直接使用するのは正常ですか?またはさらに悪いことに、DBはUIに依存していますか?
LINQクエリ(CQLinq)のコードルールを記述して、禁止されているかどうかを確認できます。依存関係。次のコードルールは、UIタイプがDBタイプを直接使用しないことを確認します。
// <Name>UI layer shouldn't use directly DB types</Name>
warnif count > 0
// UI layer is made of types in namespaces using a UI framework
let uiTypes = Application.Namespaces.UsingAny(Assemblies.WithNameIn("PresentationFramework", "System.Windows", "System.Windows.Forms", "System.Web")).ChildTypes()
// You can easily customize this line to define what are DB types.
let dbTypes = ThirdParty.Assemblies.WithNameIn("System.Data", "EntityFramework", "NHibernate").ChildTypes()
// Ideally even DataSet and associated, usage should be forbidden from UI layer:
// http://stackoverflow.com/questions/1708690/is-list-better-than-dataset-for-ui-layer-in-asp-net
.Except(ThirdParty.Types.WithNameIn("DataSet", "DataTable", "DataRow"))
from uiType in uiTypes.UsingAny(dbTypes)
let dbTypesUsed = dbTypes.Intersect(uiType.TypesUsed)
select new { uiType, dbTypesUsed }
他のヒント
何の依存グラフ?クラス?ストアドプロシージャですか?
サイクルが悪い...
1つの依存関係を変更すると、他の多くの依存関係をすべて変更する必要がある場合、それは悪いことです。
しかし、はい、いくつかのコンテキストが役立ちます。
NDependが示す内容はわかりませんが、コードの多くのセクション(特に無関係なセクション)に入る傾向のあるアーティファクトは、悪い(IMHO)傾向があります。私はそれを「癌のコード」と考えていました。
NFJSカンファレンスのスピーカーは、いくつかの依存グラフを見せてくれました... 彼が指摘した臭いの1つは、コードベースのさまざまな機能部分との関係を持つものを探すことでした。これらはカプセル化を破壊する可能性があります。
また、各セクションの一般的な複雑さを見ていきます。