Mejorando el diseño del código existente

Slides:



Advertisements
Presentaciones similares
MOVIMIENTO JOVENES DE LA CALLE CIUDAD DE GUATEMALA chi siamo quienes-somos qui sommes-nous who we are attività actividades activités activities scuola.
Advertisements

SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR
1 Datos sobre webloggers Datos extraidos de la encuesta a webloggers disponibles en la web de los autores.
DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
50 formas de decir “Te Amo”.
1 LA UTILIZACION DE LAS TIC EN LAS MICROEMPRESAS GALLEGAS. AÑO mayo 2005.
1 INFORME RESUMEN SOBRE EL NIVEL DE UTILIZACION DE LAS TIC EN LAS EMPRESAS GALLEGAS ( Resumen PYMES ) Noviembre de 2004.
AYUDA A LA FUNCIÓN DOCENTE Internet
TEMA 2 MÚLTIPLOS Y DIVISORES
02- Plan Organización Docente v.2 Noviembre 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
02- PLAN DOCENTE Febrero 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
01- OFERTA FORMATIVA v.2 Noviembre 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
Respuestas Buscando a Nemo.
ABECEDARIO FIGURAS GEOMÉTRICAS NÚMERO
Clase 16 Jairo y su hija. La mujer con flujo de sangre. Dos ciegos.
Fundamentos de Diseño de Software INFT.1
Leo Marthe x 2123 COMMANDperformance Leo Marthe x 2123.
Pruebas de Diseño Diplomado en Calidad en el Software NOTAS
© 2007 Cisco Systems, Inc. All rights reserved. Traducido en apoyo a la capacitación de Instructores de la Red Proydesa Comunicación por la red Fundamentos.
CLASE 3 SOFTWARE DEL MICROPROCESADOR
Unidad de competencia II Estadística descriptiva:
MOVIMIENTO JOVENES DE LA CALLE CIUDAD DE GUATEMALA chi siamo quienes-somos qui sommes-nous who we are attività actividades activités activities alimentazione.
Montículos Daniel González Pérez Cristina Sánchez Aragón
1. Apoyo exterior sobre ala inferior de viga de acero
Distribuciones de probabilidad bidimensionales o conjuntas
Estrategias en el aula con alumnos con problemas de atención y comportamiento Curso Actividad formativa: Seminario CRA “Entreviñas” - Fuensaldaña.
Campus virtual Autoevaluaciones Teletutorías Salas de estudio Clases en línea Contratos didácticos Proyecto E.D.U.F. Universidad Universidad.
1 Reporte Componente Impacto Por Orden Territorial Por Departamento No Disponible ND *Los indicadores para el año 2008 no fueron calculados.
Banco Río, siempre pensando en su comodidad, ha diseñado el Cajero Auto Bank, para servirlo cómodamente a su auto, así, apreciado cliente, tiene la posibilidad.
Funciones Excel. Parte 1. Introducción 2 Una función Excel es una fórmula o un procedimiento que se realiza en el ambiente de Visual Basic, fuera de.
Phone2Wave-Server Manual de Operación.
Resolución de Problemas
50 principios La Agenda 1.- Presentar un único interlocutor a los clientes. 2.- Tratar de modo distinto a las diferentes clases de clientes. 3.- Saber.
Parte 3. Descripción del código de una función 1.
Rosemary Torrico Bascopé
Introducción a los Números Fraccionarios
EL OSO APRENDIZ Y SUS AMIGOS
1 SEGUNDO FORO REGIONAL HERMOSILLO, SON Sistema Nacional de Transparencia Fiscalización y Rendición de Cuentas:
50 principios 1. Los clientes asumen el mando.
1 PROYECTO DE PRESUPUESTO DE EGRESOS DE LA FEDERACION 2002 COORDINACIÓN DE POLITICA ECONOMICA GP-PRD.
Lección 1 Introducción a la POO
Ecuaciones Cuadráticas
Kpmg. El comercio electrónico y sus incertidumbres Resultado de la encuesta sobre
Tema 8 La tecnología.
La minimización de los costes
¡Primero mira fijo a la bruja!
INFORMATICA I Arreglos 1 CLASE 17.
¿Qué es un conjunto? Un conjunto es una colección de objetos considerada como un todo. Los objetos de un conjunto son llamados elementos o miembros del.
La transformada de Laplace
Programación Orientada a Objetos en Java
BEATRIZ LAFONT VILLODRE
Módulo 2: Condiciones Generales de Trabajo
MSc. Lucía Osuna Wendehake
Calendario 2009 “Imágenes variadas” Venezuela Elaborado por: MSc. Lucía Osuna Wendehake psicopedagogiaconlucia.com Enero 2009.
PUNTO Puntos de encuentro en Salud Mental. LA ASOCIACIÓN HIZO SU ACTO DE PRESENTACIÓN EL 14 DE MAYO DEL 2010 EN EL ATENEO DE CHESTE. A PUNTO. Asociación.
Señales y sistemas de tiempo discreto
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Estructuras de control
Manual de Procedimientos Procedimiento de ejecución del programa de
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
Indicaciones: 1.- Tener en cuenta que esta estrategia, solo funciona asociando las cuentas los días lunes. 2.- Los cálculos son aproximados con un margen.
Herramienta FRAX Expositor: Boris Inturias.
CHAPTER 4 VOCABULARY: PART II
 2003 Prentice Hall, Inc. All rights reserved. 1 Capítulo 6: Clases y Abstracción de Datos Índice del capítulo 6.1 Introducción 6.2 Estructuras 6.3 Clases.
FUNDAMENTOS DE CALIDAD EN LA GESTIÓN PÚBLICA
Simulacion de sistemas dinamicos
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Software Reengineering Juan Carlos Olivares Rojas MSN:
Material de apoyo Unidad 4 Estructura de datos
Transcripción de la presentación:

Mejorando el diseño del código existente Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados.

¿Si su software fuera un edificio, se parecería mas a uno de la izquierda o de la derecha?

Refactorización Cambios

¿Cómo podríamos describir este software? Este software padece: “Código mutante” “Diseño roto” Mas antiguo el código y mas grande, estos síntomas son mas evidentes

¿Porque nuestro software sufre degeneración? Hay que cumplir con la fecha de entrega comprometida, es LA PRIORIDAD NUMERO UNO!

... !Es un circulo vicioso¡ Difícil de hacer una estimación confiable Difícil de cumplir con lo planeado Aparecen los “bugs” etc. Difícil de solucionar los “bugs” Aparecen “Expertos” o “Dueños” de código !Es un circulo vicioso¡ El proyecto adquiere “deuda tecnologica”

¿Porque pasa esto? Software es complejo Hay diferentes modos de manejar la complejidad: proceso, encapsulación, componentes, los “frameworks”, reutilización etc. Sin embargo, hay que empezar manejando complejidad en el nivel de código.

Antes, nuestras prioridades eran tener un código rápido, pequeño (ocupa poca memoria), optimizado, utilizando los algoritmos mas eficaces etc... Hoy en día el enfoque es en código como tal, este código tiene que ser simple

¿Cómo es un código simple? Funciona bien Comunica lo que esta haciendo No tiene duplicación Tiene un numero menos posible de clases y métodos

¿Cuales son los beneficios? El código es mas fácil de cambiar, evolucionar o arreglar Es mas fácil desarrollar de un modo iterativo e incrementando El código es mas fácil de leer (entender) Es mas fácil hacerlo bien desde la primera, asi estamos programando mas rápido

¿Cómo en esto nos puede apoyar la Refactorización? Refactorizar significa cambiar el código internamente sin alterar su funcionalidad externa. En general, con motivos de mejorar el diseño y obtener un código mas simple. Refactorización enseña tecnicas para descubrir el código de mala calidad y tecnicas para cambiarlo.

Identificar puntos débiles de código Es difícil definir si código es malo o bueno, o cuando deberíamos cambiarlo Difícil de imponer las métricas Por eso estamos hablando de los “Olores malos” en el código (“Bad Smells” - Kent Beck)

Código duplicado ¡Olor No. 1! Cierto Código tiene que estar en un lugar y en ningun otro más Ha que eliminar el código duplicado, tecnicas: Extraer método ,Extraer método + Subir Campo (clases hermanas), Extraer Clase (clases no relacionadas)

Métodos largos Programas con métodos mas cortos, tienen vida mas larga métodos cortos traen beneficios de indirección: Compartir logica, Intento claro, Cambio Aislado Comentarios son muchas veces indicadores de distancia semantica, podemos reemplazar comentario con método cuyo nombre tiene mismo significado.

Clase grande La clase esta haciendo demaciado “Extraer Clase”, “Extraer Subclase” Hay que empezar eliminando código duplicado y podemos terminar sin necesidad de extraer clase

Lista de parámetros larga No siempre hay que pasar toda la información al método, a veces podemos preguntar otro objeto

Cambio divergente Una clase propensa a cambios por motivos diversos “Extraer Clase”

Cirugía de la escopeta Opuesto al Cambio divergente – un tipo de cambio requiere muchas (pequeñas) modificaciones a clases diversas “Mover método” , “Mover campo”, “Alinear Clase”

Envidia de las funcionalidades métodos de una clase mas interesados en datos de otra clase que en los datos suyos Muchas llamadas a propiedades de otra clase “Mover método” Algunos patrones van en contra de esta regla: “Estrategia” y “Visitante”

Los “Switch” Lo tipico de un software Orientado a Objetos es el uso minimo de los “switch”(o case, o switch escondido). El problema es la duplicación, el mismo “switch” en lugares diferentes Terminar con “Reemplazar Condicional con Polimorfismo”

Obsesión con los primitivos Los tipos primitivos son “ladrillos” de software En un lenguaje OO es facil crear un tipo que no se diferencia de otro que nos provee la plataforma “Reemplazar Valor del Dato con Objeto”, “Reemplazar Codigo de Tipo con Enum”

Comentarios “Comentarios mienten, el código no” No pueden reemplazar falta de código mal escrito Despues de una refactorización meticulosa, lo mas probable que los comentarios sean inecesarios “Renombrar método”

Hay mas ... “Grupos de datos” “Jerarquias de herencia paralelas” “Cadenas de mensajes” “Intimidad inapropiada” “Intermediario” “Legado rechazado” “Generalización especulada” Etc...

Las Refactorizaciones Técnicas detalladas de transformaciones del código Formato común: Motivación, Mecanismo y Ejemplo Pueden ser en nivel de un objeto, entre dos objetos, entre grupos de objetos y en escala grande

Extraer método Tenemos un fragmento de código que es posible agrupar Vamos a transformar el fragmento a un método nuevo cuyo nombre va a explicar su proposito

Código void imprimirDebe() { imprimirEncabezado(); //print details Console.Out.WriteLine("Nombre: " + nombre); Console.Out.WriteLine("Monto: " + debe()); } void imprimirDebe() { imprimirEncabezado(); imprimirDetalle(debe()); } void imprimirDetalle(double valor) { Console.Out.WriteLine("Nombre: " + nombre); Console.Out.WriteLine("Monto: " + valor);

Variable Temporal en línea Motivación: Variable temporal dificulta aplicar el “Extraer método” Variable temporal fue asignada una vez con una simple expresión Vamos a reemplazar todas las referencias con la expresión

Código double precioBase = pedido.precioBase(); return (precioBase > 1000); return(pedido.precioBase()>1000);

Reemplazar Temporal con la consulta Una de refactorizaciones vitales antes de “Extraer método” Variable temporal esta guardando resultado de una expresión. Extraer la expresión en un método. Remplazar todas las referencias de la variable con el método.

Código double precioBase = cantidad * valorItem; if(precioBase > 1000) return precioBase * 0.95; else return precioBase * 0.98; if(precioBase() > 1000) return precioBase() * 0.95; else return precioBase() * 0.98; double precioBase(){ return cantidad * valorItem;}

Reemplazar método con “Método-Objeto” Es un método largo pero es difícil aplicar “Extraer método” por modo en que se utilizan variables locales El método se transforma en un objeto de tal modo que todas las variables locales sean campos del mismo, constructor recibe objeto y parametros originales, se copia el método original con nombre calcular() y se procede a refactorizar ¡Ahora es facil aplicar “Extrer método”!

Código class Pedido{ double precio(int numeroItems){ double precioBasePrimario; double precioBaseSecundario; int valorX = numeroItems * delta(); //computo largo... } return new CalculaPrecio(this, numeroItems).calcular();

Mover método y Mover Campo Dos refactorizaciónes esenciales ¿Donde pertenecen las responsabilidades? El método se ocupa mas por la otra clase o bien utiliza mas la otra clase A veces es más facil mover un grupo de métodos y campos juntos

Ejemplo

Reemplazar Numero Magico con Constante Simbolica Un literal tiene significado especial Una de las enfermedades mas antiguas en computación Si en un momento hay que cambiar el numero, el esfuerzo necesario puede ser enorme Código difícil de leer

Código double energiaPotencial(double masa, double altura){ return masa * 9.81 * altura; } double energiaPotencial(double masa, double altura){ return masa * INTENSIDAD_DE_GRAVEDAD * altura; } static const double INTENSIDAD_DE_GRAVEDAD = 9.81;

Extraer Clase Una clase haciendo trabajo de dos Crear nueva clase y separar las responsabilidades Clase antigua delega trabajo a la nueva o la nueva clase esta expuesta al cliente ¿Debería estar la clase nueva expuesta a los clientes?

Ejemplo

Alinear Clase Clase no esta haciendo mucho Inverso al “Extraer Clase”

Hay mucho mas... “Duplicar datos obervados” (MVC) “Encapsular colección” “Reemplazar código de tipo con enumeración” “Reemplazar código de tipo con subclase” “Reemplazar código de tipo con Estado/ Estrategia”

... “Descomponer condicional” “Reemplazar condicional con polimorfismo” “Introducir Objeto Nulo” “Reemplazar método constructor con la factoría” “Reemplazar código de error con la Excepción” “Subir Método” “Subir Campo”

... “Bajar método” “Bajar campo” “Extraer subclase” “Extraer Interfaz “Separar dominio de presentación” “Convertir diseño estructurado a objetos” “Extrer jerarquía” ...

¿Como y cuando refactorizar? Hay que refactorizar cuando: Estamos agregando una función Estamos solucionando un “bug” Estamos haciendo revisión de código

... Es necesario tener un arnés de pruebas en plazo Se refactoriza paso a paso: refactorización minima, ejecución de pruebas Herramientas para crear y ejecutar pruebas unitarias: Nunit y CSUnit etc Es mas rápido refactorizar utilizando algunas herramientas de refactorización: Flywheel, C# Refactory etc. Proxima versión de Visual Studio (“Whidbey”) va a apoyar ciertas refactorizaciones en C#

Visual Studio “Whidbey”

¿Cuándo no deberíamos refactorizar? Es mas facil hacerlo de nuevo Una señal importante: El código no funciona Demasiado cerca de la fecha de entrega comprometida

¿Donde obtener mas información? www.refactoring.com www.refactorizacion.com Libro de Martin Fowler “Refactoring” Programación ágil