是否可以使用 NDepend 在 OOP 语言中查找 class 分区?

Is it possible to use NDepend to find class partitioning in an OOP language?

堡垒首先让我更好地解释上下文和问题。

上下文

我们有很多 class 方法;它违反了许多软件工程原则,这可以通过代码度量测量工具清楚地看到。 看到内聚性差,方法太多等等。

问题 当我们尝试将 class 拆分为更小的 classes 时,实例方法会出现问题。他们需要从 class 访问一个或多个字段 / 属性 ,将访问特定字段 / 属性 的所有方法放在一起可能很有用。当尝试使用 Resharper → 重构 → 提取 Class.

将一堆方法移动到新的 class 时,这个问题是显而易见的

是否可以划分连接在一起的方法和字段(具有高内聚性以使用代码度量术语)?

当然我们可以在这里做一些有趣的事情,但这需要一个分区算法,我不确定该选择哪个。

查询可能如下所示:

// Replace "NHibernate.Cfg.Configuration" with your "Namespace.TypeName"
let type = Application.Types.WithFullName("NHibernate.Cfg.Configuration").Single()
let dicoFields  =  type.Fields
   .ToDictionary(f => f, f => f.MethodsUsingMe.Where(m => m.ParentType == f.ParentType))
let dicoMethods = type.Methods
   .ToDictionary(m => m, m => m.FieldsUsed.Where(f => f.ParentType == m.ParentType))

// The partition algorithm on both dicos here

from pair in dicoFields 
orderby   pair.Value.Count() descending
select new { pair.Key, pair.Value } 

//from pair in dicoMethods 
//orderby   pair.Value.Count() descending
//select new { pair.Key, pair.Value} 

这对前进有帮助吗?

团队开始,我做了一些进一步的调查,得出了一些理论和一些部分解决的例子。

首先,要查找 Methods 使用的 属性,您应该在查询中将 FieldsUsed 替换为 MembersUsed。

我写了两个样本:

  • first 中,算法按预期工作(分区不重叠)
  • second中有一个问题(应该没有共同的元素)

要了解此部分解决方案,您可以查看 here and here :

我试图寻求一些建议here,我发现这是一个名为Steiner forest的优化问题,它涉及定向连接.

Partitioning a graph into connected subgraphs with sets of vertices that must be in the same subgraph

另请参阅: