¿Por qué las variables globales son malas, en una aplicación integrada de un solo subproceso, sin sistema operativo?

8 minutos de lectura

avatar de usuario
llanero solitario

La mayoría de las objeciones que veo sobre el uso de variables globales tienen sentido, ya que se refieren a problemas de múltiples subprocesos, seguridad de subprocesos, etc.

Pero en un caso pequeño, de un solo subproceso, sin sistema operativo, ¿qué objeciones tiene? En mi caso, estoy escribiendo mi sistema integrado en “C”, si importa. También soy el único desarrollador del producto.

¿Por qué la eliminación de variables globales mejoraría mi código?

(Después de leer varias respuestas, me doy cuenta de que también debería haber señalado que este sistema no tiene una asignación de memoria dinámica (por ejemplo, malloc). Toda la memoria se asigna estáticamente en el momento de la compilación).

No lo haría.

Los dos problemas fundamentales con las variables globales son simplemente saturar el espacio de nombres y el hecho de que “nadie” tiene “control” sobre ellas (por lo tanto, las posibles colisiones y conflictos con múltiples subprocesos).

Los “globales son malos”, como casi todos los demás lenguajes de programación de computadoras, son una guía, no una regla estricta y rápida. Cuando se hacen este tipo de “reglas”, es mejor comprender las circunstancias y motivaciones detrás de la creación de la regla en lugar de simplemente adoptar la regla de memoria. No los tomes a ciegas.

En su caso, parece comprender la naturaleza de su sistema y los argumentos en torno a la regla y decidió que no se aplica en este caso. Tienes razón, no lo hace.

Entonces, no te preocupes por eso.

  • Agradezco los muchos comentarios y respuestas. Seleccioné esto como mi respuesta porque resume más claramente mi razón. Me siento ‘divertido’ eligiendo una respuesta que valide mis elecciones de diseño, pero bueno, supongo que lo haré de todos modos.

    – llanero solitario

    20 de mayo de 2009 a las 1:53

  • Esta es una de las mejores respuestas que he leído en este sitio.

    – Ellis

    30 de julio de 2015 a las 17:11

Las variables globales no son necesariamente malas, al igual que las macros no son necesariamente malas, y el uranio enriquecido no es necesariamente malo. Siempre que tome una decisión consciente sobre los pros y los contras de una elección de diseño dada, todo debería estar bien.

Algunos de los argumentos en contra variables globales son:

  1. Violan el buen diseño orientado a objetos
  2. Hacen que su código sea difícil de probar por unidad, ya que no puede probar bloques de código individuales sin configurar todas las variables globales que el código espera ver.
  3. Aumentan el acoplamiento en su código: las acciones en un bloque de código pueden afectar las cosas en otro bloque de código de manera impredecible a través de una variable global compartida

Algunos de los argumentadores por variables globales:

  1. Facilitan compartir un solo recurso entre muchas funciones
  2. Pueden hacer que el código sea más fácil de leer.

Si, en su diseño, las variables globales tienen sentido y se pueden usar para hacer que su código sea más fácil de leer o de mantener, sin exponerse a errores aleatorios y dolores de cabeza en las pruebas, entonces utilícelas por todos los medios.

Escribo mucho código C para microcontroladores integrados y uso variables globales todo el tiempo. En un sistema tan rígido, las variables globales tienen sentido. Soy consciente de los posibles inconvenientes, pero analicé los pros y los contras y escribo mi código para protegerme de los principales escollos.

En pocas palabras: no existe una regla estricta y rápida. Simplemente tome la mejor decisión para su proyecto o plataforma en particular, en función de la mejor información que tenga.

  • Acordado. Como tantas “reglas” en el software (especialmente C), hay momentos en que la situación requiere que se dobleguen o se rompan. Trato de evitar los globales tanto como sea posible, pero hay una pequeña cantidad de ocasiones en las que son la mejor solución a un problema.

    –Steve Melnikoff

    17 mayo 2009 a las 15:33

  • las variables globales también pueden hacer que el código sea más difícil de leer… y en mi opinión, eso es más probable.

    – smerlin

    18 de julio de 2010 a las 12:57

Aquí hay un buen artículo que da la razón. Por qué las variables globales son malas

¿Por qué se deben evitar las variables globales cuando son innecesarias?

No local: el código fuente es más fácil de entender cuando el alcance de sus elementos individuales es limitado. Las variables globales pueden ser leídas o modificadas por cualquier parte del programa, lo que dificulta recordar o razonar sobre cada uso posible. Sin control de acceso ni verificación de restricciones: cualquier parte del programa puede obtener o establecer una variable global, y cualquier regla relacionada con su uso puede romperse u olvidarse fácilmente.

Acoplamiento implícito: un programa con muchas variables globales a menudo tiene acoplamientos estrechos entre algunas de esas variables y acoplamientos entre variables y funciones. Agrupar elementos acoplados en unidades cohesivas generalmente conduce a mejores programas.

Problemas de asignación de memoria: algunos entornos tienen esquemas de asignación de memoria que dificultan la asignación de elementos globales. Esto es especialmente cierto en lenguajes donde los “constructores” tienen efectos secundarios además de la asignación (porque, en ese caso, puede expresar situaciones inseguras donde dos globales dependen mutuamente uno del otro). Además, al vincular dinámicamente módulos, puede no estar claro si las diferentes bibliotecas tienen sus propias instancias de globales o si los globales se comparten.

Pruebas y confinamiento: la fuente que utiliza globales es algo más difícil de probar porque no se puede configurar fácilmente un entorno ‘limpio’ entre ejecuciones. En términos más generales, la fuente que utiliza servicios globales de cualquier tipo que no se proporcionan explícitamente a esa fuente es difícil de probar por la misma razón.

Agregar globales es muy fácil. Es fácil adquirir el hábito de declararlos. Es mucho más rápido que pensar en un buen diseño.

Las variables globales no son tan malas como puede pensar, solo deben evitarse cuando no sean necesarias. Las variables globales pueden tener un buen uso para una variable que se usaría a lo largo del programa, asegurándose de tener en cuenta que siempre debe realizar un seguimiento de dónde cambia esa variable; pero para las variables que tienden a usarse solo dentro de partes limitadas del programa, es una buena razón para evitar tenerlo global.

  • Los valores globales solo pueden ser vistos por módulos que incluyen el módulo en el que están definidos. Siguiendo esa lógica, uno podría prohibir los campos públicos y protegidos porque todos pueden acceder a ellos por herencia.

    –Marco van de Voort

    17 de mayo de 2009 a las 22:01

Porque minimiza el acoplamiento. Su sistema puede ser pequeño ahora, pero si sigue funcionando, puede que no lo sea.

Las variables globales son necesarias en una pequeña aplicación integrada escrita en C. Por ejemplo, necesita usar una variable global para pasar información entre una rutina de servicio de interrupción y otro módulo. Estos son algunos consejos que lo ayudarán a hacer un uso efectivo de las variables globales en aplicaciones integradas:

  • Haga una distinción entre variables estáticas y variables globales. Las variables estáticas se pueden usar desde todas las funciones en el mismo archivo C. Son el equivalente de miembros privados en una clase de C++. En C tienes que hacer el trabajo del compilador tú mismo. Use la palabra clave estática para evitar el uso accidental de la variable fuera del módulo y hacer evidente su alcance. Es posible que desee prefijar la variable con el nombre del módulo.

  • Siga una convención de nomenclatura para las variables globales (utilizada por muchos archivos C). Que sea claramente evidente que son globales.

  • Si necesita muchas variables globales, considere agruparlas en una estructura.

  • Utilice la palabra clave volátil, cuando sea necesario. Esto es necesario si una ISR modifica una variable global.

  • ¡Gran complemento a la respuesta principal!

    – Siempre aprendiendo

    23 de agosto de 2018 a las 17:59

El código que usa variables globales es más difícil de mantener. Dado que el mantenedor debe encontrar todos los usos de la variable en el sistema antes de poder saber con precisión qué hace la variable. Dado que esto ralentiza el mantenimiento, debe evitarse tanto como sea posible. Eso es `

  • ¡Gran complemento a la respuesta principal!

    – Siempre aprendiendo

    23 de agosto de 2018 a las 17:59

avatar de usuario
Juan Christman

Es una cuestión de alcance. Tenemos desarrolladores a los que les encanta hacer variables globales para hacer conceptos locales. Hace que el uso de estas variables sea mucho más difícil de seguir, por lo que es más fácil cometer errores en el uso de ellas.

También puede mantener su billetera en su porche delantero, pero entonces tiene mucho menos control sobre quién accede a ella.

Dicho esto, hay algunos usos válidos para la variable global, pero como cualquier otra regla, vale la pena seguirla. Esta es la excepción, no el caso normal. Su propia existencia señala que tienen un uso.

Si decide usar una variable global, intente comentarlas bien y darles buenos nombres. Realmente me molesta cuando la gente crea variables globales como “bool bIsFound”;

Hacemos hincapié en evaluar cada nueva variable global en la revisión de código y ver si hay un mejor enfoque.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad