22

我最近使用了 NDepend,它对我的​​ .net 程序集和相关 pdb 产生了很好的报告。

我在报告中发现的最有趣的事情是抽象性与不稳定性图。我想详细了解这一点,我阅读了他们的文档和在线指标,但这只能在一定程度上有所帮助。

首先,我希望了解如何正确评估图形以及稳定控制抽象性的技术。

这里有一篇非常好的文章对此进行了讨论,但除此之外我还需要“我如何控制它?[稳定地控制抽象性]'

替代文字

4

2 回答 2

29

抽象度是衡量软件系统刚性的指标。抽象程度越高,刚性越低(或灵活性越大),反之亦然。如果系统的组件依赖于抽象类或接口,那么这样的系统比直接依赖于具体类更容易扩展和更改。

稳定性是对更改的容忍度的度量,就像软件系统在不破坏它的情况下允许对其进行更改的程度一样。这是通过分析系统组件的相互依赖性来确定的。

Robert C. Martin 关于 OO 指标的文章以更量化的方式描述了这些概念。

文章摘录:

一个类别的责任、独立性和稳定性可以通过计算与该类别交互的依赖关系来衡量。已确定三个指标:

Ca : Afferent Couplings : 此类别之外的类别数量取决于此类别中的类别。

Ce : Efferent Couplings : 此类别内的类数依赖于此类别外的类。

I : 不稳定性 : (Ce ÷ (Ca+Ce)) : 这个度量的范围是 [0,1]。I=0 表示最大稳定类别。I=1 表示最大不稳定类别。

A:抽象性:(类别中的#抽象类÷类别中的总类数)。这个度量范围是 [0,1]。0 表示具体,1 表示完全抽象。

在任何特别大的软件系统中,平衡是至关重要的。在这种情况下,系统应该平衡抽象性和稳定性才能“好”。AI 图上的位置显示了这一点。请阅读文章以获得解释。

于 2009-08-19T11:12:01.240 回答
2

抽象性和不稳定性都可以单独用于评估您的代码。您事先知道某个模块应该是多么抽象或稳定。例如,您希望表示层适度抽象且高度稳定,因为较低的模块依赖于它。另一方面,您希望基础设施层高度具体(低抽象性)和高度不稳定,因为它应该实现上层的要求。

一旦明确了这一点,您就可以将抽象性和不稳定性组合成一个图,这就是不稳定性-抽象图。您希望您的代码表现出尽可能多的抽象性,因为它是稳定的,以平衡支持未来需求变化的需求。

但无论如何,在尝试理解它们一起工作之前,您应该单独对不稳定性和抽象性指标有深刻的理解。您可以在本文中找到一些关于不稳定性意味着什么的示例:如何使用模块耦合和不稳定性指标来指导重构

有一篇相关文章派生了一个 CQLinq 查询来测量应用程序中所有模块的不稳定性:How to Measure Module Coupling and Instability Using NDepend

于 2015-08-12T09:12:29.390 回答