按依赖顺序排序类(NDepend)

时间:2018-06-18 16:20:34

标签: c# ndepend

我是NDepend的新手,只是让我的脚湿透了。我可以使用以下简单查询创建类依赖图:

from t in Application.Types
// remove compiler generated classes
where !t.FullName.Contains(">")
// sort by dependency count
orderby t.TypesUsed.Count()
select new { t, t.TypesUsed }

我正在尝试构建一个有序的类列表,这样列表中的第一项不具有系统类型以外的依赖项。当我们浏览列表时,每个类型应该只有在列表中出现的依赖项。我意识到在具有周期性依赖性的情况下这是不可能的,但我想至少让它们进入一个更正确的顺序,而不仅仅是通过依赖计数排序。

1 个答案:

答案 0 :(得分:1)

这是一个棘手的但可行的。此CQLinq代码查询使用了NDepend.API方法FillIterative()的魔力。

// The call FillIterative() will fill hashSet with types already processed
let hashSet = new HashSet<IType>()

let fillHashSetWithTypesFunc = new Func<IEnumerable<IType>, bool>(types => types.All(t => hashSet.Add(t)))

let metric = ThirdParty.Types.FillIterative(
   types => 
      // Use a ternary operator to invoke fillHashSetWithTypesFunc() that always return true,
      fillHashSetWithTypesFunc(types) ?
         // Select t when hashSet contains all t.TypesUsed
         Application.Types.Where(t => t.TypesUsed.Intersect(hashSet).Count() == t.TypesUsed.Count()) :
         // new IType[0] is never invoqued coz fillHashSetWithTypesFunc() always returns true
         new IType[0])

from val in metric 
where val.Value > 0  // Don't show third-party types
orderby val.Value ascending
select new { val.CodeElement, 
   (val.CodeElement as IType).Level, 
   val.Value, 
   (val.CodeElement as IType).TypesUsed }

循环中涉及的类型不匹配。

结果为匹配的每种类型分配一个值:

  • (1)是仅使用第三方类型的类型
  • (2)是使用第三方的类型,而(1)中的类型
  • (3)...

有趣的是,指标IType.Level可以准确地提供该指标并回答您的问题。但是用代码查询重新编写它会更有趣。可以使用名称空间(也具有“级别”度量标准),程序集和方法来完成此操作。

Level metric applied on type