Métrica: Halstead Complejidad

Descripción del usuario

La métrica de complejidad Halstead se utiliza para medir la complejidad de un programa de software sin ejecutar el programa.

Esta métrica es un método estático de pruebas en el que las propiedades de software que se pueden medir se identifican y evalúan. El código fuente se analiza y desglosa en una secuencia de tokens. Más tarde, se hace un recuento y los tokens se clasifican como operadores u operandos.

La métrica de complejidad Halstead no depende de ningún lenguaje de programación específico y se puede aplicar al código fuente IEC-61131-3.

Se realiza un recuento y se clasifican los operadores y los operandos de la siguiente manera:

Parámetro

Descripción

n1

Número de operadores distintos

n2

Número de operandos distintos

N1

Número total de operadores

N2

Número total de operandos

Hay varios valores métricos que se pueden calcular para representar diferentes aspectos de la complejidad:

oHalstead Difficulty (D)

oHalstead Length (N)

oHalstead CalculatedLength (Nx)

oHalstead Volume (V)

oHalstead Effort (E)

oHalstead Vocabulary (n)

Complejidad Halstead  de POU implementadas en texto estructurado (ST)

La complejidad Halstead se desarrolló en un principio para lenguajes de texto (como C, C++, Pascal...) y se aplica a las POU implementadas en texto estructurado (ST).

NOTA: De forma predeterminada, se muestra Halstead Difficulty.

Complejidad Halstead para POU implementadas en diagramas de bloques de funciones (FBD)

El diagrama de bloque de funciones (FBD) pertenece al grupo de lenguajes de implementación gráficos y no se basa en texto. Una POU consta de varios redes de FBD. Por lo tanto, la métrica de complejidad Halstead debe adaptarse para poder aplicarla a lenguajes gráficos. El concepto base es el mismo. Los operandos y los operadores y su frecuencia (por red de FBD) se consideran presentados al usuario (consulte Ejemplo de diagrama de bloque de funciones (FBD)).

Los resultados de la complejidad Halstead calculados por red de FBD se agregan en las redes de FBD y se vinculan en el nivel de POU (programa, bloque de funciones, función, método o propiedad).

NOTA: Los valores de Halstead calculados (por red de FBD) son FBD Network Halstead Difficulty y FBD Network Halstead Length.

Los siguientes tipos de agregación se aplican por valores de métrica Halstead de red de FBD (Halstead Difficulty y Halstead Length).

oPromedio

oMínimo

oMáximo

oSuma

oCoherencia

NOTA: Los valores agregados más importantes son FBD Halstead Difficulty Network Max, FBD Halstead Difficulty Network Consistency, FBD Halstead Length Network Max y FBD Halstead Length Network Consistency. El resto de combinaciones (Min, Sum y Average) se calculan y vinculan al modelo, pero no se muestran de forma predeterminada.

Cálculo de métricas

Valor

Fórmula

Halstead Difficulty (D)

D = (n1 / 2) * (N2 / n2)

Halstead Length (N)

N = N1 + N2

Halstead CalculatedLength (Nx)

Nx = n1 * log2(n1) + n2 * log2(n2)

Halstead Volume (V)

V = N * log2(n)

Halstead Effort (E)

E = V * D

Halstead Vocabulary (n)

n = n1 + n2

NOTA: Una expresión en una instrucción IF <expression> THEN no debe tener paréntesis. Se consideran siempre disponibles en el código fuente IEC-61131-3 .

Agregación de métricas

Los resultados de métricas como FBD Network Halstead Difficulty y FBD Network Halstead Length se agregan en las redes de FBD de una POU.

values es la lista de valores de la misma métrica (por ejemplo, FBD Network Halstead Length) de todas las redes de FBD de una POU).

El valor de coherencia es el resultado del coeficiente Gini. El coeficiente Gini es una medida de dispersión estadística. Mide la diferencia entre los valores de una distribución frecuente. Un coeficiente Gini de 0 expresa una igualdad perfecta, en la que todos los valores son idénticos. Un coeficiente Gini de 1 expresa la máxima desigualdad entre valores.

Ejemplo de texto estructurado (ST)

Ejemplo de cálculo Halstead para el código  IEC-61131-3 (sólo se considera para el cálculo la parte de implementación):

IF (xInit = FALSE) THEN

   PerformInitialization();
   xInit := TRUE;

ELSE

   FOR i := 1 TO 5 DO

       iAxisId := i + 7;
       sAxisName := Standard.CONCAT('MyAxis ', INT_TO_STRING(iAxisId));

       // Do some math calculations for each axis here
       udiResult := CalculateStuff(sName := sAxisName, iID := iAxisId);
   END_FOR

END_IF

Lista de operadores y sus frecuencias:

Operator                            Frequency
========                            =========
(operators)
If                                          1
Then                                        1
LeftParenthesis                             6
RightParenthesis                            6
Equal                                       1
Semicolon                                   5
Assign                                      7
Else                                        1
For                                         1
EndFor                                      1
Do                                          1
Plus                                        1
Period                                      1
INT_TO_STRING                               1
Colon                                       2
EndIf                                       1
(n1)  16                             (N1)  37

Lista de operandos y sus frecuencias:

Operand                             Frequency
=======                             =========
(variables/methods/functions)
xInit                                       2
PerformInitialization                       1
i                                           2
iAxisId                                     3
sAxisName                                   2
Standard                                    1
CONCAT                                      1
udiResult                                   1
CalculateStuff                              1
sName                                       1
iID                                         1

(constants)
FALSE                                       1
TRUE                                        1
INT#1                                       1
INT#5                                       1
INT#7                                       1
'MyAxis ' 1
(n2)  17                             (N2)  22

Halstead Resultado de dificultad

Halstead Difficulty (D = (16/2) * (22/17) = 10.3529411764706

Ejemplo de diagrama de bloque de funciones (FBD)

Ejemplo de cálculo Halstead para el código IEC-61131-3 implementado en FBD (solo se considera para el cálculo la parte de implementación):

G-SE-0079690.2.gif-high.gif

 

 

Lista de operadores y sus frecuencias:

Operator                            Frequency
========                            =========
(operators)
Assign                                      4
Set2                                        1
And                                         1
Negation2                                   2
Or                                          1
Eq                                          1
(n1)   6                             (N1)  10

Lista de operandos y sus frecuencias:

Operand                             Frequency
=======                             =========
(variables/methods/functions/constants)
xResult                                     1
TON                                         1
fbTON                                       1
xEnable                                     1
T#1s                                        1
IN                                          1
PT                                          1
Q                                           1
ET                                          1
xTray1Empty                                 1
xTray2Empty                                 1
xInHomePosition                             1
xBeltFull                                   1
xGroupReady                                 1
uiMasterStart                               1
5                                           1
(n2)  16                             (N2)  16

Resultado de dificultad Halstead de red de FBD

FBD Network Halstead Difficulty (D) = (6/2) * (16/16) = 3

Longitud Halstead de red de FBD

FBD Network Halstead Length (D) = 10 + 16 = 26