Duplicar datos observados.
¿Se almacenan datos de dominio en clases responsables de la GUI?
En ese caso, conviene separar los datos en clases independientes, asegurando la conexión y sincronización entre la clase de dominio y la GUI.
##Example
##Why Refactor
Quieres tener varias vistas de interfaz para los mismos datos (por ejemplo, tienes tanto una app de escritorio como una app móvil). Si no separas la GUI del dominio, te resultará muy difícil evitar la duplicación de código y un gran número de errores.
##Benefits
-
Separas la responsabilidad entre las clases de lógica de negocio y las clases de presentación (cf. el Principio de responsabilidad única), lo que hace que tu programa sea más legible y comprensible.
-
Si necesitas añadir una nueva vista de la interfaz, crea nuevas clases de presentación; no necesitas tocar el código de la lógica de negocio (cf. el Principio de abierto/cerrado).
-
Ahora distintas personas pueden trabajar en la lógica de negocio y en las interfaces de usuario.
##How to Refactor
-
Oculta el acceso directo a los datos de dominio en la clase GUI. Para ello, lo mejor es usar Auto-encapsular campo. Así creas los getters y setters para estos datos.
-
En los manejadores de eventos de la clase GUI, usa los setters para establecer los nuevos valores de los campos. Esto te permitirá pasar estos valores al objeto de dominio asociado.
-
Crea una clase de dominio y copia en ella los campos necesarios de la clase GUI. Crea getters y setters para todos estos campos.
-
Crea un patrón Observer para estas dos clases:
-
En la clase de dominio, crea un array para almacenar los objetos observadores (objetos GUI), así como métodos para registrarlos, eliminarlos y notificarlos.
-
En la clase GUI, crea un campo para almacenar referencias a la clase de dominio, así como el método
update(), que reaccionará a los cambios en el objeto y actualizará los valores de los campos de la clase GUI. Ten en cuenta que las actualizaciones de valores deben establecerse directamente en el método, para evitar la recursión. -
En el constructor de la clase GUI, crea una instancia de la clase de dominio y guárdala en el campo que has creado. Registra el objeto GUI como observador en el objeto de dominio.
-
En los setters de los campos de la clase de dominio, llama al método para notificar al observador (es decir, el método de actualización de la clase GUI), con el fin de pasar los nuevos valores a la GUI.
-
Cambia los setters de los campos de la clase GUI para que establezcan los nuevos valores directamente en el objeto de dominio. Ten cuidado de que los valores no se establezcan a través de un setter de la clase de dominio; de lo contrario, se producirá una recursión infinita.
-