2023软件度量考点

2023软件度量考点

考试:软件生命周期\textcolor{red}{考试:软件生命周期}⭐️

生命周期

序列图(活动图)——高级基本控制结构:自递归调用、中断、并行三种

需求分析:

  • 功能点度量,大题
  • 用例点度量
  • size、Effort、cost、Schedule

概要设计(模块):

  • 内聚、耦合

  • 数据流结构度量

详细设计:

  • 控制流结构度量

  • 数据结构度量,面向对象度量(CK,LK)。面向对象的度量会出大题

  • 试运行、维护、质量度量

软件度量方法分为三种:

  1. 软件规模度量方法:这种方法旨在测量软件项目的规模,以便对开发工作量和项目时间表进行估计。通常使用行数、功能点数等指标来度量软件规模。

  2. 软件复杂度度量方法:这种方法旨在测量软件系统的复杂性。软件复杂度通常包括模块之间的相互作用、代码结构、程序流程、数据结构等。通常使用代码行数、圈复杂度等指标来度量软件复杂度。

  3. 软件质量度量方法:这种方法旨在测量软件系统的质量。软件质量通常包括正确性、可靠性、可用性、可维护性、可扩展性等方面。通常使用缺陷密度、代码可读性、代码复杂度等指标来度量软件质量。

助记部分(共27点):

  • 软件测试、测量、度量

  • 对实体属性的测量,度量点……

  • 软件度量的3p

  • 软件质量包括:功能性、可靠性……

  • 软件度量方法分为:软件规模、软件复杂性、软件质量……

  • 测量的目的:了解、预测、控制、提升……

  • 测量要明确的4个问题

  • 测量尺度

  • 测量方式分为:……

  • 什么是度量?……

  • 度量方式分为:……

  • 度量的3个实体

  • 度量的属性:内在、外在

  • 软件过程中的一些重要点

  • Halstead预测法

  • LOC度量

  • 各阶段涉及到的图

  • 设计方面

    • 功能点度量
    • 用例点度量
    • 对象点(OP)
    • 特征点
  • 软件结构

  • 软件结构度量

    • 数据流结构
    • 控制流结构
    • 数据结构
  • 控制结构度量

  • 面向对象度量

    • LK 度量(4)
    • CK 度量(6)
    • MOOD 度量
  • 软件代码度量

  • 数据结构度量

  • 软件质量模型

  • 软件错误、缺陷……

  • 软件质量度量

Chapter 1

考试:ISO 9126是专门针对软件质量的定义\textcolor{red}{考试:ISO \ 9126是专门针对软件质量的定义}

软件质量模型

软件质量模型:软件质量是**软件产品的外部属性,而不是内部属性。软件质量的含义包括:要满足软件的功能需求且尽量不出错,要达到用户的期望且方便适用。软件质量的定义为软件明确的隐含的定义的需求相一致的程度,是软件符合明确的功能需求性能需求,文档中有明确描述的开发标准以及所有专业开发的软件都应该具有的隐含特征**的程度。

McCall 质量模型: Boehm 质量模型
image-20230422214221131 image-20230422214130920
ISO 9126 质量模型 CMM 模型
image-20230422214143616 没有给出**度量**软件质量框架

Chapter 3

考试:LOC(代码行度量)简答题\textcolor{red}{考试:LOC(代码行度量)简答题}

代码行LOC:一般指所有的可执行的源代码行数,包括可交付的工作控制语句、数据定义、类型声明、输入输出声明等。

常用的单位有 :
①源代码行SLOC:有两种测量方法,一种是测量物理代码行PLOC,即注释外源程序行数;另一种是测量逻辑代码行LLOC,即可执行的源程序行数
②非注释代码行NCLOC
③注释代码行CLOC
④千代码行KLOC

Advantages of LOC

  • 简单且可自动测量,可以直接反映软件的规模大小

  • 程序工作量及成本呈现正相关

Disadvantage of LOC

  • 定义模糊

  • 与程序语言相关

  • 与程序员的能力相关

  • 不适合于早期阶段对规模的预测

可以用代码行来间接得到代码注释密度,可以一定程度上反映程序的可理解性可修改性可维护性

ρ=CLOCCLOC+NCLOC\rho=\frac{C L O C}{C L O C+N C L O C}

LOC(line of code)

  • 缺点:定义模糊,与程序语言相关,与程序员的能力相关,不适合于早期阶段对规模的预测
  • 优点:可以自动测量,可以直接反映软件的规模大小,与程序的工作量及成本直接相关

考试:功能点度量有一个大题\textcolor{red}{考试:功能点度量有一个大题}

功能点:由数据流图来测量,利用软件需求分析度量软件规模。向用户提供的功能分为数据功能交易功能两种类型,前者包括 EIF 和 ILF,后者包括 EI,EO,EQ。功能点度量一般用 UFCVAF 来计算,UFC 测量功能需求VAF 测量非功能需求

软件的功能点是未调整功能计数(UFC)和价值调整因子(VAF)的乘积。

  • UFC:Unadjusted Function Count
  • VAF:Value Adjustment Factor
1、UFC计算方法

UFC 而言用下表来计算:

Weight Factor(右边为权重因子) Simple Average Complex
Number of External Inputs 外部输入(EI) 3 4 6
Number of External Outputs 外部输出(EO) 4 5 7
Number of External Queries 外部查询(EQ) 3 4 6
Number of External Interfaces Files 外部接口文件(EIF) 5 7 10
Number of Internal Logic Files 内部逻辑文件(ILF) 7 10 15

其中因为 Queries 相比于 Input,还需要考虑点击事件、查询后还必须由反馈信息,所以两者区分开来。

  • 外部输入是指用户或其他系统向软件系统输入数据的功能,数据可以是单个数据项或数据集合。

  • 外部查询是指软件系统向用户或其他系统提供查询结果的功能,查询结果可以是单个数据项或数据集合。

功能点度量方法中,需要测量程序的哪五个主要成分?

  1. 外部输入(External Inputs,EI):指用户或其他系统向软件系统输入数据的功能。例如,用户在一个电子商务系统中输入商品信息和订单信息就是外部输入。
  2. 外部输出(External Outputs,EO):指软件系统向用户或其他系统提供输出结果的功能。例如,在一个学生信息管理系统中,用户可以查询某个学生的信息,该查询结果就是外部输出。
  3. 外部查询(External Inquiries,EQ):指用户或其他系统查询软件系统中的数据的功能。例如,在一个银行系统中,用户可以查询自己的账户余额,该查询就是外部查询。
  4. 外部接口文件(External Interface Files,EIF):指软件系统与外部系统或组件之间进行数据交换的文件。例如,在一个在线支付系统中,与第三方支付接口交换的数据文件就是外部接口文件。
  5. 内部逻辑文件(Internal Logical Files,ILF):指软件系统内部维护数据文件数据集合,例如,在一个库存管理系统中,库存信息和供应商信息就是内部逻辑文件。
2、VAF计算方法

VAF 而言,一共 14 个指标,每个指标都有如下六个等级,计算时需要统计这 14 个指标的等级和,VAF∈[0.65, 1.35]:

0=factor not present or has no influence

1=insignificant influence

2=moderate influence

3=average influence

4=significant influence

5=strong influence

VAF=0.65+0.01ΣFiFP=UFC×VAF\begin{aligned} & \mathrm{VAF}=0.65+0.01 \Sigma \mathrm{F}_{\mathrm{i}} \\ & \mathrm{FP}=\mathrm{UFC} \times \mathrm{VAF}\end{aligned}

image-20230425144329042

计算得到FP值(功能点数)之后可以进行如下功能点度量:

1、生产能力

Productivity=FPPersonMonthsProductivity = \frac{FP }{Person-Months}

FP是指软件项目的总功能点数,Person-Months是指完成该项目所需的总人月数。

2、每个功能点所需的平均文档页面数量

Documentation=pages of documentationFPDocumentation = \frac{pages \ of \ documentation}{FP}

Pages of Documentation是指在软件开发过程中需要编写的文档总页数,FP是指软件项目的总功能点数。

功能点度量可以用于**预测软件规模计算缺陷密度估算软件工作量估算软件成本计划开发时间计划人员安排**

  • 优点:简单(准确),早期,泛用性强

  • 缺点:主观,不直观

优点:

  1. 与代码行数等物理度量方法相比,功能点度量更为准确。这是因为功能点度量是基于软件系统的实际功能需求进行测量,而不是基于代码行数等技术细节进行测量。
  2. 功能点度量可以在早期对规模进行度量
  3. 功能点度量可以用于不同编程语言和技术平台的软件项目。这是因为功能点度量与具体的编程语言和技术平台无关,而是基于软件系统的功能需求进行测量。
  4. 功能点度量可以帮助管理者更好地了解软件项目的规模和开发工作量。这有助于管理者做出更明智的决策,并合理分配资源。

缺点:

  1. 功能点度量可能存在主观性和误差不同的评估人员可能会对同一个软件系统得出不同的功能点数,这可能会影响度量的准确性和可信度。

  2. 功能点度量不能很直观地反映软件系统的复杂性和质量。虽然功能点度量可以帮助评估软件系统的规模和开发工作量,但它并不能很好地反映软件系统的复杂性和质量,这需要使用其他软件度量方法进行评估。

适合:数据处理较多的项目

考试:用例点的度量\textcolor{red}{考试:用例点的度量}

  1. 复杂角色与简单角色的判断;(参考:UAW计算步骤下的角色权重评估表)

  2. 是否有SLA;

  3. 角色的权重(权重分析)

用例点:用例图中包含的角色越多,用例越多,用户的需求功能也就越多,软件的规模也就越大。一般分为六个步骤:

①计算未调整前的角色权重 UAW

角色权重评估表 计算示例
image-20230421221334589 image-20230421223414039

②计算未调整前的用例权重 UUCW:一般来说,用例中包含的操作处理越多,或实现用例功能涉及的越多,用例就越复杂。

  • 有以下 3 种评估方法:

image-20230421221455186

  • 针对以上 3 种评估方法,分别由对应的用例权重评估表:

image-20230421221544169

③计算未调整前的用例点 UUCP=UAW+UUCW

④计算技术复杂因子 TCF=0.6+(0.01* TFactor)

  • 技术复杂性因素权重表如下:

image-20230421221822400

每个 Ti 都有 0-5 六个等级,需要加权求。

⑤计算环境因子 EF=1.4+(-0.03*EFactor)

  • 环境复杂性因素权重表如下:

image-20230421222028278

权重正负表示环境对项目产生的影响是正影响还是负影响。每个 Fi 都有 0-5 六个等级,需要加权求和:

𝑬𝑭𝒂𝒄𝒕𝒐𝒓=i=18FiWi𝑬𝑭𝒂𝒄𝒕𝒐𝒓 = \sum_{i=1}^{8}F_iW_i

其中,Fi的值如下:

image-20230421222820125

⑥计算调整后的用例点 UCP=UUCP*TCF*EF

最后可能会需要通过 UCP 计算开发工作量 Effort

Effort=UCPpersonhoursEffort = UCP*person_{hours}

一个用例点可能需要花费15-30 person-hours。

一个用例点花费 15-30 人时/UCP

补充:

(3)对象点:𝑶𝑷 = 𝑶𝑷 ∗ (𝟏 − 𝒓%),其中r%表示的是从先前项目中重用的部分

(4)特征点:以功能点为基础,还要考虑算法复杂度

术语:

  • SLA = Service Level Agreement = 服务质量/水平协议
  • SLO = Service Level Objective = 服务质量/水平目标
  • SLI = Services Level Indicator = 服务质量/水平指标

考试:计算UAW(未调整前的角色权重)\textcolor{red}{考试:计算UAW(未调整前的角色权重)}

这里的内容详见用例点度量:

角色复杂程度的判断:

  • 简单:通过接口连接的另一个系统;

    • 具有定义的应用程序编程接口的系统
  • 普通:通过协议连接的另一个系统;

    • 一个普通的参与者要么是另一个通过协议如TCP/IP进行交互的系统,要么是一个人通过基于文本的界面如ASCII终端进行交互
  • 复杂:通过人机交互界面进行交互的人。

    • 一个通过人机交互界面进行交互的人

From Chapter 3 Page:54

—以上内容均来自Chapter 3—

Chapter 4

考试:能够分清是什么样的耦合?\textcolor{red}{考试:能够分清是什么样的耦合?}

image-20230414141237426

软件结构度量

软件结构度量:分布在概要设计、详细设计、编码、测试和质量维护。软件模块化与内聚、耦合、信息隐藏、信息流扇入扇出有关。软件模块化以**分治法为依据,程序是模块模块不仅仅是程序**,要求每个模块只完成软件需求中的**独立子功能,并且与其他模块的联系最少接口简单,模块化的度量标准有内聚性耦合性,目标是高内聚、低耦合**

模块内聚性度量

(1) 模块内聚性度量:是指完成同一任务时对模块**各个组成部分的需要程度**。根据内聚程度由高到低分别分为功能内聚顺序内聚通信内聚过程内聚时间内聚逻辑内聚偶然内聚

内聚率=功能内聚模块数总模块数内聚率 = \frac{功能内聚模块数}{总模块数}

  1. 功能内聚:将所有完成同一功能的元素放到一个模块中,如输入输出处理模块、数据存储模块等。

    • (强调模块内元素的功能相关性,意味着,模块中的所有元素都应该属于同一类别)
    • 例如,一个处理用户信息的模块应该包含所有与用户信息有关的元素,比如用户输入、用户验证、用户数据库查询等等。
  2. 顺序内聚:将一系列相互依赖的操作放到同一个模块中,这些操作必须按照特定的顺序依次执行

  3. 通信内聚:将需要进行相互通信的元素放到同一个模块中,例如消息处理器或邮件发送器等。

  4. 过程内聚:将相关联的操作放到同一个模块中,在该模块内可以共享相同的数据结构和变量

  5. 时间内聚:将需要同时执行的操作放到同一个模块中,例如计时器或周期性任务调度器等。

  6. 逻辑内聚:指模块内的各个元素之间存在一定的逻辑关系,这些元素共同完成一个特定的功能或者任务。

    • (强调模块内元素的逻辑关系)
模块耦合性度量

(2) 模块耦合性度量:模块耦合是指**两个模块之间的相互依赖程度。可以利用系统中模块对的耦合性来计算全局的耦合性,一般来说,模块之间的联系越多,模块的调用关系越复杂,模块对的耦合性越高,系统的全局耦合性也就越高。根据耦合程度由低到高可以分为无耦合数据耦合标记耦合控制耦合公共耦合内容耦合**。

假设系统中的两个模块 x 和 y,两者的耦合关系记为 Ri。则:

①无耦合关系 R0:表示 x 和 y 无联系,完全独立

②数据耦合关系 R1:表示 x 和 y 通过**参数发生联系,参数要么是数据元素要么是不含控制元素同类数据项的集合**

  • 一个模块向另一个模块传入的参数是普通数据

  • sum (int a, int b)
    {
        int c;
        c=a+b;
        return(c);
    }
    main()
    {
        int x, y;
        printf (sum(x, y)); //数据
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25



    ③标记耦合关系 R2:表示通过参数表传递**<u>相同的记录类型</u>**,这个类型==不是基本类型==, 是<u>**例如结构体、类这样的类型**</u>

    - 一个模块向另一个模块传入的参数是一个<u>**数据结构**</u>(数组、记录、图、文件、对象等);

    - ```cpp
    Class Student ( ) // Student 类
    {
    }
    StuInfo(Student Stu)
    {
    string sno = Stu.getSno();
    string name = Stu.getName();
    string major = Stu.getMajor();
    string cclass = Stu.getCClass();
    string info = sno + name + mojor + cclass;
    return(info);
    }
    main()
    {
    Student Tom = new Student ( ); // Student 对象
    printf (StuInfo(Tom)); // 传入参数是对象
    }

④控制耦合关系 R3:表示 x **为了控制 y 的行为**而向其传递了一个表示控制信息的参数。我们要尽量避免 R3,可以把 R3 通过分解功能转变为R1

  • 一个模块向另一个模块传入的参数是开关、标志或名字信息,其作用是明显控制另一个模块的功能

  • output (flag)
    {
        if (flag) //标志控制
        	printf (“Yes!”);
        else
        	printf (“No!”);
    }
    main()
    {
        bool flag;
        output (flag); //标志
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40



    ⑤公共耦合关系 R4:表示 x 和 y 都访问了一个**<u>公共数据环境</u>**

    - ==公共耦合==是指两个或多个模块共享同一组<u>**全局数据**</u>,而==数据耦合==是指两个或多个模块共享同一组<u>**局部数据**</u>。

    ⑥内容耦合关系 R5:表示 x 引用到了 y 的内部,当出现**<u>一个模块直接访问另一个模块的内部数据</u>**或者**<u>一个模块不通过正常入口转到另一模块内部</u>**或者**<u>两个模块有一部分程序代码重叠</u>**或者**<u>一个模块有多个入口</u>**,则表示发生了 R5

    结构化程序设计要尽量保证**<u>单入口单出口</u>**,要**<u>避免使用 goto 语句</u>**

    ![image-20230422124255309](https://wangguijie-typora.oss-cn-chengdu.aliyuncs.com/img/image-20230422124255309.png)

    局部耦合度:模块 x 和 y 之间的耦合紧密程度通过耦合度 **c(x,y)**来计算,
    $$
    𝒄(𝒙, 𝒚) = 𝒌 + \frac{𝒏}{𝒏+𝟏}
    $$
    ,其中 k 是 x 和 y 之间**<u>最紧密的耦合关系 Rk</u>**,n 是 x 和 y 之间的**<u>相互连接数</u>**

    全局耦合度:C(S)是系统 S 中两两模块间<u>耦合度集合</u>的**<u>中位数</u>**

    > <span style="color: red;"><u>***思考:如何消除控制耦合?如何修改上述控制耦合所示程序?***</u></span>
    >
    > ```cpp
    > outputY //Yes控制程序
    > {
    > printf (“Yes!”);
    > }
    > output //No控制程序
    > {
    > printf(“No!”);
    > }
    > main()
    > {// 不再向另一个模块传递开关/标志等,由此更改了控制耦合
    > bool flag;
    > if (flag) //Yes控制逻辑
    > outputY;
    > else //No控制逻辑
    > outputN;
    > }
信息流结构度量

(3) 信息流结构度量:一个模块**调用另一个模块并且向它传递信息或者被调用模块向调用模块返回一个返回值就会产生信息流。模块中用于描述信息流的两个特殊属性是扇入扇出。扇入指的是直接调用该模块的上级模块的个数,扇出指的是模块直接调用的下级模块的个数**。

一个模块**扇入大说明其可重用性高,一个模块的扇出大说明其复杂度高**。扇入扇出不可过多或过少。

信息流结构复杂性度量有两种方法:

Henry-Kafura

信息流复杂性(𝑴)=长度(𝑴)(扇入(𝑴)扇出(𝑴))2信息流复杂性(𝑴) = 长度(𝑴) ∗ ( 扇入(𝑴) ∗ 扇出(𝑴))^2

长度可以用**代码行数**来代替。

Shepperd

信息流复杂性(𝑴)=(扇入(𝑴)扇出(𝑴))2信息流复杂性(𝑴) = (扇入(𝑴) ∗ 扇出(𝑴))^2

这是一种**纯信息流结构的**算法。

但是以上两种方法都有同一个问题:当某模块的扇入或者扇出为 0 时,复杂性也会是 0

考试:程序控制流图/一个控制流结构大题\textcolor{red}{考试:程序控制流图/一个控制流结构大题}

圈(环形)复杂度、画程序流程图、理解圈复杂度的意义(反映出了什么,圈复杂度越大的话,这个程序代码坏味道)

PPT知识点位置(计算示例) 类型题
image-20230407144813765 image-20230422110239187

补充:计算圈复杂度、、圈复杂度的意义、.程序流程图、反映出了什么,圈复杂度越大的话,这个程序是不是有一种代码坏味道啊


控制结构度量

控制结构度量:基本控制结构(BCSs)是一组用于创建程序逻辑结构的基本控制流机制, 包括条件循环顺序三种类型。而高级基本控制结构有自递归调用中断并行这三种, 可以通过面向对象设计中的**活动图**来反映。

控制流结构复杂性的度量可以用 **McCabe’s 圈复杂度度量**来做。如果图 G 有 n 个顶点,e 条边,连通分量是 P,则

𝑽(𝑮)=𝒆𝒏+𝑷𝑽(𝑮) = 𝒆 − 𝒏 + 𝑷

一般一个模块的圈复杂度不超过 10,数量表现为**独立线性路径条数,也可以理解为覆盖所有可能情况使用最少的测试用例数,程序的可能错误与高的圈复杂度有着很大关系, 圈复杂度可以通过设计实现自动化的程序来计算,可以通过图论的方法计算判定节点来设计自动化程序。该方法最好是在详细设计阶段完成,用程序流程图控制流图**来度量。

环形复杂度对于软件开发过程能起到哪些积极的作用?

环形复杂度(圈复杂度)在软件开发过程中可以起到以下积极的作用:

  1. 识别潜在问题:环形复杂度可用于分析代码中的循环结构,可以帮助开发人员识别潜在的性能问题错误代码逻辑混乱等。

  2. 改进代码质量:通过使用环形复杂度分析工具,开发人员可以更好地了解其代码的复杂程度进行必要的优化和重构,以提高代码质量和可维护性

  3. 提高程序性能:环形复杂度可用于分析程序中的循环结构,并确定需要优化的区域。这有助于编写更有效率的代码,从而提高程序的执行速度

  4. 预测系统行为:环形复杂度可用于预测系统行为,以便开发人员可以及早识别可能导致系统故障崩溃的问题,以便及时进行修复

Chapter 5

专有术语

LK度量:

  • CS (Class Size)

  • NOO (Number of Operations Overridden)

  • NOA (Number of Added)

  • SI (Specialization Index)

CK度量:

image-20230422012522763

考试:面向对象度量解答题:\textcolor{red}{考试:面向对象度量-解答题:}

1、为什么要提出一套专门的面向对象的方法?

  • 封装性

  • 继承性

  • 多态性:体现在方法的重载和重写

  • 局部性

面向对象的软件的特性:继承性、多态性、封装性、局部性


面向对象度量(OO metrics)方法:面向对象技术采用抽象封装继承多态信息隐藏重用性等来度量,对于子类规模的度量方法:计算子类在父类的基础上,增加了多少个属性和方法, 增加的越多,子类规模越大。

面向对象度量方法从五个方面来考虑局部性封装性继承性多态性信息隐藏

主要有以下度量方法:

1、LK 度量法:考虑四个度量点

①类规模度量 CS:从属性总数量和方法总数量两个点来考虑

②方法重写数 NOO:计算子类继承父类时**重写父类方法的数量**,NOO 过大表示父类抽象不够好

③增加方法数量 NOA:子类继承父类时**增加的方法的数量**,随着深度越深,NOA 越小越好

④特征化指数 SI:用来度量每一个子类在类图设计中的特征化等级,属于**间接测量的综合属性,SI 过大说明类不符合抽象层次结构,体现了面向对象的抽象性继承性**。公式如下:

image-20230422010743473

2、CK 度量法:考虑六个度量点

(详细请见下一考点处:“考试:CK——LCOM:缺乏内聚”)

3、MOOD 度量法:考虑四类,六个度量点

①封装性度量点 MHF 和 AHF:方法、属性的隐藏程度

②继承性度量点 MIF 和 AIF:方法、属性的继承比例

③多态性度量点 PF:子类重写父类方法的比例

④消息传递度量点 CF:类间方法消息交互,表示耦合

考试:CK——LCOM:缺乏内聚\textcolor{red}{考试:CK——LCOM:缺乏内聚}

image-20230407141723134 image-20230407141427355

方法数增加,内聚数会不会陡然增加,LCOM缺乏内聚

CK 度量法:考虑六个度量点

①类的加权方法 WMC:是对类规模类复杂度的度量,设类有方法 M1~Mn,它们的复杂度分别为 C1~Cn,则

𝑾𝑴𝑪=i=1nCi𝑾𝑴𝑪 = \sum_{i=1}^nC_i

可以用**圈复杂度来作为方法的复杂度,当 C1=C2=…Cn 时,将它们均记为 1**

子类在计算 WMC 时只计算子类本身的方法数

复杂度低的方法**可以忽略不计**或者设置为较小值

②类的响应数量 RFC:计算一个类的对象对接受的消息进行响应的方法集合的数目, 是对类复杂性类之间耦合度的一种度量。

RFC=RSRS={M}alli {Ri}\begin{gathered} \boldsymbol{R F C}=|\boldsymbol{R S}| \\ \boldsymbol{R S}=\{\boldsymbol{M}\} \cup_{\text {alli }}\left\{\boldsymbol{R}_i\right\} \end{gathered}

{M}是类中方法的集合(包括继承来的),{Ri}是被类中第 i 个方法所调用的其他方法集合。

③继承树的深度 DIT:计算某个类在系统类设计的继承树中最大深度,也就是最深层次。一般我们认为继承层次不要超过 6

④子类数量 NOC:计算一个父类拥有多少个直接继承的子类,也是对继承性的度量。

⑤对象间的耦合度 CBO:用来计算一个类和其他类之间的耦合性,这里考虑的耦合关系只包括类之间的**依赖、实现、关联、组合、聚合**,不包括继承

⑥类缺乏内聚性 LCOM:通过类中的属性和方法来衡量类中方法之间的相关性。高内聚要求一个模块承担一个单一职责。LCOM 越大则反映类设计存在缺陷,要考虑是否要将类中方法分解。

假设一个类中有 n 个方法 M1,M2…Mn,方法 Mi 使用的实例变量集合记作 Ii,因此 n个方法形成了 n 个集合I1,I2…In.

P={(Ii,Ij)(IiIj)=ϕ}Q={(Ii,Ij)(IiIj)ϕ}LCOM={PQ,P>Q0,PQ\begin{gathered} \boldsymbol{P}=\left\{\left(\boldsymbol{I}_i, \boldsymbol{I}_j\right) \mid\left(\boldsymbol{I}_{\boldsymbol{i}} \cap \boldsymbol{I}_j\right)=\boldsymbol{\phi}\right\} \\ \boldsymbol{Q}=\left\{\left(\boldsymbol{I}_{\boldsymbol{i}}, \boldsymbol{I}_j\right) \mid\left(\boldsymbol{I}_{\boldsymbol{i}} \cap \boldsymbol{I}_j\right) \neq \boldsymbol{\phi}\right\} \\ \boldsymbol{L C O M}=\left\{\begin{array}{cc} |\boldsymbol{P}|-|\boldsymbol{Q}|, & |\boldsymbol{P}|>|\boldsymbol{Q}| \\ 0, & |\boldsymbol{P}| \leq|\boldsymbol{Q}| \end{array}\right. \end{gathered}

Example 1 Example 2
image-20230422010115544 image-20230422010134142

LCOM = P集合的元素个数 - Q集合的元素个数

考试:DIT会有一道大题(2015分)\textcolor{red}{考试:DIT会有一道大题(20或15分)}

这里应该是关于面向对象度量的大题:

  1. LK度量
  2. CK度量
  3. MOOD度量

CK:Depth of Inheritance Tree(DIT)

继承树深度的计算:

image-20230331154105008

CBO的计算:

image-20230422211303572

类型题:

image-20230422011537076

Chapter 6

考试:可靠性和可用性的区别\textcolor{red}{考试:可靠性和可用性的区别}

考察软件的可靠性:每时间故障数

可靠性(responsibility)——某段时间

  • 一段时间内能够正常使用

可用性(reliability)——某个时刻(某个时间点)

  • 某一个时刻软件是否能够正常运行


(1) 软件可靠性:软件产品在**规定的条件下规定的时间区间完成规定功能的能力。条件是直接与软件运行相关的计算机系统状态软件输入条件,时间区间是软件的实际运行时间区间**,功能是软件产品必须具备的功能。软件可靠性与**软件缺陷、系统输入、系统使用**有关。一般有三种度量方法:

①**故障率**度量:

λ= 总故障次数  总工作时间 =ni=1nti\lambda=\frac{\text { 总故障次数 }}{\text { 总工作时间 }}=\frac{n}{\sum_{i=1}^n t_i}

, 故障率表示单位运行时间内发生故障的次数
②**平均故障间隔时间(MTBF)**度量: MTBF=1λM T B F=\frac{1}{\lambda}, 反映了软件的运行能力, 越大越好。

③**平均维修时间(MTTR)**度量: MTTR= 总维修时间  维修次数 =i=1ntin=1μM T T R=\frac{\text { 总维修时间 }}{\text { 维修次数 }}=\frac{\sum_{i=1}^n t_i}{n}=\frac{1}{\mu}, 反映了软件的修复能力。

(2)软件可用性:软件产品在规定的条件下和==规定的时间点==完成规定功能的能力。

(3)软件易用性:使用菜单和图形界面, 具有一致的用户界面, 提供丰富全面的错误信息, 具有结构良好的用户手册,实时提供软件帮助功能。可以用任务有效性度量。

 Task Effectiveness = 数量  质量 100%\text { Task Effectiveness }=\frac{\text { 数量 } * \text { 质量 }}{100} \%

(4)软件维护性:通过 平均维修时间(MTTR )来度量,也可以用修复时间中位数度量。

(5)软件可移植性:指软件产品从一种环境迁移到另一种环境的能力

 可移植性=1ETER\text{ 可移植性}=1-\frac{E T}{E R}

ET 是将系统移植到目标环境所需要的资源,ER 是未固定环境创建系统所需要的资源

补充必要知识

类之间的关系

参考:设计模式:类之间的关系 - blakee - 博客园 (cnblogs.com)

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2024 Guijie Wang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信