---
title: "Duplicar datos observados"
type: "refactoring-technique"
slug: "duplicate-observed-data"
url: "http://localhost:3000/es/duplicate-observed-data.md"
category: "Organizing Data"
description: "Problema: ¿Se almacenan datos de dominio en clases responsables de la GUI? Solución: 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."
---
# Duplicar datos observados

> Problema: ¿Se almacenan datos de dominio en clases responsables de la GUI? Solución: 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.

## Problem

¿Se almacenan datos de dominio en clases responsables de la GUI?

## Solution

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.

## 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

1. Oculta el acceso directo a los datos de dominio en la _clase GUI_. Para ello, lo mejor es usar [Auto-encapsular campo](/es/self-encapsulate-field). Así creas los getters y setters para estos datos.
2. 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.
3. Crea una clase de dominio y copia en ella los campos necesarios de la _clase GUI_. Crea getters y setters para todos estos campos.
4. 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.
## Relations

**Eliminates smells**

- [Clase Grande](/es/smells/large-class.md)

