---
title: "Reemplazar código de tipo con clase"
type: "refactoring-technique"
slug: "replace-type-code-with-class"
url: "http://localhost:3000/es/replace-type-code-with-class.md"
category: "Organizing Data"
description: "Problema: Una clase tiene un campo que contiene un código de tipo. Los valores de este tipo no se usan en condiciones de operadores y no afectan al comportamiento del programa. Solución: Crea una nueva clase y usa sus objetos en lugar de los valores del código de tipo."
---
# Reemplazar código de tipo con clase

> Problema: Una clase tiene un campo que contiene un código de tipo. Los valores de este tipo no se usan en condiciones de operadores y no afectan al comportamiento del programa. Solución: Crea una nueva clase y usa sus objetos en lugar de los valores del código de tipo.

## Problem

Una clase tiene un campo que contiene un código de tipo. Los valores de este tipo no se usan en condiciones de operadores y no afectan al comportamiento del programa.

## Solution

Crea una nueva clase y usa sus objetos en lugar de los valores del código de tipo.

## Why Refactor

Una de las razones más comunes para el código de tipo es el trabajo con bases de datos, cuando una base de datos tiene campos en los que algún concepto complejo se codifica con un número o una cadena.

Por ejemplo, tienes la clase `User` con el campo `user_role`, que contiene información sobre los privilegios de acceso de cada usuario, ya sea administrador, editor o usuario corriente. Así que, en este caso, esa información se codifica en el campo como `A`, `E` y `U` respectivamente.

¿Cuáles son los inconvenientes de este enfoque? Los setters del campo a menudo no comprueban qué valor se envía, lo que puede causar grandes problemas cuando alguien envía valores no previstos o erróneos a estos campos.

Además, la verificación de tipos es imposible para estos campos. Es posible enviarles cualquier número o cadena, que tu IDE no comprobará de tipo e incluso permitirá que tu programa se ejecute (y se bloquee más adelante).

## Benefits

* Queremos convertir conjuntos de valores primitivos —que es lo que son los tipos codificados— en clases de pleno derecho con todas las ventajas que ofrece la programación orientada a objetos.
* Al reemplazar el código de tipo con clases, permitimos la comprobación de tipos para los valores que se pasan a métodos y campos a nivel del lenguaje de programación.
Por ejemplo, mientras que antes el compilador no veía diferencia entre tu constante numérica y cualquier número arbitrario al pasar un valor a un método, ahora, cuando se pasan datos que no encajan con la clase de tipo indicada, tu IDE te avisa del error.
* Así hacemos posible mover código a las clases del tipo. Si necesitabas realizar manipulaciones complejas con los valores de tipo a lo largo de todo el programa, ahora ese código puede «vivir» dentro de una o varias clases de tipo.

## How to Refactor

1. Crea una nueva clase y dale un nombre nuevo que se corresponda con el propósito del tipo codificado. Aquí la llamaremos _clase de tipo_.
2. Copia el campo que contiene el código de tipo a la _clase de tipo_ y hazlo privado. Después crea un getter para el campo. A este campo solo se le asignará un valor desde el constructor.
3. Para cada valor del tipo codificado, crea un método estático en la _clase de tipo_. Este creará un nuevo objeto de la _clase de tipo_ correspondiente a ese valor del tipo codificado.
4. En la clase original, reemplaza el tipo del campo codificado por la _clase de tipo_. Crea un nuevo objeto de este tipo tanto en el constructor como en el setter del campo. Cambia el getter del campo para que llame al getter de la _clase de tipo_.
5. Reemplaza cualquier mención de los valores del tipo codificado por llamadas a los métodos estáticos pertinentes de la _clase de tipo_.
6. Elimina las constantes del tipo codificado de la clase original.
## Relations

**Similar techniques**

- [Reemplazar código de tipo con subclases](/es/replace-type-code-with-subclasses.md)
- [Reemplazar código de tipo con estado/estrategia](/es/replace-type-code-with-state-strategy.md)

**Eliminates smells**

- [Obsesión por los tipos primitivos](/es/smells/primitive-obsession.md)

