Refactoring de la Herencia

Para utilizar la herencia adecuada entre parameter objects, necesitamos comprender el contexto en el cual se aplica:

  • Dado un algoritmo cuyos sus objetos son todos de responsabilidad única (Paso 1, 2 y 3).
  • Utiliza más de un parameter object y cumple el principio “Tell, Don’t Ask” (Paso 4 y 5).

Esto quiere decir que el codigo ya está preparado para que con la herencia eliminemos cierto código procedimental como el siguiente, donde asignamos propiedades de un Parameter Object hacia otro:

codigo-procedimental-2.PNG

El algoritmo inicia con un objeto que recibe un parameter object inicial (DatosDeLainversion), crea otro (DatosDeLaTasaBruta) y le asigna las propiedades para enviarlo al siguiente objeto (TasaBruta).

El principio de sustitución de Liskov es el uso correcto de la herencia, y lo logramos con estos cuatro pasos:

  1. Visualice el uso de los parameter objects
  2. Identifique la herencia
  3. Elimine el código de las asignaciones
  4. Cambie los objetos que no compilan para que usen la clase hija

A continuacion, la explicación:

1. Visualice el uso de los parameter objects

Visualice el uso de los Parameter Objects en su algoritmo. En la siguiente imagen diferencio dos Parameter Objects con colores diferentes. El parameter object rojo es el inicial, y en el segundo objeto llamado se crea el otro amarillo.

visualice-el-uso-de-parameter-objects.png

2. Identifique la herencia

La herencia la creamos en la dirección contraria a las flechas de la invocación de los objetos, así, el parameter object amarillo hereda del rojo:

herencia

Cuando la programe, hay propiedades que estarán en la clase padre y en la hija, así que las eliminamos de la hija. En este diagrama vemos que las propiedades “TasaDeImpuesto”, “ValorFacial” y “ValorTransadoNeto” están duplicadas:

propiedades-duplicadas

En el código de la clase hija se nos resalta en verde las que debemos borrar. Borremos esas propiedades:

herencia

 

 

3. Elimine el código de las asignaciones

El código de las asignaciones es procedimental, así que hay que eliminarlo con propiedades de solo-lectura o simplemente borrándolo:

a. Primero, en el caso de que la asignación a alguna propiedad tenga una lógica (ej. un cálculo o el llamado a un objeto) entonces dicha propiedad será una propiedad de solo-lectura en la clase hija. Por ejemplo, en esta imagen vemos que “DiasAlVencimiento” se asigna con una variable, pero es producto de un llamado previo a otro objeto:

propiedades-asignadas-con-logica

Entonces, lo modificamos para que sea una propiedad de solo lectura, así:

propiedad-de-solo-lectura1

Para hacerlo, corte el código de la ubicación original y lo coloca en la nueva propiedad. El código anterior no compilará.

Note el uso de “this“, pues ahí se cumple el principio de Liskov.

Modifique el código original para que compile:

uso-de-la-propiedad-solo-lectura.PNG

Note que ahora “losDiasAlVencimiento” se toma a partir del parameter object.

b. Si las asignaciones son solo variables o datos del primer parameter object, entonces las borramos, como en este caso con “ValorFacial”, “ValorTransadoNeto” y “TasaDeImpuesto” pues ya vienen heredadas:

 

Esto es debido a que las propiedades ya están asignadas en la clase padre. No hace falta asignarlas pues ahora las heredaremos.

elimine-las-asignaciones

Finalmente, cambie ese método para que reciba la clase hija:

use-la-clase-hija

4. Cambie los objetos que no compilan para que usen la clase hija

A diferencia de la imagen inicial, ahora, el algoritmo inicia con la clase hija. Compile y modifique cada objeto uno por uno hasta lograr la compilación.

cambie-para-sustituir-con-liskov

En caso de que alguna propiedad de la clase padre no funcione porque necesita a la clase hija, mueva a la clase hija, como en este caso:

mueva-propiedad-a-la-hija.PNG

Al moverlo a la clase hija, sí compila.

clase-hija.PNG

Recuerde que siempre debemos asegurar que las pruebas unitarias compilen y sean exitosas para verificar que la funcionalidad se mantiene intacta.

Liskov

En los objetos circulares resaltados cumplimos el principios de Liskov, pues estamos enviando una clase hija, pero ellos la utilizan como la clase padre:

cumpliendo-el-principio-de-liskov

 

La aplicación de la herencia simplica la intención del código. Finalmente, luego de aplicar la herencia puede ser necesario mejorar los nombres de los Parameter Objects. Esto queda a discresión del programador.

Además, podría darse el caso de que alguna clase ya no tenga lógica y se deba eliminar.

Recuerde que el video de explicación completo está aquí: Polimorfismo.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s