tipos que prototipos prototipo language-agnostic programming-languages magic-numbers

language-agnostic - prototipos - que es un prototipo de hardware



¿Qué son los "números mágicos" en la programación de computadoras? (11)

Cuando las personas hablan sobre el uso de "números mágicos" en la programación de computadoras, ¿qué significan?


Cualquier cosa que no tenga un significado evidente para nadie más que la aplicación en sí misma.

if (foo == 3) { // do something } else if (foo == 4) { // delete all users }


El término número mágico se usa generalmente para describir una constante numérica en el código. El número aparece sin ninguna descripción adicional y, por lo tanto, su significado es esotérico.

El uso de números mágicos se puede evitar usando constantes nombradas.


El uso de números en cálculos distintos de 0 o 1 que no están definidos por algún identificador o variable (lo que no solo hace que el número sea fácil de cambiar en varios lugares al cambiarlo en un lugar, sino que también deja en claro al lector cuál es el número es para).


En palabras simples y verdaderas, un número mágico es un número de tres dígitos, cuya suma de los cuadrados de los dos primeros dígitos es igual al tercero. Ex-202, as, 2 * 2 + 0 * 0 = 2 * 2. Ahora, WAP en java para aceptar un número entero e imprimir si es un número mágico o no.


Hay más de un significado. El dado por la mayoría de las respuestas ya (un número arbitrario sin nombre) es muy común, y lo único que diré al respecto es que algunas personas llegan al extremo de definir ...

#define ZERO 0 #define ONE 1

Si haces esto, te perseguiré y no mostraré misericordia.

Sin embargo, otro tipo de número mágico se usa en formatos de archivo. Es solo un valor que se incluye normalmente como la primera cosa en el archivo que ayuda a identificar el formato del archivo, la versión del formato del archivo y / o la naturaleza del archivo en particular.

Por ejemplo, podría tener un número mágico de 0x12345678. Si ve ese número mágico, es justo suponer que está viendo un archivo con el formato correcto. Si ve, por otro lado, 0x78563412, es justo suponer que está viendo una versión intercambiada por endian del mismo formato de archivo.

Sin embargo, el término "número mágico" se abusa un poco, refiriéndose a casi cualquier cosa que identifique un formato de archivo, incluidas cadenas ASCII bastante largas en el encabezado.

http://en.wikipedia.org/wiki/File_format#Magic_number


La mayoría de las respuestas hasta ahora han descrito un número mágico como una constante que no se describe a sí misma. Siendo yo mismo un poco programador de la "vieja escuela", en el día en que describimos los números mágicos como una constante a la que se le asigna algún propósito especial que influye en el comportamiento del código. Por ejemplo, el número 999999 o MAX_INT o algo completamente arbitrario.

El gran problema con los números mágicos es que su propósito puede ser fácilmente olvidado, o el valor utilizado en otro contexto perfectamente razonable.

Como un ejemplo crudo y terriblemente artificial:

while (int i != 99999) { DoSomeCleverCalculationBasedOnTheValueOf(i); if (escapeConditionReached) { i = 99999; } }

El hecho de que se use o no una constante no es realmente el problema. En el caso de mi terrible ejemplo, el valor influye en el comportamiento, pero ¿qué pasa si necesitamos cambiar el valor de "i" mientras hacemos un bucle?

Claramente, en el ejemplo anterior, no NECESITA un número mágico para salir del bucle. Podría reemplazarlo con una declaración de ruptura, y ese es el verdadero problema con los números mágicos, que son un método perezoso para la codificación, y sin falla siempre puede ser reemplazado por algo menos propenso a fallos o pérdida de significado con el tiempo.


Los "números mágicos" son números que aparecen en declaraciones como

if days == 365

Suponiendo que no sabía que había 365 días en un año, esta afirmación no tendría sentido. Por lo tanto, es una buena práctica asignar todos los números "mágicos" (números que tienen algún tipo de significado en su programa) a una constante,

DAYS_IN_A_YEAR = 365

Y a partir de entonces, comparar con eso en su lugar. Es más fácil de leer, y si la Tierra se sale de la alineación y ganamos un día más ... puede cambiarla fácilmente (es probable que otros números cambien).


Los números mágicos son cualquier número en su código que no es inmediatamente obvio para alguien con muy poco conocimiento.

Por ejemplo, la siguiente pieza de código:

sz = sz + 729;

tiene un número mágico y estaría mucho mejor escrito como:

sz = sz + CAPACITY_INCREMENT;

Algunas vistas extremas indican que nunca debería tener ningún número en su código, excepto -1, 0 y 1, pero prefiero una vista algo menos dogmática, ya que reconocería instantáneamente 24, 1440, 86400, 3.1415, 2.71828 y 1.414; todo depende de su conocimiento.

Sin embargo, aunque sé que hay 1440 minutos en un día, es probable que todavía use un identificador MINS_PER_DAY ya que hace que la búsqueda sea mucho más fácil. ¿Qué decir de que el incremento de capacidad mencionado anteriormente no sería 1440 y terminas cambiando el valor incorrecto? Esto es especialmente cierto para los números bajos: la posibilidad de doble uso de 37197 es relativamente baja, la probabilidad de usar 5 para múltiples cosas es bastante alta.

El uso de un identificador significa que no tendrá que pasar por todos sus 700 archivos de origen y cambiar de 729 a 730 cuando cambie el incremento de capacidad. Usted podría simplemente cambiar la línea:

#define CAPACITY_INCREMENT 729

a:

#define CAPACITY_INCREMENT 730

y recompilar el lote.

Contraste esto con las constantes mágicas que son el resultado de personas ingenuas que piensan que solo porque eliminan los números reales de su código, pueden cambiar:

x = x + 4;

a:

#define FOUR 4 x = x + FOUR;

Eso agrega absolutamente cero información adicional a su código y es una pérdida total de tiempo.


Los números mágicos son valores especiales de ciertas variables que hacen que el programa se comporte de una manera especial.

Por ejemplo, una biblioteca de comunicación puede tomar un parámetro de tiempo de espera y puede definir el número mágico "-1" para indicar un tiempo de espera infinito.


Puede parecer un poco banal, pero hay al menos un número mágico real en cada lenguaje de programación.

0

Sostengo que es LA varita mágica dominarlos a todos en virtualmente el carcaj de varitas mágicas de todos los programadores.

FALSO es inevitablemente 0 VERDADERO no es (FALSO), pero no necesariamente 1! Podría ser -1 (0xFFFF)

NULL es inevitablemente 0 (el puntero) Y la mayoría de los compiladores lo permiten a menos que su comprobación de tipo sea completamente rabiosa.

0 es el índice base de los elementos de la matriz, excepto en idiomas que son tan antiguos que el índice base es ''1''. Entonces, uno puede codificar convenientemente para (i = 0; i <32; i ++), y esperar que ''i'' comience en la base (0) y se incremente en, y se detenga en 32-1 ... el miembro número 32 de una matriz, o lo que sea.

0 es el final de muchas cadenas de lenguaje de programación. El valor "para aquí".
0 también está incorporado en las instrucciones de X86 para "mover cadenas de manera eficiente". Guarda muchos microsegundos.

Los programadores utilizan a menudo 0 para indicar que "nada salió mal" en la ejecución de una rutina. Es el valor del código "no una excepción". Uno puede usarlo para indicar la falta de excepciones lanzadas.

Cero es la respuesta más a menudo dada por los programadores a la cantidad de trabajo que se necesitaría para hacer algo completamente trivial, como cambiar el color de la celda activa a púrpura en lugar de rosa brillante. "Cero, hombre, como cero!"

0 es la cantidad de errores en un programa que aspiramos a lograr. 0 excepciones no contabilizadas, 0 bucles sin terminar, 0 rutas de recursión que no se pueden tomar realmente. 0 es la asíntota que estamos tratando de lograr en la programación laboral, los "problemas" de la novia (o el novio), las pésimas experiencias en los restaurantes y las idiosincrasias generales del automóvil.

Sí, 0 es un número mágico de hecho. Mucho más magia que cualquier otro valor. Nada ... ejem, se acerca.

[email protected]