如何使用NDepend查找导致两种类型交织在一起的成员?

时间:2017-10-26 13:37:22

标签: ndepend cqlinq

我试图在我公司的一个.NET程序集中解开许多严重相互依赖的类型。

似乎第一步是采取几个课程,看看每个课程的成员是否相互依赖。

如何使用NDepend执行此操作?如果我有TypeA和TypeB,我可以写什么CQLinq来询问TypeA中使用TypeB的所有方法,以及TypeB中使用TypeA的所有方法?

1 个答案:

答案 0 :(得分:1)

首先,您可以使用此查询来匹配所有相互依赖的类型(您可能需要增加CQLinq运行超时,因为它是O(nbTypes ^ 2)查询)

from t1 in Application.Types
from t2 in Application.Types
where 
  t1 != t2 && 
  string.Compare(t1.FullName, t2.FullName) == 1 &&
  t1.IsUsing(t2) && t2.IsUsing(t1)
select new { t1, t2 }

NDepend classes coupling interdependent entangled

然后,对于每对,您可以将两种类型导出到矩阵列和行,如屏幕截图所示。 然后右键单击黑色单元格(黑色coz类型是相互依赖的),单击打开此依赖项

NDepend dependency matrix classes coupling interdependent entangled

然后单击此菜单 NDepend dependency matrix remove empty rows and columns

etvoilà,罪魁祸首现在很明显

  • 蓝色单元格表示列中的项目使用行中的项目
  • 绿色单元意味着相反,
  • 一种颜色比另一种颜色更多的细胞(这是常见的模式)清楚地表明最终丢弃的弱依赖性方向

NDepend dependency matrix class coupling

顺便说一下,第一个查询可以这样改进,查询结果中匹配的方法组也可以在右键菜单中导出到矩阵

from t1 in Application.Types
from t2 in Application.Types
where 
  t1 != t2 && 
  string.Compare(t1.FullName, t2.FullName) == 1 &&
  t1.IsUsing(t2) && t2.IsUsing(t1)
select new { t1, t2,
methodsOf1Using2 = t1.Methods.UsingAny(t2.Members),
methodsOf2Using1 = t2.Methods.UsingAny(t1.Members)
} 

NDepend code query result dependencies class coupling

处理依赖关系的相关文档: