ConstructiCat Logo
CodeBust.
Browse section ▾

Reemplazar valor de datos por objeto.

Problem

Una clase (o grupo de clases) contiene un campo de datos. El campo tiene su propio comportamiento y datos asociados.

Solution

Crea una nueva clase, coloca en ella el antiguo campo y su comportamiento, y almacena el objeto de la clase dentro de la clase original.

##Example

Antes
Order customer : String
Después
Order Customer name: String 1

##Why Refactor

Esta refactorización es básicamente un caso especial de Extraer clase. Lo que la diferencia es el motivo de la refactorización.

En Extraer clase, tenemos una sola clase que es responsable de diferentes cosas y queremos repartir sus responsabilidades.

Con la sustitución de un valor de datos por un objeto, tenemos un campo primitivo (número, cadena, etc.) que ya no es tan simple debido al crecimiento del programa y que ahora tiene datos y comportamientos asociados. Por un lado, estos campos no tienen nada de inquietante en sí mismos. Sin embargo, esta familia de campos y comportamientos puede estar presente en varias clases a la vez, creando código duplicado.

Por todo ello, creamos una nueva clase y trasladamos a ella tanto el campo como los datos y comportamientos relacionados.

##Benefits

  • Mejora la cohesión dentro de las clases. Los datos y los comportamientos relevantes están dentro de una sola clase.

##How to Refactor

Antes de empezar a refactorizar, comprueba si hay referencias directas al campo desde dentro de la clase. Si las hay, usa Autoencapsular campo para ocultarlo en la clase original.

  1. Crea una nueva clase y copia en ella tu campo y el getter correspondiente. Además, crea un constructor que acepte el valor simple del campo. Esta clase no tendrá setter, ya que cada nuevo valor de campo que se envíe a la clase original creará un nuevo objeto de valor.

  2. En la clase original, cambia el tipo del campo a la nueva clase.

  3. En el getter de la clase original, invoca el getter del objeto asociado.

  4. En el setter, crea un nuevo objeto de valor. Es posible que también debas crear un nuevo objeto en el constructor si allí se habían establecido previamente valores iniciales para el campo.