# Métrica de Software ABC

La métrica del software ABC fue introducida por Jerry Fitzpatrick en 1997 para superar los inconvenientes de las LOC (Lines Of Code - Líneas de Código). La métrica define un resultado ABC como un valor triple que representa el tamaño de un conjunto de declaraciones de código fuente. Un resultado ABC se calcula contando el número de asignaciones (A), número de ramas (B) y número de condicionales (C) en un programa. La resultante ABC se puede aplicar a métodos, funciones, clases, módulos o archivos individuales dentro de un programa.
Un resultado ABC está representado por un vector tridimensional <Asignaciones (A), Ramas (B), Condicionales (C)>. También este, puede ser representado como un valor escalar, que es la magnitud del vector <Asignaciones (A), Ramas (B), Condicionales (C)>, y es calculado de la siguiente manera:
       $|<vectorABC>|=\surd (A^{2}+B^{2}+C^{2})$
Para mantener una convención, un valor de magnitud ABC se redondea a la décima más cercana.

## Historia

El concepto de medir el tamaño del software se introdujo primero por Maurice Halstead de la Universidad de Purdue en 1975. El sugirió que cada programa de computadora consiste principalmente en tokens : operadores y operandos. Habiendo concluido que haciendo un conteo de la cantidad de operadores y operandos únicos ofrece una medida del tamaño del programa. Sin embargo, este no fue adoptado como una medida del tamaño de un programa.
Las líneas de código (LOC - Lines Of Code) fueron otra medida popular del tamaño de un programa. Las LOC no se han considerado como una medida exacta del tamaño del programa porque incluso un programa con una funcionalidad idéntica puede tener diferentes números de líneas dependiendo del estilo de codificación.
Se introdujo también otra métrica llamada punto de función (FP - Function Point) para el cálculo del número de transacciones de entrada y salida del usuario. Los cálculos del punto de función no proporcionaron información sobre la funcionalidad del programa y sobre las rutinas que fueron involucradas en el programa.
La métrica ABC tiene el propósito de superar los inconvenientes de los conteos que se realizan en las LOC, FP y token (operador y operando). Sin embargo, una medida FP también se puede utilizar para complementar una puntuación ABC.
Aunque el autor sostiene que la métrica ABC mide el tamaño del software, algunos creen que mide la complejidad. La habilidad de la métrica ABC de medir la complejidad del software, depende de cómo se define la complejidad.

## Definición

Los tres componentes de la métrica ABC son definidos de la siguiente manera:
* Asignación: almacenamiento o transferencia de datos en una variable .
* Ramas: una rama de programa directo explícito fuera de alcance .
* Condicionales: prueba booleana o lógica.
Ya que lenguajes básicos como C, C ++, Java, etc. tienen operaciones como asignaciones de variables, llamadas a función y condicionales de prueba únicamente, la puntuación ABC tiene esos tres componentes.
Si el vector ABC es denotado como <5,11,9> para una subrutina, eso significa que esa subrutina tiene 5 asignaciones, 11 ramas y 9 condicionales. Para fines de estandarización, los conteos deben encerrarse entre paréntesis angulares y deberán ser escritos en el mismo orden según la notación <A, B, C>.
Con mayor frecuencia es más conveniente comparar los tamaños de código fuente usando un valor escalar. Los conteos individuales de ABC resultan ser distintos, por lo que, de acuerdo a Jerry Fitzpatrick, consideramos los tres componentes como ortogonales, por lo que permite calcular una magnitud escalar ABC como se muestra arriba.
La puntuación escalar ABC pierde algunos de los beneficios del vector. En vez de calcular la magnitud de un vector, la suma ponderada de los vectores puede admitir una comparación de tamaño más exacta. Las puntuaciones escalares ABC no deben ser presentadas sin los vectores ABC que las acompañan, ya que esos valores escalares no son la representación completa de su tamaño.

## Teoría

Las especificación de las reglas para contar los valores del vector ABC, deben ser interpretados de manera diferente para diferentes lenguajes debido a las diferencias semánticas que existe entre ellos.
Por lo tanto, las reglas para calcular el vector ABC difieren ligeramente según la base del lenguaje usado. Definimos las reglas de cálculo métrico ABC para C, C ++ y Java a continuación. Basado en a estas reglas, se pueden interpretar las reglas para otros órdenes de lenguajes.

### Reglas ABC para C

Las reglas presentadas a continuación dan el conteo de Asignaciones, Ramas, Condicionales en la métrica ABC para C :
* Agregue uno al recuento de tareas cuando:
** Ocurrencia de un operador de asignación ( =, * =, / =,% =, + =, << =, >> =, & =,! =, ^ = ).
** Ocurrencia de un operador de incremento o decremento ( ++, -- ).
* Agregue uno al recuento de ramas cuando:
** Ocurrencia de una llamada a función .
** Ocurrencia de cualquier declaración goto que tenga un objetivo en un nivel de anidamiento más profundo que el nivel del goto.
* Agregue uno al conteo de condiciones cuando:
** Ocurrencia de un operador condicional ( <,>, <=,> =, ==,! = ).
** Ocurrencia de las siguientes palabras clave (' else ', ' case ', ' default ', ' ? ' )
** Ocurrencia de un operador condicional unario .

### Reglas ABC para C ++

Las reglas presentadas más adelante, dan el conteo de asignaciones, ramas, condicionales en la métrica ABC para C ++ :
* Agregue uno al recuento de tareas cuando:
** Ocurrencia de un operador de asignación (excluye declaraciones constantes y asignaciones de parámetros por defecto) ( =, *=, /=,%=, +=, <<=, >>=, &=, !=, ^= ).
** Ocurrencia de un operador de incremento o decremento (prefijo o postfix) (++, -- ).
** Inicialización de una variable o un miembro de clase no constante.
* Agregue uno al recuento de sucursales cuando:
** Ocurrencia de una llamada a función o una llamada a método de clase.
** Ocurrencia de cualquier declaración de goto que tenga un objetivo en un nivel de anidación más profundo que el nivel del goto.
** Ocurrencia de operadores 'nuevos' o 'borrar'.
* Agregue uno al conteo de condiciones cuando:
** Ocurrencia de un operador condicional ( <,>, <=,> =, ==,! = ).
** Ocurrencia de las siguientes palabras clave (' else ', ' case ', ' default ', ' ? ', ' Try ', ' catch ').
** Ocurrencia de un operador condicional unario.

### Reglas ABC para Java

Las reglas que se presentan a continuación, dan el recuento de Asignaciones, Ramas, Condicionales en la métrica ABC para Java :
* Agregue uno al recuento de tareas cuando:
** Ocurrencia de un operador de asignación (excluye declaraciones constantes y asignaciones de parámetros por defecto) (=, *=, /=,%=, +=, <<=, >>=, &=,!=, ^=, >>> = ).
** Ocurrencia de un operador de incremento o decremento (prefijo o postfix) ( ++, -- ).
* Agregue uno al recuento de sucursales cuando
** Ocurrencia de una llamada a función o una llamada a método de clase.
** Ocurrencia de un 'nuevo' operador.
* Agregue uno al conteo de condiciones cuando:
** Ocurrencia de un operador condicional ( <,>, <=, >=, ==, != ).
** Ocurrencia de las siguientes palabras clave ('else', 'case', 'default', '?', 'Try', 'catch').
** Ocurrencia de un operador condicional unario.

## Aplicaciones
### Independiente del estilo de codificación

Dado que la métrica ABC está construida sobre idea que tareas como el asignación o almacenamiento de datos, ramificación y pruebas condicionales pueden ser diferentes en cada proyecto, esta métrica es independiente del estilo de codificación del usuario.

### Estimación del tiempo del proyecto.

El cálculo del resultado ABC ayuda a estimar la cantidad de tiempo requerido para completar un proyecto. Esto puede hacerse por una estimación áspera y aproximada de la métrica ABC para el proyecto y calculando el resultado ABC del programa en un día en particular. La cantidad de tiempo tomado para completar el proyecto puede obtenerse dividiendo el resultado ABC del proyecto por el resultado ABC alcanzado en un día.

### Cálculo de tasa de error

La tasa de error fue calculada originalmente como Número de errores / LOC . Sin embargo, las LOC (Lines Of Code - Líneas de Código) no es una medida confiable del tamaño del programa porque depende del estilo de codificación. Una forma más precisa de medir la tasa de errores es contar el número de errores / cálculo ABC .

### Comparación de programa

Aquellos programas escritos en diferentes lenguajes de programación, pueden ser comparados con la ayuda de los cálculos ABC porque la mayoría de los lenguajes usan asignaciones, ramas y declaraciones condicionales.
La información sobre conteo de los parámetros individuales (número de asignaciones, ramas y condiciones) puede ayudar a clasificar el programa como 'fuerza de datos' o 'fuerza de función' o 'fuerza de lógica'. La forma vectorial de una cálculo ABC puede proveer una percepción de los principios básicos detrás de la aplicación, mientras que los detalles se pierden en la forma escalar del cálculo.

### Métrica lineal

Los cálculos ABC son lineales, por lo que se puede calcular cualquier archivo, módulo, clase, función o método. Por ejemplo, el cálculo (vector) ABC para un módulo es la suma de los cálculos de sus submódulos. Los cálculos escalares ABC, sin embargo, no son lineales.