Mar 3, 2011

Eliminando el código duplicado - Primera parte

Como en cualquier otra historia que se respete, el cuento comienza con una clase bien simple llamada "Person". Para completar el ejercicio, construiremos esta clase, luego crearemos dos instancias de la misma, y por último imprimiremos la información de cada uno de los objetos. Veamos a nuestra protagonista:
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
Ahora creemos dos instancias de esta clase con la información que queremos imprimir en nuestra clase principal:
class Program
{
    static void Main()
    {
        var person1 = new Person { Name = "Santiago", Age = 30 };
        var person2 = new Person { Name = "Yasmin", Age = 30 };
    }
}
Nuestro ejemplo, está casi completo, solo queda imprimir la información por pantalla de cada una de las personas que creamos anteriormente. Veamos cómo quedaría el código para imprimir el primer objeto:

static void Main()
{
    var person1 = new Person { Name = "Santiago", Age = 30 };

    Console.WriteLine("Datos Personales:");
    Console.WriteLine("*****************");
    Console.WriteLine("Nombre: " + person1.Name);
    Console.WriteLine("Edad: " + person1.Age);
    
    var person2 = new Person { Name = "Yasmin", Age = 30 };
}
Para imprimir los datos del segundo ejemplo, solamente trendíamos que duplicar el mismo código cambiando solamente el nombre de la instancia que deseamos imprimir:
static void Main()
{
    var person1 = new Person { Name = "Santiago", Age = 30 };

    Console.WriteLine("Datos Personales:");
    Console.WriteLine("*****************");
    Console.WriteLine("Nombre: " + person1.Name);
    Console.WriteLine("Edad: " + person1.Age);
    
    var person2 = new Person { Name = "Yasmin", Age = 30 };

    Console.WriteLine("Datos Personales:");
    Console.WriteLine("*****************");
    Console.WriteLine("Nombre: " + person2.Name);
    Console.WriteLine("Edad: " + person2.Age);
}
Ejercicio completado. Solo un detalle: si lo dejamos hasta aquí iremos a prisión 4 años por nuestra irresponsabilidad de duplicar todo el código encargado de imprimir las propiedades de los objetos por pantalla. Si ustedes aprecian la libertad tanto como yo, mejor tomarse unos segundos para hacer el trabajo correctamente.

Eliminando el código duplicado

Empecemos por analizar cuáles líneas están completamente repetidas en ambos lugares. No hay que ser un visionario para llegar a la conclusión de que es el código relacionado con imprimir el encabezamiento de los datos de cada persona:
Console.WriteLine("Datos Personales:");
Console.WriteLine("*****************");
Para reutilizar estas líneas, el primer paso será crear un nuevo método que las contenga. En este caso voy a llamar al nuevo método "Print":
void Print() 
{
    Console.WriteLine("Datos Personales:");
    Console.WriteLine("*****************");
}
Ahora podremos sustituir estas líneas en el código original por una llamada a "Print":
static void Main()
{
    var person1 = new Person { Name = "Santiago", Age = 30 };

    Print(); 
    Console.WriteLine("Nombre: " + person1.Name);
    Console.WriteLine("Edad: " + person1.Age);
    
    var person2 = new Person { Name = "Yasmin", Age = 30 };

    Print();
    Console.WriteLine("Nombre: " + person2.Name);
    Console.WriteLine("Edad: " + person2.Age);
}
Obviamente, el problema no se ha resuelto completamente ya que el código que específicamente imprime los valores de las propiedades de los objetos está repetido también. El detalle es que en este caso el código no es 100% igual, ya que utiliza el nombre de objetos diferentes en cada aparición, por lo que no podemos simplemente moverlo y reutilizarlo como hicimos con el encabezado.

Veamos el código línea por línea para determinar en qué se diferencian exactamente:
Console.WriteLine("Nombre: " + person1.Name);
Console.WriteLine("Nombre: " + person2.Name);

Console.WriteLine("Edad: " + person1.Age);
Console.WriteLine("Edad: " + person2.Age);
El único punto diferente es el objeto del cual se imprime la información, pero el resto es exactamente igual. Para resolver este problema, tendremos que construir nuestro método "Print" de forma tal que podamos especificarle de cuál objeto queremos imprimir la información:
void Print(Person person) 
{
    Console.WriteLine("Datos Personales:");
    Console.WriteLine("*****************");
}
Luego de adicionar el argumento que necesitamos, podemos copiar el código repetido cambiando el nombre del objeto por el nuevo parámetro:
void Print(Person person) 
{
    Console.WriteLine("Datos Personales:");
    Console.WriteLine("*****************");

    Console.WriteLine("Nombre: " + person.Name);
    Console.WriteLine("Edad: " + person.Age);
}
Obviamente, no podemos olvidar eliminar las líneas que quedaban duplicadas, ya que ahora están concentradas como es debido dentro de nuestro método "Print":
static void Main()
{
    var person1 = new Person { Name = "Santiago", Age = 30 };
    Print(person1); 
    
    var person2 = new Person { Name = "Yasmin", Age = 30 };
    Print(person2);
}
Por último, y antes del "¡ya terminé!", un pequeño detalle añadido para que todos podamos dormir tranquilos con el sentimiento del deber cumplido: las variables "person1" y "person2" son utilizadas solamente en la llamada del método "Print", por lo que podemos eliminarlas completamente:
static void Main()
{
    Print(new Person { Name = "Santiago", Age = 30 }); 
    Print(new Person { Name = "Yasmin", Age = 30 });
}
Yo no sé ustedes, pero al menos a mí me encanta el resultado final: limpio y consistente. Por muy simple que parezca todo lo anterior, es increíble cuántas personas lo olvidan y dejan simplemente el espaguetis formado. Si no somos capaces de corregir detalles aparentemente sencillos, ¿cómo pretender lograr una buena calidad en proyectos mucho más complicados?

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.