---
title: "Duplicar Dados Observados"
type: "refactoring-technique"
slug: "duplicate-observed-data"
url: "http://localhost:3000/pt-br/duplicate-observed-data.md"
category: "Organizing Data"
description: "Problema: Os dados de domínio estão armazenados em classes responsáveis pela GUI? Solução: Então é uma boa ideia separar os dados em classes próprias, garantindo a conexão e a sincronização entre a classe de domínio e a GUI."
---
# Duplicar Dados Observados

> Problema: Os dados de domínio estão armazenados em classes responsáveis pela GUI? Solução: Então é uma boa ideia separar os dados em classes próprias, garantindo a conexão e a sincronização entre a classe de domínio e a GUI.

## Problem

Os dados de domínio estão armazenados em classes responsáveis pela GUI?

## Solution

Então é uma boa ideia separar os dados em classes próprias, garantindo a conexão e a sincronização entre a classe de domínio e a GUI.

## Why Refactor

Você quer ter várias visualizações de interface para os mesmos dados (por exemplo, você tem tanto um aplicativo desktop quanto um aplicativo mobile). Se você não conseguir separar a GUI do domínio, terá muita dificuldade para evitar a duplicação de código e um grande número de erros.

## Benefits

* Você divide a responsabilidade entre as classes de lógica de negócio e as classes de apresentação (cf. o _Princípio da Responsabilidade Única_), o que torna seu programa mais legível e compreensível.
* Se você precisar adicionar uma nova visualização de interface, crie novas classes de apresentação; não é preciso tocar no código da lógica de negócio (cf. o _Princípio Aberto/Fechado_).
* Agora pessoas diferentes podem trabalhar na lógica de negócio e nas interfaces de usuário.

## How to Refactor

1. Oculte o acesso direto aos dados de domínio na _classe da GUI_. Para isso, o melhor é usar [Auto-Encapsular Campo](/pt-br/self-encapsulate-field). Assim você cria os getters e setters para esses dados.
2. Nos tratadores de eventos da _classe da GUI_, use setters para definir os novos valores dos campos. Isso permitirá que você passe esses valores ao _objeto de domínio_ associado.
3. Crie uma classe de domínio e copie para ela os campos necessários da _classe da GUI_. Crie getters e setters para todos esses campos.
4. Crie um padrão Observer para essas duas classes:

  * Na _classe de domínio_, crie um array para armazenar os objetos observadores (_objetos da GUI_), além de métodos para registrá-los, removê-los e notificá-los.
  * Na _classe da GUI_, crie um campo para armazenar referências à _classe de domínio_, além do método `update()`, que reagirá às mudanças no objeto e atualizará os valores dos campos na _classe da GUI_. Observe que a atualização dos valores deve ser feita diretamente no método, a fim de evitar recursão.
  * No construtor da _classe da GUI_, crie uma instância da _classe de domínio_ e salve-a no campo que você criou. Registre o _objeto da GUI_ como observador no _objeto de domínio_.
  * Nos setters dos campos da _classe de domínio_, chame o método de notificação do observador (em outras palavras, o método de atualização na _classe da GUI_), a fim de passar os novos valores para a GUI.
  * Altere os setters dos campos da _classe da GUI_ para que eles definam os novos valores diretamente no objeto de domínio. Tome cuidado para garantir que os valores não sejam definidos por meio de um setter da _classe de domínio_—caso contrário, ocorrerá recursão infinita.
## Relations

**Eliminates smells**

- [Classe Grande](/pt-br/smells/large-class.md)

