AS3 que hace referencia a Singleton

Tengo una clase GameEngine que es un sprite y un GameModel que es un Singleton y contiene una gran cantidad de datos.

Luego obtengo los datos con

GameModel.getInstance().variable;

mi motor de juego tiene muchos de ellos ahora y me preguntaba si sería más eficiente si tuviera una referencia al GameModel en mi GameEngine en lugar de crearlo todo el tiempo

private var _data:GameModel = GameModel.getInstance();
trace(_data.variable);

Tengo la sensación bastante fuerte de que será más eficiente, pero si alguien pudiera decirme con certeza y dejarme saber si puede ver posibles fallas con este método, sería muy apreciado, saludos, rory.

preguntado el 04 de julio de 12 a las 10:07

2 Respuestas

Definitivamente es una buena idea almacenar la instancia en una propiedad, ya que la búsqueda será más rápida, pero también porque reduce el conocimiento de GameEngine de los detalles de implementación de GameModel.

Por ejemplo, imagina que tienes un montón de GameModel.getInstance() llamadas dentro de su clase GameEngine y decide abandonar el comportamiento de singleton. Estará reescribiendo todas esas llamadas, sin embargo, si hubiera almacenado en caché la instancia en una propiedad, solo necesitaría reescribir una línea.

Dicho esto, olvídese de los singletons por completo, son un mal mucho mayor que la optimización prematura, pero si DEBE usar uno, al menos almacene la instancia en una propiedad en sus clases de cliente.

Respondido 04 Jul 12, 16:07

Ciertamente podría agregarlo como una instancia, pero dudo que haga una diferencia notable. La optimización prematura es la raíz de todos los males y eso :)

Si tiene mucha curiosidad, debe intentar compararlo y ver si realmente cambia algo.

EDITAR: Oh, sí, como menciona la otra respuesta aquí, es posible que desee eliminar los singletons por completo. Recomendaría mirar los tirantes rápidos. https://github.com/tschneidereit/SwiftSuspenders/ para inyección de dependencia (o incluso piernas robóticas, para una gran solución MVC liviana, que incluye tirantes rápidos).

Respondido 05 Jul 12, 07:07

¡Gracias por tu respuesta Jonatan! acabo de hacer una prueba rápida en bucle 100,000 veces _data.speed += _data.speedAcceleration; 57MS- rorypicko

¿Y en comparación con la otra versión? - jonatan hedborg

¡Accidentalmente presioné enter en lugar de shift enter antes de agregar los otros resultados! GameModel.getInstance().speed += GameModel.getInstance().speedAcceleration; 122 MS- rorypicko

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.