Dependencies 在依赖关系图中容易发现哪些问题?

Dependencies 在依赖关系图中容易发现哪些问题?,dependencies,static-analysis,Dependencies,Static Analysis,当我生成依赖关系图时,我应该寻找什么 或者换句话说,一个好看的图形和一个不好看的图形有什么特点 编辑:这里的上下文是我第一次在NDepend中查看我的程序集。什么的依赖关系图?上课?存储过程 周期是不好的…如果更改一个依赖项意味着您需要更改大量其他依赖项,那么它是不好的。 但是,是的,一些上下文可能会有所帮助。我不知道NDepend显示了什么,但是倾向于进入代码的许多部分(特别是不相关的部分)的工件往往是不好的(IMHO)。我认为这是“癌症代码”。一位NFJS会议的发言人向我们展示了一些依赖关系

当我生成依赖关系图时,我应该寻找什么

或者换句话说,一个好看的图形和一个不好看的图形有什么特点


编辑:这里的上下文是我第一次在NDepend中查看我的程序集。

什么的依赖关系图?上课?存储过程


周期是不好的…

如果更改一个依赖项意味着您需要更改大量其他依赖项,那么它是不好的。

但是,是的,一些上下文可能会有所帮助。

我不知道NDepend显示了什么,但是倾向于进入代码的许多部分(特别是不相关的部分)的工件往往是不好的(IMHO)。我认为这是“癌症代码”。

一位NFJS会议的发言人向我们展示了一些依赖关系图。。。 他指出的一种气味是寻找与代码库不同功能部分相关的东西。这些可能会破坏封装


此外,我还将了解每个部分的总体复杂性。。满是线条的是可疑的。

你能发现的最大问题肯定是依赖循环。工具NDepend提出了一个交互式的和一个有助于识别的方法。免责声明:我是该工具的开发者之一

请注意,依赖关系矩阵比图形更适合于点循环。因为循环避免了矩阵是三角形的

其他问题范围与您的应用程序结构有关:例如,UI直接使用DB是否正常?或者更糟糕的是,数据库依赖于用户界面

您可以编写以检查禁止的依赖项。以下代码规则检查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 }
//UI层不应直接使用DB类型
如果计数大于0,则警告
//UI层由使用UI框架的名称空间中的类型组成
让uiTypes=Application.namespace.UsingAny(Assemblies.WithNameIn(“PresentationFramework”、“System.Windows”、“System.Windows.Forms”、“System.Web”)).ChildTypes()
//您可以轻松地自定义这一行来定义什么是DB类型。
让dbTypes=ThirdParty.Assemblies.WithNameIn(“System.Data”、“EntityFramework”、“NHibernate”).ChildTypes()
//理想情况下,即使是数据集和相关数据,也应禁止从UI层使用:
// http://stackoverflow.com/questions/1708690/is-list-better-than-dataset-for-ui-layer-in-asp-net
.Exception(第三方.Types.WithNameIn(“数据集”、“数据表”、“数据行”))
从uiTypes.UsingAny(dbTypes)中的uiType
让dbTypesUsed=dbTypes.Intersect(uiType.TypesUsed)
选择新{uiType,dbTypesUsed}