Qué decirle a tu jefe si quiere que uses una variable global

13

Actualmente tengo 4 meses en una pasantía, y cuando revisé mi código, a mi jefe no le gustó que hubiera mantenido un objeto específico local para varios métodos en algunas clases separadas dentro de un ensamblaje. No le gustó que creara un nuevo objeto cada vez, y en su lugar me dijo que creara un solo objeto al que se pueda acceder desde cualquier lugar. Por lo tanto, tuve que crearlo como un objeto estático dentro de una clase estática, y simplemente hacer referencia a él desde aquí. ¡Quiero usarlo!

¿Cómo lidiarías con esto, ya que solo he estado programando profesionalmente durante 4 meses!

Darren Young
fuente
44
¿Es su jefe una persona técnica o no técnica? Si es técnico, ¿ha leído "Código limpio" de Robert C. Martin?
George Stocker
55
Entonces, ¿tu jefe te contrató para codificar y ahora te dice cómo codificar?
Jeremy Heiler
8
Usted dijo en un comentario a continuación que "el objeto no tiene ningún estado, aparte de muchas constantes". En ese caso, una clase estática me parece una buena solución.
Justin
55
"Sí, jefe" me
2
"me dijo que creara un solo objeto al que se pueda acceder desde cualquier lugar. Por lo tanto, tuve que crearlo como un objeto estático" Este no es un razonamiento válido. Habla como si tener un solo objeto accesible desde una aplicación completa implicara que tenía un Singleton: ¿por qué no lo crea en la raíz de agregación y luego pasa su referencia a las clases dependientes?
devorado elysium

Respuestas:

33

Si un objeto es suficiente, crear un objeto cada vez es un desperdicio, y aquí su jefe puede tener razón.

El problema es el acceso adecuado a ese objeto. Un método similar a una fábrica con una visibilidad adecuada que siempre devuelve ese objeto estático es la primera solución que viene a la mente. Otros ciertamente existen.

9000
fuente
3
+1: por mucho que no me guste cualquier respuesta "GoF dijo eso", la derecha es la correcta.
Javier
1
Pensé en Singletons, sin embargo, solo lo vi como un contenedor alrededor de una variable global, por lo que no lo seguí. Lo intentaré ahora, ya que el objeto no tiene ningún estado, aparte de muchas constantes, por lo que debería estar bien. Gracias.
Darren Young
99
Sospeché que este podría ser el caso ("el objeto no tiene ningún estado ... muchas constantes"). Tu jefe tiene razón. No tiene sentido ejercer presión artificial sobre el recolector de basura para valores que nunca cambian.
Berin Loritsch
3
@ darren-young: en una nota al margen, no tener estado es interesante y permite algunos enfoques poderosos; eche un vistazo a la llamada 'programación funcional' si aún no lo hizo.
9000
8

No puedo comentar su caso específico, pero el uso de variables globales a veces es una buena solución. La clase de sistema de Java está llena de variables globales estáticas.

Pero en general, si cree que tiene razón y su jefe está equivocado, ¿por qué no le pide a su jefe que le explique por qué cree que una variable global es una mejor solución? Un simple "No me gusta" es tan vago como "las variables globales son malas". ¡Debes exigir más de tu jefe!

Si él no puede dar razones para su postura, y usted puede dar razones para su postura, o viceversa, entonces es una buena oportunidad de aprendizaje. Si ambos pueden justificar sus posturas, entonces probablemente sea una cuestión de gustos o de experiencia: creo que su jefe debe haber programado profesionalmente durante más de 4 meses.

Joonas Pulakka
fuente
1
Ver, java.lang.Systemcontiene exactamente tres variables globales, y para cada una de ellas hay un método para configurarlo correctamente. Pero Systemestá lleno de métodos estáticos que devuelven objetos globales, y no hay exactamente nada de malo en esto, no puedo discutir.
9000
2
Si; Considero que las variables globales son muy similares a los métodos estáticos que devuelven objetos globales.
Joonas Pulakka
Entonces Java hace esto. Es una pregunta completamente diferente de si es una buena idea. El generador de números aleatorios estándar de C mantiene el estado global. Pero generalmente se reconoce que esto es horrible y que el generador de números aleatorios, por lo tanto, no se puede usar en ciertas aplicaciones (ver, por ejemplo, Bentley et al., Ingeniería de una función de clasificación ). Java en particular, tiene una serie de problemas de diseño (que se han mejorado en parte de en C #) de modo I't ser muy cuidado de usar como un argumento como este.
Konrad Rudolph
@Konrald Rudolph: Al final es una decisión de diseño. Cada decisión tiene pros y contras. Por ejemplo, mantener el estado global Systemsimplifica, digamos, el 99.9% de los casos de uso a costa de causar problemas en el 0.1% restante. No hay una respuesta "correcta" a si ese 0.1% vale o no la complejidad adicional.
Joonas Pulakka
5

Como alguien en su posición, lo máximo que puede hacer es aprender. Si el objeto es esencialmente una constante (es decir, no puede cambiar y no mantiene el estado), entonces su jefe puede tener razón. No hay daño en tener un objeto constante estático. Después de todo, ¿cuántas definiciones de PI hay?

Algunas personas defienden la mentalidad de "no objetos globales" hasta el punto de ferver religioso. Esto se debe a una de dos razones: han sido mordidos por errores difíciles de rastrear o por la fragilidad del sistema debido al uso excesivo de variables / objetos globales, o han escuchado que es malo y no pueden pensar por sí mismos. Personalmente pertenezco al grupo de personas que han sido golpeadas por la fragilidad y los errores difíciles de rastrear, pero también he aprendido algo de equilibrio aquí.

Si estuviera en tus zapatos, seguiría adelante y haría lo que el jefe diga: después de todo, es su trasero en la línea. Luego miraba y veía los efectos de esa elección con el tiempo. Esta es una herramienta de aprendizaje efectiva.

Berin Loritsch
fuente
Es una pasantía. Se supone que debes estar aprendiendo. Hacer ciegamente lo que dice tu jefe no es aprender.
David Thornley
55
Tampoco va a ciegas contra tu jefe. Mi consejo, como estaba escrito, era observar los efectos de la elección del jefe. Nosotros (en stackexchange) no podemos hacer un juicio de valor sobre la situación porque nos falta información vital. Este es un caso para hacer un pequeño método científico. El OP tiene una hipótesis, el jefe la ha desafiado. Ahora es el momento de realizar el experimento.
Berin Loritsch
2

Dependiendo de la situación específica, una variable global podría ser la mejor solución. En la programación integrada, los globales no están ocupando espacio en la pila y, por esa razón, es una buena opción.

Globales o no, me ha parecido una buena práctica poner un prefijo en los globales. Esto hará que otros programadores busquen en Google su código del impacto si se meten con él.

Max Kielland
fuente