我最近使用了NDepend,它为我的.net程序集和相关的pdbs提供了一个很好的报告。

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

主要是希望了解如何正确评估图形以及如何稳定地控制抽象性的技术。

有一篇非常好的文章这里就这个问题进行了讨论但除此之外我还需要的是'我该如何控制它? [稳定控制抽象]'

有帮助吗?

解决方案

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

稳定性是对变化容忍度的衡量标准,因为软件系统允许对其进行更改而不会破坏它。这是通过分析系统组件的相互依赖性来确定的。

罗伯特·C·马丁关于面向对象指标的文章描述了这些概念的更多定量术语

摘自文章:

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

Ca:传入耦合:此类别之外的类数取决于此类别中的类。

Ce:传出耦合:此类别中依赖于此类别之外的类的类数。

I:不稳定性:(Ce÷(Ca + Ce)):该指标的范围为[0,1]。 I = 0表示最大稳定类别。 I = 1表示最大不稳定类别。

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

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

其他提示

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

一旦清楚,你就可以将抽象性和不稳定性结合到一个图中,这就是不稳定性 - 抽象性图。您希望您的代码能够展现出稳定的抽象性,以平衡需求以支持未来的需求变化。

但无论如何,在尝试理解它们之间的合作之前,你应该对不稳定性和抽象性指标有很强的理解。您可以在本文中找到一些关于不稳定性含义的示例:如何使用模块耦合和不稳定度指标来指导重构

有一篇相关文章推导出一个CQLinq查询,用于衡量应用程序中所有模块的不稳定性:如何使用NDepend测量模块耦合和不稳定性

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top