Remplacer une donnée par un objet.
Une classe (ou un groupe de classes) contient un champ de données. Ce champ possède son propre comportement et ses propres données associées.
Créez une nouvelle classe, placez-y l'ancien champ et son comportement, et stockez l'objet de cette classe dans la classe d'origine.
##Example
##Why Refactor
Cette refactorisation est essentiellement un cas particulier d'Extraire une classe. Ce qui la distingue, c'est la raison de la refactorisation.
Dans Extraire une classe, nous avons une seule classe responsable de différentes choses et nous voulons répartir ses responsabilités.
Avec le remplacement d'une donnée par un objet, nous avons un champ primitif (nombre, chaîne, etc.) qui n'est plus aussi simple en raison de la croissance du programme et qui possède désormais des données et des comportements associés. D'un côté, ces champs n'ont en eux-mêmes rien d'effrayant. Cependant, cette famille de champs et de comportements peut être présente dans plusieurs classes simultanément, créant ainsi du code dupliqué.
C'est pourquoi, pour tout cela, nous créons une nouvelle classe et y déplaçons à la fois le champ et les données et comportements associés.
##Benefits
- Améliore la cohésion à l'intérieur des classes. Les données et les comportements associés se trouvent dans une seule classe.
##How to Refactor
Avant de commencer la refactorisation, vérifiez s'il existe des références directes au champ depuis l'intérieur de la classe. Si c'est le cas, utilisez Auto-encapsuler un champ afin de le masquer dans la classe d'origine.
-
Créez une nouvelle classe et copiez-y votre champ ainsi que son accesseur (getter) correspondant. Créez en outre un constructeur qui accepte la valeur simple du champ. Cette classe n'aura pas de mutateur (setter), car chaque nouvelle valeur de champ envoyée à la classe d'origine créera un nouvel objet valeur.
-
Dans la classe d'origine, remplacez le type du champ par la nouvelle classe.
-
Dans l'accesseur de la classe d'origine, invoquez l'accesseur de l'objet associé.
-
Dans le mutateur, créez un nouvel objet valeur. Vous devrez peut-être aussi créer un nouvel objet dans le constructeur si des valeurs initiales y avaient été définies pour le champ auparavant.