Tabla de Contenidos

Refactorizacion

El término refactorizar dentro del campo de la Ingeniería del Software hace referencia a la modificación del código sin cambiar su funcionamiento. Se emplea para crear un código más claro y sencillo, facilitando la posterior lectura o revision de un programa. Se podría entender como el mantenimiento del código, para facilitar su comprensión, pero sin añadir ni eliminar funcionalidades. Refactorizar código consiste en crear un código más limpio.

La refactorización debe ser un paso aislado en el diseño de un programa, para evitar introducir errores de código al reescribir o modificar algunas partes del mismo. Si después de refactorizar hemos alterado el funcionamiento del código, hemos cometido errores al refactorizar.

Se refactoriza para:

Los siguientes apartados están inevitablemente relacionados entre si, ya que todas las técnicas o reglas persiguen el mismo fin.

Convenciones de escritura de Java

Las convenciones de código existen debido a que la mayoría del coste del código de un programa se usa en su mantenimiento, (casi ningún programa se mantiene toda su vida con el código original), y mejoran la lectura del código permitiendo entender código nuevo mucho más rápido y a fondo. En la web de Sun Microsystems se recogen dichas convenciones en una guía en ingles, o una traducción al castellano cortesía de javaHispano. Por su parte Google también ha creado recientemente una Guía de estilo para Java.

Para que las convenciones funcionen, cada programador debe tratar de ser lo más fiel posible a estas.

Ficheros

Todos los ficheros fuente de java son ficheros de texto plano cuyo nombre termina con la extensión .java Dentro de cada fichero .java tenemos 4 partes en el siguiente orden:

  1. Posibles comentarios sobre la clase (autor, fecha, licencias, etc)
  2. Sentencia package. Toda clase debe estar en un paquete.
  3. Sentencias import. Importar cada clase en una linea separada.
  4. La definición de una única clase o interface cuyo nombre es idéntico al nombre del fichero sin la extensión.
/* Correcto */                        /* Incorrecto */
import java.awt.Frame;                import java.awt.*;
import java.awt.Graphics;

Posteriormente dentro de la definición de la clase, aplicamos el siguiente orden:

  1. Sentencia class o interface
  2. Variables de clase (static)
  3. Variables de instancia (Atributos de la clase)
  4. Constructores (Si hay sobrecarga deben ir seguidos)
  5. Métodos (Si hay sobrecarga deben ir seguidos)

Declaraciones de variables

int edad;
int cantidad;  
int[] array = 
{
 0, 1, 2, 3 
};
// ó
int[] array = { 0, 1, 2, 3 };  
String[] nombres; //correcto
String nombres[]; //incorrecto

Nombres de identificadores

Para los identificadores podemos usar las letras anglosajonas y números de la tabla ASCII. No se debe usar caracteres con tilde ni la (ñ). Las barras bajas o guiones tampoco se usan. Los nombres de los identificadores deben ser siempre lo más descriptivos posible, ya sea variable, método o clase. Solo se usan identificadores de un solo carácter para representar los contadores del bucle for, y comienzan en la letra i.

Magic Numbers

Se conoce bajo este nombre a cualquier valor literal (“texto” o numérico) empleado en el código sin ninguna explicación. Se deben sustituir siempre que se pueda por una constante que identifique su finalidad.

//incorrecto
int precioConIva = precioBase + (0.21 * precioBase); 
 
//correcto
//Se define en la clase
final static double IVA = 0.21; 
//Se utiliza en un método
int precioConIva = precioBase + (IVA * precioBase); 

Estructura del código

if (final < indice) {
    filaInicial = indice – numeroFilas;
} else if (indice < filaInicial) {
    filaInicial = indice;
}
public void ejecutarAccion(
    TipoParametro parametro1, TipoParametro parametro2, TipoParametro parametro3){
...
}
 
if ((condicion1 && condicion2)
      || (condicion3 && condicion4)
      || !(condicion5 && condicion6)) {
  llamarMetodo();
}
 
longName1 = longName2 * (longName3 + longName4 - longName5)
+ (4 * longname6);            //Siempre con el operador al principio de línea
cantidadTotal = cantidadInicial + cantidadFinal;
 
for(int i = 0; i < cantidadTotal; i++){
...
}
 
public String getItem(int fila, int columna) {
...
} 
 
getItem(cantidadInicial, cantidadFinal);

Debemos estar familiarizados y poner en práctica las convenciones recogidas en alguna de las guías de estilo indicadas.

Bad Smells

Se conoce como Bad Smell o Code Smell (mal olor) 1) a algunos indicadores o sintomas del código que posiblemente ocultan un problema más profundo. Los bad smells no son errores de código (bugs), ya que no impiden que el programa funcione correctamente, pero son indicadores de fallos en el diseño del código que dificultan el posterior mantenimiento del mismo y aumentan el riesgo de errores futuros. Algunos de estos síntomas son:

En la siguiente página web tenemos la mayoría de Bad Smells agrupados en 5 tipos.

Buenas prácticas

//instanciación lenta
String lenta = new String("objeto string");
 
//instanciación rápida
String rapida = "objeto string";
int x = 10;
int y = 10;
 
Integer x1 = new Integer(10);
Integer y1 = new Integer(10);
 
String x2="hola";
String y2 = new String("hola");
 
System.out.println(x == y);    //TRUE 
System.out.println(x1 == y1);  //FALSE, ya que son 2 objetos distintos
System.out.println(x2 == y2);  //FALSE, ya que son 2 objetos distintos
...
int resultadoTotal = resultadoInicial - resultadoFinal;
...

Refactorización de Eclipse

Eclipse tiene distintos métodos de refactorización. Dependiendo de sobre qué mostremos el menú de refactorización, nos ofrecerá unas u otras opciones. Para refactorizar pulsaremos click derecho sobre el nombre del elemento deseado, y deplegaremos la opción Refactor del menu contextual.

Los métodos de refactorización, también llamados patrones de refactorización, nos permiten plantear casos y previsualizar las posibles soluciones que se nos ofrecen. Podemos seleccionar diferentes elementos para mostrar su menú de refactorización ( una clase, una variable, método, bloque de instrucciones, expresion, etc ). A continuación se muestras algunos de los métodos más comunes:

File fichero = new File("datos.dat");
PrintWriter escritor;
escritor = new PrintWriter(fichero);
PrintWriter escritor = new PrintWriter(new File("datos.dat"));

Eclipse también nos permite ver un histórico de la refactorización que se ha hecho en un proyecto, abriendo el menu Refactor → History.


Prácticas

  1. Refactorización de código Java (Prueba práctica)

© 2025 Fernando Valdeón