Pasos para extraer un objeto

Un objeto de responsabilidad única es aquel en donde todas sus variables de instancia son asignadas en el constructor y son usadas en todas sus funciones públicas. Extraemos un objeto de cada función coordinadora.

Esta es la secuencia de pasos para extraer un objeto a partir de una función coordinadora.

  1. Cree la clase
  2. Declare las variables de instancia
  3. Cree el constructor
  4. Asigne las variables de instancia
  5. Cree una función pública

Esta imagen ilustra los pasos. Haga clic para abrir la imagen en tamaño original:

de-una-funcion-coordinadora-a-un-objeto

Por ejemplo, tomemos el siguiente código de la función “ObtengaElValorDeMercado”:

objetos-0

1. Cree la clase

a. Cree la nueva clase de acuerdo al nombre de la función coordinadora. Si se llama “ObtengaElValorDeMercado”, la nueva clase es “ValorDeMercado” en un nuevo archivo ValorDeMercado.cs.
b. Indique el namespace correcto.
c. Escriba su visibilidad en Public.

objetos-1

2. Declare las variables de instancia

a. Coloque las declaraciones de las variables locales como variables de instancia. Las variables de instancia por default son privadas, así que se puede imitir la palabra private:

objetos-2

3. Cree el constructor

Cree el constructor con los mismos parámetros que la función coordinadora.

 

4. Asigne las variables de instancia

Mueva las asignaciones de las variables locales al constructor, donde se asignarán las variables de instancia.
Mueva las funciones privadas a esta nueva clase y esta clase debe compilar sin errores.

objetos-3

5. Cree una función pública

a. Cree una función publica con un nombre declarativo, tal como “ComoNumero” o “ComoTexto”. En inglés, ejemplo de un nombre declarativo es “ToString()”. No tiene parámetros pues utiliza todas las variables de instancia. Su tipo de retorno es el mismo que la función coordinadora original.

b. El contenido de esta función es el mismo que el de la función del return de la función coordinadora. Mueva esa línea de código.

d. En algunos casos, el código no compila pues se requiere variables de instancia adicionales, como en este caso con “elPrecioLimpio”:

objetos-4a

Así, inicializamos y asignamos dicha variable de instancia en el constructor, así:

objetos-4b

5. Integre al algoritmo general

a. En la antigua función coordinadora, cree e invoque el nuevo objeto, con una línea como esta: return new ValorDeMercado (…).ComoNumero();
b. Elimine el código que ya no use y ejecute las pruebas unitarias que ahora deben ser exitosas.

objetos-5

6. Realice las pruebas unitarias

1. Identifique la cantidad de pruebas unitarias de acuerdo a la cantidad de bifurcaciones dentro de la clase. Por ejemplo, si tiene un IF, realice dos pruebas, cada una de las cuales ejercitará un flujo.
2. Coloque un breakpoint en el constructor de la clase y realice el debugging de una prueba unitaria existente y apunte los datos de entrada al objeto.

objetos-6-debugging.PNG

Use la pantalla de Locals para apuntar los parámetros recibidos.

objetos-7-locals
3. Cree la clase de pruebas unitarias y escriba una prueba unitaria indicando los datos de entrada. Indique un dato temporal como el resultado esperado para que las pruebas fallen.

objetos-8-unittest
4. Ejecute las pruebas unitarias. Todas deben ser exitosas a excepción de la que recién escribió. Apunte el resultado obtenido al hacer debugging de esa prueba para colocarlo como los resultados esperados en la pruebas unitaria. Este resultado es correcto porque todas las demás pruebas lo son.

objetos-9-expected
5. Actualice el resultado obtenido en la prueba unitaria.
6. Ejecute las pruebas unitarias. Todas deben ser exitosas.

7. Realice los pasos 2 al 6 para cada prueba unitaria que pase por el constructor de dicho objeto.

Este es el objeto ValorDeMercado y sus dos pruebas unitarias:

objetos-11-valordemercado

objetos-10-comonumero_tests

 

Estudie la explicación y los ejemplos completos en el paso 3 de Algoritmos Mantenibles “Con objetos“.

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 )

Conectando a %s