Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Is Reengineering
Is Reengineering
Competencias
Especfica: conoce los trminos bsicos de
la reingeniera de software y aplica tcnicas
de reingeniera para el mejoramiento de
software existente as mismo utiliza
mejores prcticas para el desarrollo de
software.
Genricas
Instrumentales: Capacidad de anlisis y
sntesis, Solucin de problemas, Toma de
decisiones.
Competencias
Interpersonales: Capacidad crtica y
autocrtica, Capacidad de trabajar en
equipo interdisciplinario, Habilidad para
trabajar
en
un
ambiente
laboral,
Compromiso tico.
Sistmicas: Capacidad de aprender,
Capacidad de adaptarse a nuevas
situaciones, Capacidad de generar nuevas
ideas
(creatividad),
Habilidad
para
trabajar
en
forma
autnoma,
Preocupacin por la calidad.
Software Hoy en Da
Mito:
los
programadores de
ahora
ya
no
programan como
los de antes.
Herramientas ms
fciles
y
productivas
El
software
es
cada
da
ms
complejo
Cdigo mutante
Diseo roto
El cdigo es antiguo y muy
grande
Falta
de
planeacin
y
documentacin
Problemticas
Qu malas prcticas de
codificacin tendra un edificio
como el de la izquierda?
Software Sustentable
Reducir
Reusar
Reciclar
80% Desarrollo de Software es para
mantenimiento. Por lo tanto se necesita
de un cdigo simple, legible y bien
diseado para que en un futuro pueda ser
extensible.
Software Hoy en Da
En el pasado las prioridades eran tener
un cdigo rpido, pequeo (ocupa poca
memoria), optimizado, utilizando los
algoritmos mas eficaces etc...
Hoy en da
pero a la
poderosas,
enfoque es
simple.
el software es ms complejo
vez hay herramientas ms
por lo que actualmente el
que este cdigo tiene que ser
Reingeniera
Se origin a finales de la dcada de 1980
aunque se populariz en la dcada de 1990.
La reingeniera es un proceso que trata de dar
respuesta a una interrogante: Estamos acaso
bien
podramos
Ejemplo de Reingeniera
Ingeniera Inversa
Se aplica para obtener un modelo
detallado de anlisis, ingeniera de
requerimientos, diseo y en algunos
casos implementacin teniendo una
solucin, la cual es una actividad
consumidora de tiempo.
Tanto la Ingeniera Inversa como la
Reingeniera en la mayora de las
licencias de Software se encuentran
penadas por la ley.
Ingeniera Inversa
Los archivos ejecutables pueden ser
desemsamblados obteniendo su cdigo
fuente en ensamblador.
Los archivos ejecutables con cdigo
portable
(Java,
.NET)
pueden
ser
desemsamblados para obtener su cdigo
fuente.
Rediseo
Reuso de Software
El reuso es una de las tcnicas de
resolucin de problemas que ms
utilizamos los humanos. De hecho es lo
primero que verifica nuestro cerebro.
El reuso en software nos ayuda a mejorar
la produccin y calidad del software al
no reinventar la rueda.
Desafortunadamente no todo se puede
reutilizar.
Reuso de Software
La reutilizacin es la propiedad de utilizar
conocimiento, procesos, metodologas o
componentes de software ya existente
para adaptarlo a una nueva necesidad,
incrementando
significativamente
la
calidad y productividad del desarrollo.
Para que un objeto pueda ser reusable se
necesita de un alto nivel de abstraccin.
Entre mayor es su nivel de abstraccin,
mayor es su nivel de reuso.
La gran foto
Refactoring
Es modificar el comportamiento interno
(generalmente
cdigo
fuente)
sin
modificar su comportamiento externo
(apariencia, funcionalidad).
Un cambio al sistema que deja su
comportamiento
inalterable
(sin
cambios), pero aumenta alguna cualidad
no
funcional
como
simplicidad,
flexibilidad, comprensin, [Beck, 1999]
Definicin
El trmino se cre como analoga con la
factorizacin de nmeros y polinomios.
Por ejemplo, x 1 puede ser factorizado
como (x + 1)(x 1), revelando una
estructura interna que no era visible
previamente (como las dos races en -1 y
+1)
El libro de Martin Fowler Refactoring es la
referencia clsica (1999).
Qu es esto?
f(z) = sin(x)cos(y)
Otro modelo
Bad Smells
BAD SMELL
PROPUESTO
Algunas
ideas sobre queREFACTORING
reestructura
CODIGO DUPLICADO
EXTRAER EL MTODO
SUBIR VARIABLES
SUSTITUIR EL ALGORITMO
MTODOS LARGOS
EXTRAER EL MTODO
INTRODUCIR OBJETOS COMO PARMETROS
REEMPLAZAR EL MTODO CON UN OBJETO
MTODO
CLASES GRANDES
EXTRAER CLASES
EXTRAER SUBCLASES
CARACTERSTICA DE LA ENVIDIA
MOVER MTODO
CLASES PEREZOSAS
COLAPSAR JERARQUAS
class CalculoSimple {
public static double CalcularCincunferencia
(double diametro)
{ return 3.14 * diametro; }
}
de
quedar
la
class CalculoSimple {
public const double PI = 3.14;
public static double CalcularCincunferencia
(double diametro)
{ return PI * diametro; }
}
En qu lenguaje est este cdigo?
Herramientas de Refactoring
Existen
muchas
herramientas
reestructuracin de cdigos para
principales lenguajes:
Java
C++
CppRefactory, Xrefactory
C#
de
los
Herramientas de Refactoring
Los principales IDEs las contienen de
forma natica
NetBeans: RefactorIT
Oracle Jdeveloper: RefactorIT
Borland Jbuilder: RefactorIT
Eclipse: built-in (propia)
Emacs: Xrefactory
Visual Studio .NET: C# Refactory
Herramientas de Refactoring
Slo soportan refactoring primitivo:
Refactorizacin
de
clases
(Aade
(sub)clases a la jerarqua, renombra, elimina
clases).
Reestructuracin de mtodos (aade a una
clase, renombra, elimina, mueve hacia
abajo, hacia arriba, aade parmetros,
extrae cdigo.
Reestructuracin de variables (aade a una
clase,
renombra,
elimina,
cambia
modificadores, mueve de lugar.
cundo se debe
refactorizar?
Aplicar la Regla de Tres:
1.Para aadir una nueva funcionalidad
2.Cuando se necesita localizar un error
3.Como revisin de cdigo
Prctica
Los resultados
deben de ser:
Prctica
6 es perfecto
19 no es perfecto
28 es perfecto
43 no es perfecto
118 no es perfecto
obtenidos
Prctica
Prctica
import javax.swing.*;
public class programa1 {
public
static
void
main
(String[] args){
int
Num=Integer.parseInt(JOptio
nPane.showInputDialog("Intr
oduce numero"));
int i=1;
int suma=0;
Prctica
while(i<=(Num/2)){
if(Num%i==0){
suma+=i;
i+=1;}
else{
i+=1;}
}
if(Num==suma)
JOptionPane.showMessageDi
alog(null,"El
numero
"+Num+" es un nmero
perfecto");
Prctica
else
JOptionPane.showMessageDial
og(null,"El numero "+Num+"
no es un nmero perfecto");
}}
No tomar en cuenta el mal
sangrado
Prctica
La primera de ellas es la
conjuncin o mezcla de la
lgica de la aplicacin con la
presentacin.
Un objeto debe de realizar
solo las cosas pertinentes al
objeto.
Prctica Refactoring
Para
solucionar
esta
problemtica podemos aplicar
el principio de separacin
de interfaces; para ello,
realizar lo siguiente:
Reestructurar para tener la
siguiente firma de mtodo:
public boolean esPrimo(int n){
Prctica de Refactoring
return true/false
}
En el mtodo main(){}
hacer
las
adecuaciones
necesarias para la lectura de
datos, la invocacin de la
funcionalidad y la impresin
de resultados
Prctica de Refactoring
Cmo
visualizas
la
aplicacin?Crees que aun
se pueda mejorar?
En general tenemos una
pequea
clase
que
implementa la lgica y la
presentacin. Si bien es
cierto que ya est separada
aun est en la misma clase
Prctica de Refactoring
Estndares de Codificacin
Para la reestructuracin de cdigos se
pueden seguir convenciones ya definidas
las ms importantes son la notacin
hngara y la notacin de camello.
La notacin hngara fue creada por
Charles Simonyi de Microsoft, el cual es
hngaro y por eso recibi ese nombre.
Notacin Hngara
Es un mtodo ampliamente usado sobre
todo para convencin de nombres de
variables.
Consiste
en
tener
variables
autodocumentadas agregando un prefijo de
tres caracteres o menos para indicar su
tipo.
Las abreviaturas de los tipos de datos
puede variar dependiendo del lenguaje de
programacin.
Notacin Hngara
Descripcin
Descripcin
Abr
Objeto (parecido
a las
estructuras)
Carcter con
signo
Carcter sin
signo
Manejador
(handler)
Entero
Palabra (entero
sin signo)
Doble palabra
(entero 32 bits)
dw
Largo
Flotante
Doble
Cadena
terminada en /0
sz
Estructura Abc
sA
Abr
o*
Descripcin
Abr
Formulario
frm
Puntero a entero p
de 16 bits
CheckBox
chk
Botn
cmd
Puntero largo
(32 bits)
lp
Imagen
img
Enumeraciones
Etiqueta
lbl
Puntero largo a
una cadena
terminado en
nulo
lpsz
Men
mnu
PictureBox
pic
TextBox
txt
Puntero largo a
una funcin que
devuelve un
entero
lpfn
ComboBox
cbo
Lnea
lin
Notacin Hngara
int nTest;
long lTemp;
char *szString = "Prueba";
struct Rect srRect;
int nMiVariableEjemplo;
char szEjemploString;
int NNOMBREINVALIDO;
int nNombre_Incorrecto;
Notacin de Camello
Es la utilizada por Java y herramientas
afines. Su uso est creciendo en
popularidad mientras que la notacin
hngara va en desuso.
Su principal caracterstica consiste en
que no separa nombres de identificadores
(variables, mtodos, objetos) con _ para
palabras compuestas.
Notacin de Camello
Los identificadores tienen la forma de la
joroba de un camello. No se indican tipos
de datos. Sigue respetando mucho de la
Notacin C.
Los
hay
con
una
Notacin de Camello
Las clases inician con
siguiendo el mismo mtodo.
mayscula
Convenciones de Desarrollo
Algunas compaas como Google proponen
sus propios estndares de codificacin:
http://code.google.com/p/google-styleguide
/
Los lenguajes que maneja son C/C++,
Python, Perl, Objective-C, XML, entre otros.
Estos estndares son manejados en forma
obligatoria para el desarrollo de sus
proyectos.
Pasos en la reestructuracin
Un paso a la vez
Pasos
De
pasos
sencillos
(refactorings)
se
logra
mejorar sustancialmente el
cdigo fuente.
Metodologa
Metodologa
Cuando
se
desarrollo
software utilizando mtodos
giles,
el
tiempo
de
desarrollo se divide en dos:
1.Agregar
funcionalidades
2.Refactorizar
nuevas
Metodologa
Metodologa
Al realizar cambios en el
cdigo, la estructura de
software es modificada y por
lo
tanto
es
necesario
refactorizar.
A continuacin se detalla un
pequeo ejercicio aplicando
el
refactoring
de
Encapsulated Field
Ejercicio
Ejercicio
Declarar
privado.
el
campo
como
Compilar y probar.
Inicialmente
se
siguiente cdigo:
Ejercicio
tiene
el
Ejercicio
Person person;
person.name = Juan Prez;
assertEquals(Juan
Prez,
person.name);
}
Despus se aplica el paso 1
(crear mtodos get y set):
Ejercicio
Ejercicio
Ejercicio
Ejercicio
Ejercicio
Patrn de Diseo
Par Problema-Solucin. Mejores prcticas.
Patrn Singletn
Problema: se admite exactamente una
instancia de una clase. Los objetos
necesitan un nico punto de acceso
global.
Solucin: Defina un mtodo esttico de la
clase que devuelva el Singleton
Singleton
Singleton
public class Singleton {
private static Singleton INSTANCE = null;
private Singleton() {}
private synchronized static Singleton
createInstance() {
if (INSTANCE == null){
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Patrn MVC
Antipatrones de Diseo
Antipatrn es un patrn de diseo que
invariablemente conduce a una mala
solucin para un problema.
Al
documentarse
los
antipatrones,
adems de los patrones de diseo, se dan
argumentos a los diseadores de
sistemas para no escoger malos caminos,
partiendo de documentacin disponible
en lugar de simplemente la intuicin.
Antipatrones de Diseo
El estudio de los antipatrones es muy til
porque sirve para no escoger malos
caminos en el desarrollo de sistemas,
teniendo para ello una base documental y
as evitar usar simplemente la intuicin.
Adems proporciona una denominacin
comn a problemas que facilita la
comunicacin
entre
diferentes
desarrolladores.
Antipatrn BLOB
Mejor
conocido
como
objeto
todopoderoso. Se presenta cuando una
clase es muy grande tanto en atributos
y/o en mtodos.
Entre ms grande son las clases es ms
difciles de mantener, reusar y probar. Su
gran tamao puede perjudicar el tiempo
de carga. Generalmente son el resultado
de un mal diseo o de sistemas legados.
Antipatrn BLOB
Antipatrn BLOB
Antipatrn BLOB
Ofuscacin
La ofuscacin
permite ocultar
cdigo y en algunos
casos reducir el
tamao del mismo,
lo cual es muy til
en lenguajes de
script (HTML por
ejemplo)
Tc, de Ofuscacin
Tec. de Ofuscacin
Arreglos
Tec. de Ofuscacin
Tec. de Ofuscacion
Clases
Tec de Ofuscacin
Variables
Tec. de Ofuscacin
Variables
Tec. de Ofuscacin
Tec. de Ofuscacin
Tec. Ofuscacin
Paralelizacin
Tec. de Ofuscacin
Paralelizacin
Tec. de Ofuscacin
Paralelizacin
Tec. de Ofuscacin
Ciclos
Tec. de Ofuscacin
Ciclos
Tc. De Ofuscacin
Lo ms adecuado es realizar
la ofuscacin sobre el cdigo
objeto generado sin alterar
el original.
Existen ofuscadores como
proguard, yguard que son
libres o comerciales como
Dasho o KlassMaster
Substitucin de Algoritmo
Sintactic Sugar
Azcar Sintctico
Es
una
facilidad
dada
por
los
desarrolladores del lenguaje para escribir
menos. El ejemplo ms sencillo es el
operador ++, C++ es equivalente a
C=C+1
Ciclo for (implementacin while)
Azcar Sintctico
IF como operador ternario ?:
Goto en java, etiquetas:
public static void imprimir(String
cadenas){
for(String cadena:cadenas)
System.out.println(cadena);}}
...
Azcar Sintctico
Boxing automtico de Datos Primitivos a
Objetos: Integer a int
Anotaciones: @deprecated
Arreglos Triangulares
Uso de objetos y mtodos Thread-safe
Referencias
Roger S. Pressman, Ingeniera de software
un enfoque prctico.Ed. McGraw Hill.
Preguntas?