ConstructiCat Logo
CodeBust.
Browse section ▾

Duplicar Dados Observados.

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.

##Example

Antes
IntervalWindow startField: TextFieldendField: TextFieldlengthField: TextFieldStartField_FocusLost()EndField_FocusLost()LengthField_FocusLost()calculateLength()calculateEnd()
Depois
IntervalWindow startField: TextFieldendField: TextFieldlengthField: TextFieldStartField_FocusLost()EndField_FocusLost()LengthField_FocusLost() Interval start: Stringend: Stringlength: StringcalculateLength()calculateEnd() 1

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