Documentos de Académico
Documentos de Profesional
Documentos de Cultura
• Genéricas
• Herramientas más
fáciles y productivas
• El software es cada
día más complejo
Reingeniería del Software
• ¿Si su software fuera un edificio, se parecería
mas a uno de la izquierda o de la derecha?
Software Sustentable
• Reducir
• Reusar
• Reciclar
• “Código mutante”
• “Diseño roto”
• El código es antiguo y muy grande
• Falta de planeación y documentación
• Caso1:
double calcRngMaxPer() {
.... }
• Caso 2:
double calcularRangoMaximoPermitido() {
....
Ejemplo Renombrar Métodos
• ¿Por qué?
• Cómo puede observarse en algunas
situaciones las recomendaciones de refactoring
pueden ser algo subjetivas.
class CalculoSimple {
public static double CalcularCincunferencia
(double diametro)
{ return 3.14 * diametro; }
}
Ejemplo números mágicos
• ¿Cómo debe de quedar la reestructuración?
class CalculoSimple {
public const double PI = 3.14;
public static double CalcularCincunferencia
(double diametro)
{ return PI * diametro; }
}
• Patrón Singletón
• Problema: se admite exactamente una
instancia de una clase. Los objetos necesitan
un único punto de acceso global.
• Java
– Xrefactory, RefactorIT, jFactor, IntelliJ IDEA
• C++
– CppRefactory, Xrefactory
• C#
– C# Refactoring Tool, C# Refactory
Herramientas de Refactoring
• Los principales IDE’s las contienen de forma
natica
• NetBeans: RefactorIT
• Oracle Jdeveloper: RefactorIT
• Borland Jbuilder: RefactorIT
• Mover (move)
– Mueve de forma segura una clase a otra ubicación
• Copiar (copy)
– Copia una clase a otra ubicación
• Reemplazar
Consejos para Reestructurar
• Cuando pienses que es necesario. No sobre
una base periódica
• int NNOMBREINVALIDO;
• int nNombre_Incorrecto;
Notación de Camello
• Es la utilizada por Java y herramientas afines.
Su uso está creciendo en popularidad mientras
que la notación húngara va en desuso.
La ofuscación permite
ocultar código y en
algunos casos reducir
el tamaño del mismo,
lo cual es muy útil en
lenguajes de script
(HTML por ejemplo)
Remover Asignación Parámetros
Substitución de Algoritmo
Mover Método
• El método de la clase original de preferencia
debe desaparecer o bien hacer referencia al de
la nueva clase.
¿Cómo debe
de quedar
este código
reestructurad
o?
Introducir Aserción
• Malor olor: un código hace un asunción sobre
el estado del programa.
• assert estamos_como_queremos;
Trabajo Trabajo
getTotalPrice
getTotalPrice getUnitPrice
getUnitPrice
getEmployee
Labor
getUnitPrice
getEmployee
Extract Subclass
• Motivación: El principal motivo para utilizar esta
refactorización, es que una clase tenga
comportamiento que es usado por algunas
instancias de la clase y no se use para el resto.
Empleado
Empleado
Vendedor
Colapse Hierarchy
• Motivación: Refactorizar una jerarquía a
menudo involucra subir métodos y campos, así
como bajar la jerarquía en cuanto a niveles.
• Compilar y probar
Patrón Estado
• State es un patrón que resuelve la problemática
de que el comportamiento de un objeto
depende de su estado, y sus métodos
contienen la lógica de casos que reflejan las
acciones condicionales dependiendo del
estado.
class Person...
static Person createMale(){
Factory Pattern
return new Male();}
static Person createFemale() {
return new Female();}
• Se realizan pruebas.
Depuración
• Se corrigen los errores y se vuelven a hacer
pruebas.
• Datos
• Declaración de datos
• Errores computacionales
• Errores de comparación
Guía Prueba de Programas
• Errores de control de flujo
• Errores de Interface
• Errores de Entrada/Salida
• Planeación y requerimientos
• Entregas pequeñas e incrementales
• Metáforas de Sistemas
• Diseños simples
• Pruebas continuas
• Refactorización
XP eXtreme Programming
• Programación en pares
• Propiedad colectiva del código
• Integración Continua
• Semanas de 40 horas
• Clientes como miembros del equipo
• Codificar con estándares
Extreme Testing
• Las programación extrema tienen las siguientes
ventajas en lo que respecta al proceso de
pruebas:
• Por ejemplo:
• Area=0
• ¿Qué pasó?
• Ejemplo:
• //@ ensures \result * \result == y;
Contratos como Documentación
• //@ requires y >= 0;
/*@ ensures -y <= \result
@ && \result <= y
@ && \result * \result <= y
@ && y < (Math.abs(\result) + 1)
@ * (Math.abs(\result) + 1);
@*/
public static int isqrt(int y) {
...
}
JML
• Otro ejemplo:
/*@ also
@ ensures \result != null
@ && (* \result is a display
@ form of this person *);
@*/
Otro ejemplo
public String toString() {
return "Person(\""
+ name + "\","
+ weight + ")";
}