2009-03-26 7 views
5

Estoy programando un juego en Python, donde todas las actividades IO son realizadas por un objeto IO (con la esperanza de que sea fácil intercambiar ese objeto por otro que implemente una interfaz de usuario diferente). Casi todos los demás objetos del juego necesitan acceder al sistema IO en algún momento (por ejemplo, imprimir un mensaje, actualizar la posición del jugador, mostrar un efecto especial causado por una acción en el juego), así que mi pregunta es la siguiente:Programación de juegos Python: ¿mi objeto IO es un candidato legítimo por ser una variable global?

¿Tiene sentido que una referencia al objeto IO esté disponible globalmente?

La alternativa es pasar una referencia al objeto IO en el __init__() de cada objeto que necesita usarlo. Entiendo que esto es bueno desde el punto de vista de la prueba, pero ¿vale la pena la resultante "contaminación de la firma funcional"?

Gracias.

+0

Espero que realmente cambie su objeto IO por uno que proporcione una implementación diferente a la misma interfaz. :) – chaos

+0

Sí, debería haber sido más claro; Usé la interfaz de la palabra para referirme a la interfaz de usuario :) –

+0

@James: por favor, arregle su pregunta. –

Respuesta

9

Sí, este es un uso legítimo de una variable global. Si prefieres no hacerlo, pasar por un objeto de contexto que sea equivalente a este global es otra opción, como mencionaste.

Como supongo que está utilizando múltiples archivos (módulos), ¿por qué no hacer algo como:

import io 
io.print('hello, world') 
io.clear() 

Esta es una forma común de los programas que tienen más complejo I/O necesita que la impresión sencilla de hacer cosas como explotación florestal.

+0

+1: No es realmente "global", sino un módulo global, que es mucho, mucho mejor. Es un Singleton. –

1

Sí, eso creo.

Otra posibilidad sería crear un módulo loggerModule que tenga funciones como print() y write(), pero esto solo sería marginalmente mejor.

0

Nope.

Las variables son demasiado específicas para pasarlas en el espacio de nombres global. Esconderlos dentro de las funciones/clases estáticas que pueden hacer cosas mágicas en tiempo de ejecución (o llamar a otros por completo).

Considere lo que sucede si el IO puede cambiar periódicamente el estado o si necesita bloquearse por un tiempo (como muchos sockets).

Considere lo que sucede si el mismo bloque de código se incluye varias veces. ¿La instancia variable también se duplica?

Considere lo que sucede si quiere tener una versión 2 de la misma variable. ¿Qué pasa si quieres cambiar su interfaz? ¿Tienes que modificar todo el código que lo hace referencia?

¿Realmente tiene sentido infectar todo el código que usa la variable con el conocimiento de todas las formas en que puede salir mal?

Cuestiones relacionadas