ConstructiCat Logo
CodeBust.
Browse section ▾

Reemplazar código de tipo con estado/estrategia.

Problem

Tienes un tipo codificado que afecta al comportamiento pero no puedes usar subclases para deshacerte de él.

Solution

Reemplaza el código de tipo por un objeto de estado. Si es necesario reemplazar el valor de un campo con código de tipo, se «conecta» otro objeto de estado.

##Example

Antes
Employee +ENGINEER : int+SALESMAN : int+type : int
Después
Employee EmployeeType Engineer Salesman 1

##Why Refactor

Tienes código de tipo y afecta al comportamiento de una clase, por lo que no podemos usar Reemplazar código de tipo con clase.

El código de tipo afecta al comportamiento de una clase, pero no podemos crear subclases para el tipo codificado debido a la jerarquía de clases existente u otras razones. Esto significa que no podemos aplicar Reemplazar código de tipo con subclases.

##Benefits

  • Esta técnica de refactorización es una salida para las situaciones en las que un campo con tipo codificado cambia de valor durante la vida del objeto. En este caso, la sustitución del valor se hace mediante la sustitución del objeto de estado al que la clase original hace referencia.

  • Si necesitas añadir un nuevo valor de un tipo codificado, todo lo que tienes que hacer es añadir una nueva subclase de estado sin alterar el código existente (cf. el Principio de abierto/cerrado).

##How to Refactor

  1. Usa Autoencapsular campo para crear un getter del campo que contiene el código de tipo.

  2. Crea una nueva clase y dale un nombre comprensible que encaje con el propósito del código de tipo. Esta clase desempeñará el papel de estado (o estrategia). En ella, crea un getter abstracto del campo codificado.

  3. Crea subclases de la clase de estado para cada valor del tipo codificado. En cada subclase, redefine el getter del campo codificado para que devuelva el valor correspondiente del tipo codificado.

  4. En la clase de estado abstracta, crea un método de fábrica estático que acepte el valor del tipo codificado como parámetro. En función de este parámetro, el método de fábrica creará objetos de distintos estados. Para ello, en su código crea un gran condicional; será el único cuando la refactorización esté completa.

  5. En la clase original, cambia el tipo del campo codificado por la clase de estado. En el setter del campo, llama al método de fábrica de estados para obtener nuevos objetos de estado.

  6. Ahora puedes empezar a mover los campos y métodos de la superclase a las subclases de estado correspondientes (usando Bajar campo y Bajar método).

  7. Cuando se haya movido todo lo movible, usa Reemplazar condicional con polimorfismo para deshacerte de una vez por todas de los condicionales que usan el código de tipo.