La refactorización consiste en la modificación del código fuente sin cambiar su comportamiento, lo que se conoce informalmente por limpiar el código.
No arregla errores ni añade funcionalidad. Veamos algún ejemplo.
Objetivos pretendidos aplicados a la clase refactorizada.
1. Mejorar la facilidad de comprensión del código.
a. Generalmente se consigue minimizando la ofuscación de código.
b. Mediante el empleo de notación húngara.
La notación húngara es un sistema usado normalmente para crear los nombres de variables y expresiones. También se utiliza para nombrar las instancias de objetos en lenguajes de programación visuales, como por ejemplo Visual Basic
Consiste en prefijos en minúsculas que se añaden a los nombres de las variables, y que indican su tipo.
c.Comentando los trozos de código que requieren mayor comprensión.
2. Cambiar su estructura y diseño si fuese necesario.
3. Eliminar código muerto ó innecesario.
4. Facilitar su mantenimiento en el futuro.
La clase Agenda es un clase en C# sencilla, muestra una serie de métodos para mostrar nombres. Luego existe el programa donde se llama. Vamos a intentar mejorar mediante la refactorización la clase Agenda.
Clase sencilla sin refactorizar.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Clases { public class Agenda { float version = 1.0f; public string N; private int S; public void DameTuNombre() { if (Version == 1.0f) { Console.WriteLine("¿ Cual es tu nombre ?"); N = Console.ReadLine(); } } public void DameTuNombre(string nombre) { Nombre = nombre; } public string DameTu(string algo) { Console.WriteLine("Escribe tu {0,0:s}", algo); N = Console.ReadLine(); return Nombre; } private float Version() { return version; } } // Programa donde se crea el objeto que usa la clase class Program { static void Main(string[] args) { int n = 3; string cadena = "mi cadena"; Agenda A = new Agenda (); A.Nombre = "oscar"; A.DameTuNombre(); A.DameTuNombre("Pepito"); cadena=A.DameTu("el nombre de tu abuela"); Console.WriteLine("Hola Mundo..." ,cadena); Console.ReadLine(); } } } |
Esto corresponde con la clase refactorizada.
// Espacios de nombre empleados, comentarios adecuados, eliminar ofuscación using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Clases { public class Agenda { // Empleo de notación húngara F(tipo de dato)_V mayusculas. //Propiedades float F_Version = 1.0f; private string S_Nombre; private int I_Sexo; // Correcta indentación del codigo, estructuración de ámbitos para favorecer la lectura public void DameTuNombre() { if (F_Version == 1.0f) { Console.WriteLine("¿ Cual es tu nombre ?"); N = Console.ReadLine(); } } public void DameTuNombre(string nombre) { Nombre = nombre; } // Variables más sencillas de entender. public string DameTu(string S_TextoEntrada) { Console.WriteLine("Escribe tu {0,0:s}", S_TextoEntrada); Nombre = Console.ReadLine(); return Nombre; } private float Version() { return version; } public void Set_Nombre(string S_ElNombre) { this.nombre=S_ElNombre; } } //Separación de métodos adecuada. // Programa donde se llama a la clase se ha eliminado el acceso a A.nombre como publico y // se ha creado uno privado, principio de data hiding u ocultación de la información. class Program { static void Main(string[] args) { int n = 3; string cadena = "mi cadena"; //Se entiende mejor el nombre del objeto. Agenda Objeto_Agenda = new Agenda (); Obj_Agenda.Nombre = "oscar"; //no se debe emplear. Obj_Agenda.Set_Nombre(“Oscar”); //Empleo correcto Obj_Agenda.DameTuNombre(); Obj_Agenda.DameTuNombre("Pepito"); cadena=Obj_Agenda.DameTu("el nombre de tu abuela"); Console.WriteLine("Hola Mundo..." ,cadena); Console.ReadLine(); //Elimino el codigo inecesario. } } } |
En resumen, realmente después de la refactorización la clase debe comportarse de igual forma, pero mejorando su estructura, legibilidad y limpieza de ejecución.