---
title: "Dupliquer les données observées"
type: "refactoring-technique"
slug: "duplicate-observed-data"
url: "http://localhost:3000/fr/duplicate-observed-data.md"
category: "Organizing Data"
description: "Problème : des données métier sont-elles stockées dans des classes responsables de l’interface graphique ? Solution : il est alors judicieux de séparer les données dans des classes distinctes, en assurant la liaison et la synchronisation entre la classe métier et l’interface graphique."
---
# Dupliquer les données observées

> Problème : des données métier sont-elles stockées dans des classes responsables de l’interface graphique ? Solution : il est alors judicieux de séparer les données dans des classes distinctes, en assurant la liaison et la synchronisation entre la classe métier et l’interface graphique.

## Problem

Des données métier sont-elles stockées dans des classes responsables de l’interface graphique ?

## Solution

Il est alors judicieux de séparer les données dans des classes distinctes, en assurant la liaison et la synchronisation entre la classe métier et l’interface graphique.

## Why Refactor

Vous souhaitez disposer de plusieurs vues d’interface pour les mêmes données (par exemple, vous avez à la fois une application de bureau et une application mobile). Si vous ne parvenez pas à séparer l’interface graphique du domaine métier, il vous sera très difficile d’éviter la duplication de code et un grand nombre d’erreurs.

## Benefits

* Vous répartissez les responsabilités entre les classes de logique métier et les classes de présentation (cf. le _principe de responsabilité unique_), ce qui rend votre programme plus lisible et plus compréhensible.
* Si vous devez ajouter une nouvelle vue d’interface, il vous suffit de créer de nouvelles classes de présentation ; vous n’avez pas besoin de toucher au code de la logique métier (cf. le _principe ouvert/fermé_).
* Désormais, différentes personnes peuvent travailler sur la logique métier et sur les interfaces utilisateur.

## How to Refactor

1. Masquez l’accès direct aux données métier dans la _classe d’interface graphique_. Pour cela, le mieux est d’utiliser [Auto-encapsuler un champ](/fr/self-encapsulate-field). Vous créez ainsi les accesseurs (getters et setters) pour ces données.
2. Dans les gestionnaires d’événements de la _classe d’interface graphique_, utilisez les setters pour définir les nouvelles valeurs des champs. Cela vous permettra de transmettre ces valeurs à l’_objet métier_ associé.
3. Créez une classe métier et copiez-y les champs nécessaires depuis la _classe d’interface graphique_. Créez des getters et des setters pour tous ces champs.
4. Créez un patron Observateur pour ces deux classes :

  * Dans la _classe métier_, créez un tableau pour stocker les objets observateurs (_objets d’interface graphique_), ainsi que des méthodes pour les enregistrer, les supprimer et les notifier.
  * Dans la _classe d’interface graphique_, créez un champ pour stocker les références vers la _classe métier_ ainsi que la méthode `update()`, qui réagira aux changements de l’objet et mettra à jour les valeurs des champs de la _classe d’interface graphique_. Notez que les mises à jour de valeurs doivent être effectuées directement dans la méthode, afin d’éviter la récursivité.
  * Dans le constructeur de la _classe d’interface graphique_, créez une instance de la _classe métier_ et enregistrez-la dans le champ que vous avez créé. Enregistrez l’_objet d’interface graphique_ comme observateur de l’_objet métier_.
  * Dans les setters des champs de la _classe métier_, appelez la méthode de notification de l’observateur (autrement dit, la méthode de mise à jour de la _classe d’interface graphique_), afin de transmettre les nouvelles valeurs à l’interface graphique.
  * Modifiez les setters des champs de la _classe d’interface graphique_ pour qu’ils définissent directement les nouvelles valeurs dans l’objet métier. Veillez à ne pas définir les valeurs via un setter de la _classe métier_, sous peine de provoquer une récursivité infinie.
## Relations

**Eliminates smells**

- [Classe trop volumineuse](/fr/smells/large-class.md)

