Un programa de computadora es una implementación de un algoritmo considerado como una colección de tokens que pueden clasificarse como operadores u operandos. Las métricas de Halstead están incluidas en varias herramientas comerciales actuales que cuentan líneas de código de software. Al contar las fichas y determinar cuáles son operadores y cuáles operandos, se pueden recopilar las siguientes medidas base:
n1 = Número de operadores distintos.
n2 = Número de operandos distintos.
N1 = Número total de ocurrencias de operadores.
N2 = Número total de ocurrencias de operandos.
Además de lo anterior, Halstead define lo siguiente:
n1* = Número de operadores potenciales.
n2* = Número de operandos potenciales.
Halstead se refiere a n1* y n2* como el número mínimo posible de operadores y operandos para un módulo y un programa respectivamente. Este número mínimo estaría plasmado en el propio lenguaje de programación, en el que ya existiría la operación requerida (por ejemplo, en lenguaje C, cualquier programa debe contener al menos la definición de la función main()), posiblemente como función o como un procedimiento: n1* = 2, ya que para cualquier función o procedimiento deben aparecer al menos 2 operadores: 1 para el nombre de la función y 1 para servir como símbolo de asignación o agrupación, y n2* representa el número de parámetros, sin repetición , que tendría que pasarse a la función o al procedimiento.
Métricas de Halstead –
Las métricas de Halstead son:
- Longitud del programa Halstead: el número total de ocurrencias de operadores y el número total de ocurrencias de operandos.
N = N1 + N2Y la duración estimada del programa es, N ^ = n1log 2 n1 + n2log 2 n2
Se han publicado las siguientes expresiones alternativas para estimar la duración del programa:
- NJ = log 2 ( n1!) + log 2 (n2!)
- N B = n1 * log 2 n2 + n2 * log 2 n1
- N C = n1 * raíz cuadrada (n1) + n2 * raíz cuadrada (n2)
- NS = (n * log 2 n ) / 2
- Vocabulario de Halstead: el número total de operadores únicos y ocurrencias de operandos únicos.
n = n1 + n2 - Volumen del programa: proporcional al tamaño del programa, representa el tamaño, en bits, del espacio necesario para almacenar el programa. Este parámetro depende de la implementación específica del algoritmo. Se muestra que las propiedades V, N y el número de líneas en el código están conectados linealmente y son igualmente válidos para medir el tamaño relativo del programa.
V = Tamaño * (log 2 vocabulario) = N * log 2 (n)
La unidad de medida del volumen es la unidad común para el tamaño de «bits». Es el tamaño real de un programa si se utiliza una codificación binaria uniforme para el vocabulario. Y error = Volumen / 3000
- Volumen mínimo potencial: el volumen mínimo potencial V* se define como el volumen del programa más breve en el que se puede codificar un problema.
V* = (2 + n2*) * log 2 (2 + n2*)
Aquí, n2* es el recuento de parámetros únicos de entrada y salida
- Nivel de programa: para clasificar los lenguajes de programación, se considera el nivel de abstracción proporcionado por el lenguaje de programación, Nivel de programa (L). Cuanto más alto sea el nivel de un idioma, menos esfuerzo se necesita para desarrollar un programa usando ese idioma.
L = V* / V
El valor de L oscila entre cero y uno, representando L=1 un programa escrito en el nivel más alto posible (es decir, con el tamaño mínimo).
Y el nivel de programa estimado es L ^ =2 * (n2) / (n1)(N2) - Dificultad del programa: este parámetro muestra qué tan difícil es manejar el programa.
D = (n1 / 2) * (N2 / n2)
D = 1 / L
A medida que aumenta el volumen de implementación de un programa, el nivel del programa disminuye y la dificultad aumenta. Por lo tanto, las prácticas de programación como el uso redundante de operandos o la falla en el uso de construcciones de control de nivel superior tenderán a aumentar el volumen y la dificultad. - Esfuerzo de programación: mide la cantidad de actividad mental necesaria para traducir el algoritmo existente a la implementación en el lenguaje de programación especificado.
E = V / L = D * V = Dificultad * Volumen
- Nivel de idioma: muestra el nivel de idioma del programa de implementación del algoritmo. El mismo algoritmo exige un esfuerzo adicional si está escrito en un lenguaje de programación de bajo nivel. Por ejemplo, es más fácil programar en Pascal que en Assembler.
L’ = V / D / D
lambda = L * V* = L 2 * V - Contenido de inteligencia: determina la cantidad de inteligencia presentada (indicada) en el programa. Este parámetro proporciona una medida de la complejidad del programa, independientemente del lenguaje del programa en el que se implementó.
yo = v/d - Tiempo de programación: muestra el tiempo (en minutos) necesario para traducir el algoritmo existente a la implementación en el lenguaje de programación especificado.
T = E / (f * S)También se utiliza el concepto de tasa de procesamiento del cerebro humano, desarrollado por el psicólogo John Stroud. Stoud definió un momento como el tiempo que requiere el cerebro humano para llevar a cabo la decisión más elemental. El número de Stoud S es, por lo tanto, los momentos por segundo de Stoud con:
5 <= S <= 20. Halstead usa 18. El valor de S se ha desarrollado empíricamente a partir del razonamiento psicológico y su valor recomendado para aplicaciones de programación es 18.Stroud número S = 18 momentos / segundo
factor de segundos a minutos f = 60
Reglas de conteo para lenguaje C –
- Los comentarios no son considerados.
- Las declaraciones de identificadores y funciones no se consideran
- Todas las variables y constantes se consideran operandos.
- Las variables globales utilizadas en diferentes módulos del mismo programa se cuentan como múltiples ocurrencias de la misma variable.
- Las variables locales con el mismo nombre en diferentes funciones se cuentan como operandos únicos.
- Las llamadas a funciones se consideran operadores.
- Todas las declaraciones de bucle, por ejemplo, do {…} while ( ), while ( ) {…}, for ( ) {…}, todas las declaraciones de control, por ejemplo, if ( ) {…}, if ( ) {…} else {…}, etc. son considerados como operadores.
- En la construcción de control switch ( ) {case:…}, tanto switch como todas las sentencias case se consideran operadores.
- Las palabras de reserva como return, default, continue, break, sizeof, etc., se consideran operadores.
- Todos los corchetes, comas y terminadores se consideran operadores.
- GOTO se cuenta como operador y la etiqueta se cuenta como operando.
- La ocurrencia unaria y binaria de «+» y «-» se tratan por separado. Del mismo modo, «*» (operador de multiplicación) se tratan por separado.
- En la array, las variables como «nombre-array [índice]», «nombre-array» e «índice» se consideran operandos y [ ] se considera como operador.
- En las variables de estructura como “struct-name, member-name” o “struct-name -> member-name”, struct-name, member-name se toman como operandos y ‘.’, ‘->’ se toman como operadores. Algunos nombres de elementos miembros en diferentes variables de estructura se cuentan como operandos únicos.
- Todas las directivas hash son ignoradas.
Ejemplo: enumere los operadores y operandos y también calcule los valores de las medidas de ciencia del software como
int sort (int x[ ], int n) { int i, j, save, im1; /*This function sorts array x in ascending order */ If (n< 2) return 1; for (i=2; i< =n; i++) { im1=i-1; for (j=1; j< =im1; j++) if (x[i] < x[j]) { Save = x[i]; x[i] = x[j]; x[j] = save; } } return 0; }
Explicación –
operadores | ocurrencias | operandos | ocurrencias |
En t | 4 | clasificar | 1 |
() | 5 | X | 7 |
, | 4 | norte | 3 |
[] | 7 | i | 8 |
si | 2 | j | 7 |
< | 2 | ahorrar | 3 |
; | 11 | im1 | 3 |
por | 2 | 2 | 2 |
= | 6 | 1 | 3 |
– | 1 | 0 | 1 |
<= | 2 | – | – |
++ | 2 | – | – |
devolver | 2 | – | – |
{} | 3 | – | – |
n1=14 | N1=53 | n2=10 | N2=38 |
Therefore, N = 91 n = 24 V = 417.23 bits N^ = 86.51 n2* = 3 (x:array holding integer to be sorted. This is used both as input and output) V* = 11.6 L = 0.027 D = 37.03 L^ = 0.038 T = 610 seconds
Ventajas de las métricas de Halstead:
- Es simple de calcular.
- Mide la calidad general de los programas.
- Predice la tasa de error.
- Predice el esfuerzo de mantenimiento.
- No requiere el análisis completo de la estructura de programación.
- Es útil para programar y reportar proyectos.
- Se puede utilizar para cualquier lenguaje de programación.
Desventajas de las métricas de Halstead:
- Depende del código completo.
- No tiene ningún uso como modelo de estimación predictiva.
Referencia –
Medidas de complejidad de Halstead – Wikipedia
ristancase
Este artículo es una contribución de Shivani Virmani . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA