ConstructiCat Logo
CodeBust.
Browse section ▾

Reemplazar código de tipo con clase.

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.

##Example

Antes
Person $ O : int$ A : int$ B : int$ AB : intbloodgroup : int
Después
Person BloodGroup +O : BloodGroup$+A : BloodGroup$+B : BloodGroup$+AB : BloodGroup$ 1

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