是否可以使用 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。
我写了两个样本:
要了解此部分解决方案,您可以查看 here and here :
我试图寻求一些建议here,我发现这是一个名为Steiner forest的优化问题,它涉及定向连接图.
Partitioning a graph into connected subgraphs with sets of vertices that must be in the same subgraph
另请参阅:
- Component (graph theory) 维基百科
- Partitioning a graph into connected subgraphs with sets of vertices that must be in the same subgraph
- CommunityGraphPlot
堡垒首先让我更好地解释上下文和问题。
上下文
我们有很多 class 方法;它违反了许多软件工程原则,这可以通过代码度量测量工具清楚地看到。 看到内聚性差,方法太多等等。
问题
当我们尝试将 class 拆分为更小的 classes 时,实例方法会出现问题。他们需要从 class 访问一个或多个字段 / 属性 ,将访问特定字段 / 属性 的所有方法放在一起可能很有用。当尝试使用 Resharper → 重构 → 提取 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。
我写了两个样本:
要了解此部分解决方案,您可以查看 here and here :
我试图寻求一些建议here,我发现这是一个名为Steiner forest的优化问题,它涉及定向连接图.
Partitioning a graph into connected subgraphs with sets of vertices that must be in the same subgraph
另请参阅:
- Component (graph theory) 维基百科
- Partitioning a graph into connected subgraphs with sets of vertices that must be in the same subgraph
- CommunityGraphPlot