Introducir un método externo.
Una clase de utilidad no contiene el método que necesitas y no puedes añadirlo a la clase.
Añade el método a una clase cliente y pásale como argumento un objeto de la clase de utilidad.
##Example
class Report {
// ...
void sendReport() {
Date nextDay = new Date(previousEnd.getYear(),
previousEnd.getMonth(), previousEnd.getDate() + 1);
// ...
}
}class Report {
// ...
void sendReport() {
Date newStart = nextDay(previousEnd);
// ...
}
private static Date nextDay(Date arg) {
return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
}
}##Why Refactor
Tienes código que usa los datos y los métodos de cierta clase. Te das cuenta de que el código quedaría y funcionaría mucho mejor dentro de un nuevo método de la clase. Pero no puedes añadir el método a la clase porque, por ejemplo, la clase se encuentra en una biblioteca de terceros.
Esta refactorización tiene un gran beneficio cuando el código que quieres mover al método se repite varias veces en diferentes lugares de tu programa.
Como estás pasando un objeto de la clase de utilidad a los parámetros del nuevo método, tienes acceso a todos sus campos. Dentro del método puedes hacer prácticamente todo lo que quieras, como si el método formara parte de la clase de utilidad.
##Benefits
- Elimina la duplicación de código. Si tu código se repite en varios lugares, puedes sustituir esos fragmentos por una llamada al método. Esto es mejor que la duplicación, incluso teniendo en cuenta que el método externo se encuentra en un lugar subóptimo.
##How to Refactor
-
Crea un nuevo método en la clase cliente.
-
En este método, crea un parámetro al que se le pasará el objeto de la clase de utilidad. Si ese objeto puede obtenerse desde la clase cliente, no hace falta crear dicho parámetro.
-
Extrae los fragmentos de código relevantes a este método y sustitúyelos por llamadas al método.
-
Asegúrate de dejar la etiqueta Método externo en los comentarios del método, junto con la recomendación de colocar este método en una clase de utilidad si más adelante resulta posible. Esto facilitará entender por qué este método se encuentra en esta clase en particular a quienes mantengan el software en el futuro.