【问题标题】:What is Abstractness vs. Instability Graph?什么是抽象与不稳定性图?
【发布时间】:2010-11-05 02:13:16
【问题描述】:

我最近使用了 NDepend,它为我的 .net 程序集和相关 pdb 生成了一份很好的报告。

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

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

有一篇非常好的文章here 讨论了这个问题,但除此之外我还需要“我如何控制这个? [用稳定性控制抽象性]'

【问题讨论】:

    标签: architecture code-metrics ooad ndepend


    【解决方案1】:

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

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

    Robert C. Martin 在 OO 指标上的 article 以更量化的方式描述了这些概念。

    文章摘录:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      但无论如何,在尝试理解它们协同工作之前,您应该单独对不稳定性和抽象性指标有深刻的理解。你可以在这篇文章中找到一些关于不稳定性意味着什么的例子:How to Use Module Coupling and Instability Metrics to Guide Refactoring

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 2017-06-03
        • 2011-06-13
        相关资源
        最近更新 更多