¿Por qué son aceptables grandes cantidades de números mágicos en CSS y SVG?

63

Muchas veces veo preguntas en la lista de preguntas de Hot Network como esta que básicamente preguntan "¿cómo dibujo esta forma arbitraria en CSS". Invariablemente, la respuesta es un par de bloques de datos CSS o SVG con un montón de valores codificados aparentemente aleatorios que forman la forma solicitada.

Cuando miro esto, pienso '¡Qué asco! Qué bloque de código tan feo. Espero nunca ver este tipo de cosas en mi proyecto '. Sin embargo, veo estos tipos de preguntas y respuestas con bastante frecuencia y con una gran cantidad de votos a favor, por lo que claramente la comunidad no cree que sean malos.

Pero, ¿por qué es esto aceptable? Viniendo de mi experiencia de back-end, esto no tiene sentido para mí. Entonces, ¿por qué está bien para CSS / SVG?

Reinstalar a Mónica
fuente
38
¿Qué es un dibujo, si no un grupo aleatorio de números mágicos (piense en trazos entre 2 (x, y) puntos, o conjuntos de píxeles, etc.) que se ven bien?
68
¿CSS tiene variables? ¿SVG?
Oded
36
Es por eso que muchos proyectos más grandes tienen un preprocesador CSS como SASS o LESS que admite variables.
Ixrec
2
@Oded Para CSS, hay un 40% de soporte global para variables (por lo tanto, no se recomienda a menos que desee decirle a todos sus visitantes de Microsoft que no son bienvenidos). Microsoft probablemente seguirá la tendencia en Edge, y los dispositivos móviles eventualmente se pondrán al día. SVG, por otro lado, tiene el concepto de variables en algún documento de estado borrador triste, pero probablemente nunca se implementarán.
phyrfox
12
¿Por qué? Porque no son números mágicos. CSS contiene datos, a diferencia de un programa que contiene instrucciones. Aunque se puede decir que CSS está completo, no es un lenguaje de programación.
Derek 朕 會 功夫

Respuestas:

117

En primer lugar, los valores mágicos se evitan en la programación mediante el uso de variables o constantes. CSS no admite variables, por lo que incluso si los valores mágicos estuvieran mal vistos, no tienes muchas opciones (excepto usar un preprocesador como SASS, pero no harías eso por un solo fragmento).

En segundo lugar, los valores podrían no ser tan mágicos en un lenguaje específico de dominio como CSS. En programación, un número mágico es un número donde el significado o la intención no son obvios. Si una línea dice:

x += 23;

Usted preguntará "¿por qué 23"? ¿Cuál es el razonamiento? Una variable podría aclarar la intención:

x += defaultHttpTimeoutSeconds;

Esto se debe a que un número solitario podría significar absolutamente cualquier cosa en el código de propósito general. Pero considere CSS:

background-color: #ffffff;
font-size: 16px;

La altura y el color no son mágicos, porque el significado es perfectamente claro desde el contexto. Y la razón para elegir el valor específico es simple porque los diseñadores pensaron que se vería bien. La introducción de una variable no ayudaría en nada, ya que de todos modos simplemente la nombraría como " defaultBackgroundColor" y " defaultFontSize".

JacquesB
fuente
16
De hecho, algunos valores simplemente se eligen porque "se ven bien". Pero el ejemplo del OP enlazado contiene el mismo valor varias veces, pero no está claro si representan lo mismo o si solo tienen el mismo valor por coincidencia. También utiliza un valor 198pxcuya diferencia es el tamaño de otra cosa ( 200px) y un 2pxborde.
CodesInChaos
1
@CodesInChaos: Sí, hay algunos casos en los que las variables o algún tipo de expresiones de dependencia serían geniales.
JacquesB
21
Tenga en cuenta que el CSS hace variables de apoyo
phihag
28
@phihag En las especificaciones, sí, pero en la naturaleza , no tanto (no considero el 40% de soporte global en el momento de este comentario como "ampliamente respaldado". Sin embargo, tiene razón al decir eso, en el futuro , vamos a tener variables CSS y lo hice aprender algo nuevo hoy, así que gracias por eso..
phyrfox
2
@JaredSmith Está bien para una aplicación web de escala relativamente grande, sin embargo, para páginas comunes (tal vez estáticas) que incluyen un enorme polyfill es excesivo.
Derek 朕 會 功夫
80

Es aceptable porque estos formatos no son código , sino datos . Si eliminara todos los "números mágicos", esencialmente duplicaría cada etiqueta y terminaría con archivos de aspecto ridículo como:

mainkite_width = 200px
...
.mainkite {
  width: mainkite_width;
  ...

Cada vez que necesita cambiar algunos datos, debe buscar en dos lugares. De acuerdo, hay situaciones en las que es bueno evitar la duplicación, como si tiene un color que se repite con frecuencia y es posible que desee cambiar para cambiar los temas. Hay preprocesadores y extensiones propuestas para abordar esas situaciones, pero en general, es deseable tener números junto con la estructura en un formato de datos.

Karl Bielefeldt
fuente
22
+1 porque: "Es aceptable porque estos formatos no son código, sino datos".
Pieter B
1
"De acuerdo, hay situaciones en las que es bueno evitar la duplicación, como si tiene un color que se repite con frecuencia y es posible que desee cambiar para cambiar los temas". - Probablemente mejor hecho con las clases de todos modos: .main_color { color: .. }y usar esa clase es el método de deduplicación
Izkata
1
El código que determina el aspecto de una aplicación sigue siendo código y no datos.
ESR
25

La prohibición de los números mágicos es la versión primordial de este principio de diseño:

Toma decisiones en un solo lugar .

Pero estos no son números mágicos . Al menos, no en lo que respecta a cualquier guía de estilo de codificación que conozca.

ancho: 200 px;
altura: 200 px;

Están claramente etiquetados. Claro, los números son los mismos. Pero el ancho es el ancho y la altura es la altura. Están diseñados para variar de forma independiente.

Ahora, si tienes 5 objetos que tenían que tener el mismo ancho y cada uno codificaba independientemente su ancho, te golpearía con el palo de indirección .

No los llamaría números mágicos si están etiquetados, pero aún así te ganaría con el palo de indirección .

naranja confitada
fuente
44
Si tenía suficientes objetos para necesitar una variable, tiene suficientes objetos para crear una nueva clase.
Jaketr00
1
Esta es la mejor respuesta, ya que muestra el punto: esos no son números mágicos.
TheBlastOne
2
"5 objetos que tenían que tener el mismo ancho y cada uno codificaba independientemente su ancho. Te golpearía con un palo". Bienvenido al divertido mundo del diseño web.
whatsisname
2
Los números mágicos no solo son problemáticos debido a "Tomar decisiones en un solo lugar" (también conocido como DRY), sino también porque son difíciles de entender.
sleske
¿Hay alguna alternativa a ser golpeado con un palo?
djechlin
10

Debido a que CSS no es un lenguaje de programación, es el archivo de configuración que contiene los datos variables para su programa.

Actualmente, CSS es tan poderoso que realmente puedes programarlo, pero eso no viene al caso. En esencia, sigue siendo un lenguaje de hoja de estilo .

Retrocedamos un paso. Imagina que tenemos un lenguaje de programación que puede dibujar en una pantalla. Imagina que queremos programarlo para pintar una página web.

Al principio, ingresaríamos toneladas de números mágicos en nuestro código. El ancho del margen, la altura del texto, las sangrías, etc., etc.

jump(100) // The margin
drawTable(500, 500)
writeText("Hello World", 12)

Entonces extraemos los números mágicos y los colocamos en la parte superior de nuestro archivo.

int margin = 100
int table = 500
int text_size = 12
jump(margin) // The margin
drawTable(table, table)
writeText("Hello World", text_size)

Ahora esto es un poco feo. Preferimos leer nuestros números variables de un archivo de configuración.

margin 100
table 500
text size 12

Mm, eso no está claro ... ¿Qué significan esos números? ¿Qué significan esos nombres? Formalicémoslo un poco.

margin_left 10em
table_width 500px
table_height 500px
font_size 12px

Pero ya sabes, queremos ampliar un poco nuestro programa. También queremos que dibuje páginas con varias tablas, páginas sin tablas, páginas con párrafos o botones y más. Agreguemos selectores a nuestro archivo de configuración para que podamos especificar qué párrafo debe tener una fuente más grande o un color de texto diferente, quizás podamos admitir elementos anidados, quizás podamos usar una propiedad general en nuestro archivo de configuración y luego anularlo con un específico uno en unos pocos elementos anidados.


Sientes a dónde va esto, eventualmente llegas como CSS. (Y un navegador para representarlo).

¿Deberíamos agregar capacidades a nuestro archivo de configuración para que podamos evitar nuevamente los números mágicos? Añadir variables? ¿Agregar un archivo de configuración para nuestro archivo CSS? Se siente un poco inútil si recuerdas que nuestro archivo CSS ya es ese mismo archivo de configuración.

Pero eso no es cierto, por supuesto; su archivo CSS se hace cada vez más grande, y eventualmente se encuentra con los mismos problemas que con los números mágicos originales, el mismo número repetido por todas partes, a veces con pequeñas transformaciones, etc.

Sin embargo, el CSS moderno permite muchas formas de evitar esta repetición. Puede usar clases que se aplican a muchos elementos, puede establecer el estilo para todos los divs, pero luego anular uno específicamente, y CSS 3 incluso permite algún tipo de uso variable.

Eso no significa que deba comenzar a usar la variable CSS en todas las ubicaciones posibles. Úselo donde tenga sentido y úselo donde evite la duplicación o donde otras técnicas también estén disponibles.

Al final, tampoco querrás demasiados números mágicos en tu archivo de configuración :-)

Dorus
fuente
¿Por qué importa dónde está la redundancia? ¿El mantenimiento no será un problema sin importar dónde se encuentre?
Peter Mortensen
@PeterMortensen Esto siempre es una consideración entre el bajo tiempo de desarrollo o la alta capacidad de mantenimiento. La alta redundancia es fácil de desarrollar porque puede cambiar rápidamente las cosas aquí y allá, la baja redundancia es fácil para el mantenimiento porque puede cambiar rápidamente el estilo global. En la práctica, desea estar en un punto intermedio entre los dos, porque, teniendo en cuenta que, tener un estilo global hace que sea mucho más fácil incluso agregar nuevas páginas, pero tener cada última característica oscura adhiera a cualquier cambio de estilo global posible lleva mucho tiempo desarrollarlo.
Dorus
Es bueno CSS tiene características en ambas direcciones. Y depende del desarrollador web decidir cuánto tiempo gastar en reducir la redundancia y aumentar la capacidad de mantenimiento, o el tiempo necesario para crear nuevas páginas / funciones. Lo suficientemente interesante, lo mismo es cierto para cualquier otro lenguaje de programación donde puede pasar meses para diseñar el diseño perfecto, o días para destruir su programa y meses para buscar errores imposibles.
Dorus
Lo suficientemente interesante es que me encontré con esta pregunta que habla sobre llevar la abstracción demasiado lejos y perder tanto el mantenimiento como el tiempo de desarrollo.
Dorus
5

¿Por qué es correcto [un montón de valores codificados aparentemente aleatorios] para CSS / SVG?

No esta bien. Es posible escribir y mantener archivos ".css" simples, pero eventualmente los valores codificados aleatorios se convertirán en una carga frecuente.

Para cualquier cosa que no sean páginas web extremadamente simples, tendrá que desarrollar una estrategia disciplinada de "buscar y reemplazar", o utilizar un preprocesador CSS con variables, o definir estilos a través de JavaScript.

Jackson
fuente