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.
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 .
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):
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