Ok, entonces esta es una pregunta de defensa de los demonios realmente.
¿Cuándo están bien las variables globales y, si nunca, qué usaría como alternativa?
Un caso secundario interesante para esta pregunta, ¿en qué se diferencia un campo de clase estática pública de un campo global?
Respuestas:
Hasta donde yo sé, un campo estático público es básicamente global dado que se puede llamar desde cualquier lugar con la excepción de que no obstruye el espacio de nombres.
La única vez que uso personalmente las variables 'globales' en mi código es en forma de campos públicos estáticos que son inmutables. En este caso, no hay necesidad de preocuparse por el valor que otras partes del programa están alterando y, por supuesto, es mucho mejor que tener una docena de variables con los mismos valores permanentes en cada clase.
fuente
Personalmente, uso globales para la configuración en tiempo de ejecución: si una propiedad de configuración se carga al inicio de la aplicación, y solo cambia con poca frecuencia (y solo desde un lugar), es terrible y propenso a errores pasarla a todos los métodos que puedan necesitar usar en algún momento Es mejor usar algo que pueda ponerse al alcance desde cualquier lugar que necesite usarlo, ya que eso no abarrota y oscurece las firmas de métodos y los sitios de llamadas.
fuente
CONFIG_
oCFG_
.Excluyendo los sistemas en tiempo real / embebidos, en realidad solo debe usar valores globales para valores constantes. Si siente que no puede resolver su problema sin ellos, probablemente esté haciendo algo mal.
Además, observe el patrón Singleton , ya que proporciona una mejor solución para los globales en aquellas situaciones en las que necesita algo para tener un punto de acceso global.
fuente
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
solo es relevante en el archivo / clase / sección donde aparece 'este ciclo particular'.El problema con las variables globales es que debe conocerlas en todas partes en su código. Sin embargo, una vez que haya decidido que necesita saber acerca de un global en particular, se perderá un poco más al usarlo en gran medida. Por lo tanto, mi opinión es que debe tener muy pocas variables globales, pero de las pocas que tiene, debe obtener el máximo kilometraje.
Para otro ejemplo de algo que siento de esta manera, mira el uso de mixins en Ruby.
fuente
Se trata de espacios de nombres.
Imagine por un momento que todos en el mundo tuvieran el mismo apellido. Que desastre.
(En la India, los sikhs tienen el mismo apellido: Singh - Echa un vistazo)
fuente
Versión corta: cuando facilita razonar sobre el programa. Por lo general, los casos son algún tipo de estado global o recurso estático que se usa ampliamente.
Versión larga: Tom Hawtin dijo "con una acción espeluznante a distancia" ... ese es exactamente el problema con los globales: tienes que saber dónde se está usando y cómo, o puedes conseguir algo realmente extraño y difícil de rastrear loco. Los locales no son más ni menos que una estrategia para reducir el alcance de lo que el programador necesita comprender para razonar sobre el programa.
Otro lado del problema de saber dónde se usan es que puede terminar con globals duplicados, en cuyo caso las cosas pueden ponerse realmente extrañas a medida que la mayoría de los programas obtienen y establecen var1 mientras que en un par de lugares se usa var2 para mantener La misma información. Particularmente cuando varias personas están trabajando en el mismo código. Los IDE pueden ser útiles para encontrar el uso que reduce el costo de los globales, pero no hacen nada por los duplicados.
Mientras más globales tenga, más difícil será hacer un seguimiento de lo que sucede con ellos. Deben ser pocos y distantes entre sí.
fuente
Las dos trampas con globales y singletons son la capacidad de prueba y la capacidad de implementación.
Para las pruebas, he visto demasiados arneses de pruebas demasiado complejos solo para lidiar con vidas globalmente planificadas y únicas. Asegúrese de que dicho objeto tenga reglas claras y simples de inicio y desmontaje.
En cuanto a la capacidad de implementación, hay dos casos a considerar. En primer lugar, ¿cómo vivirá su objeto global? ¿Está en una biblioteca estática o dinámica? Si ese objeto global se reutiliza para un complemento, ¿obtendrá copias adicionales? En segundo lugar, ¿qué sucede cuando ese objeto global se coloca en una aplicación paralela? ¿Es seguro para subprocesos?
En general, creo que esas razones significan que los globales y los singletons se usan solo excepcionalmente.
fuente
El desarrollo de sistemas incrustados críticos generalmente implica el uso de variables globales.
Los tamaños de pila son pequeños, todo está estáticamente asignado (
malloc()
está prohibido), las variables globales están ocultas desde fuera de la biblioteca a la que pertenecen.fuente
En una horrible base de código VB6 que abusa de los globales como si no hubiera un mañana, soy culpable de presentar uno nuevo:
Creo que es uno de los pocos casos de uso válidos para un objeto global.
fuente