什么是抽象与不稳定性图?

     2023-02-22     152

关键词:

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

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

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

抽象与接口

什么是抽象?包含用abstract标识的空方法的类就是抽象类。是一类对象的抽象概念,比如对圆、三角形等可以抽象出形状这个抽象类。用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示是一个抽象方法  ... 查看详情

虚方法与抽象方法有什么区别

抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写;虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。重写的子类虚函数就是被覆盖了。抽象方法使... 查看详情

设计模式(代码片段)

...展性和维护。里氏替换原则:是说有关继承的一些原则,什么时候应该继承,什么时候不应该继承,以及其中的一些原理。是继承和复用的原理,反应了父类和子类之间的关系。是对开闭原则的补充。  里氏替换原则作用:是... 查看详情

数据结构与算法-面试题汇总

目录栈和队列哈希表什么是哈希表,哈希表的实现是怎么样的,哈希冲突是什么,怎么解决哈希冲突?树简述完全二叉树简述AVL树简述红黑树红黑树和AVL树有什么区别?图简述最小生成树和其对应的算法简述... 查看详情

类图的作用与画图规范

...要产物,也是系统编码和测试的重要模型依据。三、什么时候画类图类图主要用在面向对象软件开发的分析和设计阶段,描述系统的静态结构。类图中包含从用户的客观世界模型中抽象出来的类、类的内部结构和类与类... 查看详情

依赖倒置原则

...始定义:高层模块不应该依赖底层模块,两者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象(Highlevelmodulesshouldnotdependuponlowlevelmodules.Bothshoulddependuponabstractions.Detailsshouldnotdependupondetails.Detailsshoulddependuponabstractions)。... 查看详情

《必须知道.net》3.oo之美

...哲学3.2.1本质诠释“不要调用我们,我们会调用你”3.2.2什么是依赖,什么是抽象“耦合是不可避免的”(1)什么是依赖和耦合依赖阐释耦合,耦合量化依赖程度。依赖角度:无依赖,单项依赖,双向依赖耦合角度:零耦合,没... 查看详情

抽象类

为什么引入抽象类?抽象类:几何图形classFigure子类:矩形classRectangle 圆classCircle三角形classTriangle等...  属性:曲边,直边,几条边,求面积,求周长...如果没有抽象类,父类提取出来的共性必须是唯一的,实现的,稳定的,那么求面... 查看详情

抽象类与接口

...承它的子类来实现它的规则,抽象类表示的是这个对象是什么,表现一个事物的本质,例如哈士奇和狼狗这两个类,那么它们的抽象类就是狗。抽象类分普通抽象类和纯抽象类,普通抽象类可以写一些基本的属性和基本方法的实... 查看详情

图与搜索

图是什么    图,顾名思义,就是一张大大的网,网中的每个节点都与另外一个节点直接或者间接的联系。互联网就是一个大大的图,从A到B到C经过的路由,就是图的搜索算法。    要给图下一个定义,那就是在众多离... 查看详情

工厂模式—工厂方法与抽象工厂的战争

概述什么是工厂方法?什么是抽象工厂?工厂方法是指工厂生产产品,而抽象工厂是生产产品系列。例如,工厂方法是只生产运输工具比如马车、公共汽车、自行车,而抽象工厂生产轮胎、螺丝钉交通工具零件。工厂方法模式定... 查看详情

抽象类的存在意义是什么?

...必须存在抽象类,所以把普通父类定义为抽象类;6、为什么不定义为普通父类 查看详情

java接口与抽象类(代码片段)

  一,接口1、什么是接口?  那在日常生活中接口是什么呢?就是两个对象之间进行连接的部分就是接口,就比如热水器与水管的接口一样,他可以确保不同的东西之间的顺利连接,就如不同的热水器厂家和水管厂家... 查看详情

抽象与封装(代码片段)

1.什么是类,什么是对象?2.如何创建对象?3.如何在程序中接收控制台的输入?4.如何从现实世界中抽象出类?5.构造方法的作用和特点是什么?6.什么是方法重载? 领养宠物并打印宠物信息Dog:packageAnimal;publicclassDogprivateStringna... 查看详情

抽象是什么

抽象:抽:抽取、抽离、分离;象:表述、表达; 软件的抽象:数据的抽象:属性,对象、继承;行为的抽象:接口、虚函数; 抽象就是将复杂物体的一个或几个特性抽出去,而只注意其他特性的行动或过程(如头脑只... 查看详情

冒号课堂阅读笔记oo的多态抽象类型——实中之虚

...——实中之虚 1.具体类型与抽象类型的区别是什么? 2.抽象数据类型与抽象类型的区别是什么? 3.除接口与抽象类外,还有其他抽象类型吗?它们各有何特点和意义吗? 4.抽象类型的主要作用是什么? 5.... 查看详情

什么是类?类与对象的区别是什么?

类只是为所有的对象定义了抽象的属性与行为。对象是类的具体表达,而类则是对象的抽象表达。类和对象(class)是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类... 查看详情

接口和抽象类的区别是什么

抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。 抽象类是通过关键字abstract来声明的。 抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法, 抽象方法没有... 查看详情