2012-01-18 13 views
7

Mi contexto inmediato es la plataforma de Windows, sin embargo, también podría hacer la misma pregunta cuando trabaje en una interfaz de usuario para otro host de interfaz gráfica de usuario. Estoy trabajando en bastante simple C++ winapi, sin ATL/MFC. No estoy interesado en usar globales, sino más bien en la práctica aceptada de realizar tareas relacionadas con "Ventana" con datos de "Aplicación".¿Cuál es el diseño adecuado/aceptado para acceder a las variables de aplicación desde una clase ventana?

He considerado la implementación de patrones de estilo mvvw o mvc en esto, pero antes de continuar me gustaría algunas opiniones de la comunidad, de lo que imagino son incontables desarrolladores y diseñadores experimentados.

Mi clase de aplicación tiene miembros de Windows. ¿Debería diseñarse la clase Window con una referencia de aplicación? ¿O hay una mejor manera que esto?

+0

El puntero a su clase 'TThread' entra en el almacenamiento local de subprocesos. La clase 'TThread' tiene un puntero al objeto' TApplication' como su miembro de datos. Tiene sentido hacer que 'TApplication' sea global de todos modos, porque su constructor proporciona un lugar para hacer algunas inicializaciones antes de llamar a' main'. – lapk

+2

Sé que las personas hacen muchos esfuerzos para evitar las variables globales (con razón), pero a veces ese es el mecanismo que mejor refleja la realidad. Si siempre hay una y solo una instancia de 'Aplicación' por diseño, ¿por qué * no * la convierte en global? –

+0

O un Singleton ... http://en.wikipedia.org/wiki/Singleton_pattern. Pero preferiría pasar todos mis objetos de Ventana una referencia al Modelo, en su caso ese sería el objeto de Aplicación AFAIU. –

Respuesta

1

La Win API de una ventana le otorga un Set/GetProperty() que le permite definir un puntero a lo que desee (es decir, su propio objeto de ventana). Sin embargo, por experiencia sé que es bastante lento.

La otra posibilidad es utilizar un mapa donde el puntero de las ventanas Win API se utilizan como claves y el valor es su objeto de ventana. Esto es mucho más rápido, pero ¿dónde colocas ese mapa si no tienes ningún globo terráqueo?

Según lo sugerido por Samuel, un singleton le permite obtener un objeto que es más o menos lo mismo que un global. Luego puede obtener su objeto de ventana usando el puntero de la ventana Win API como la clave y devuelve su objeto.

Esto es necesario para asignar los eventos entrantes a los objetos de su ventana. Todo lo demás debería hacerse al revés (Como era de esperar, llame solo a las funciones en su objeto de ventana que están mapeadas de forma similar a las ventanas del sistema.)

¿Por qué no usa Qt? ya está en C++ y no tiene que preocuparse por esos detalles ...

Cuestiones relacionadas