Departamento de Ciencias e Ing. geniería de la Computación. Diego C. Martínez - DCIC-UNS



Documentos relacionados
Tecnología de Programación

Tecnología de Programación

Tema 4 Refactorizaciones

Programación Orientada a Objetos en Java

Patrones de software y refactorización de código

Normalización de bases de datos

Programación Orientada a Objetos con Java

M III ABSTRACCIÓN Y CLASIFICACIÓN

Capítulo VI. Diagramas de Entidad Relación

Introducción. Ciclo de vida de los Sistemas de Información. Diseño Conceptual

Definición de clases: Herencia, polimorfismo, ligadura dinámica

UNIDAD 2: Abstracción del Mundo real Al Paradigma Orientado a Objetos

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Curso de Java POO: Programación orientada a objetos

PROGRAMACIÓN ORIENTADA A OBJETOS Master de Computación. II MODELOS y HERRAMIENTAS UML. II.2 UML: Modelado de casos de uso

Diseño orientado a los objetos

PROGRAMACIÓN ORIENTADA A OBJETOS

Fundamentos del diseño 3ª edición (2002)

2.2.- Paradigmas de la POO

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Patrones de Diseño Orientados a Objetos 2 Parte

Clases y Objetos. Informática II Ingeniería Electrónica

Pilares de la Orientación a Objetos

Elementos requeridos para crearlos (ejemplo: el compilador)

3.1 INGENIERIA DE SOFTWARE ORIENTADO A OBJETOS OOSE (IVAR JACOBSON)

8. Sentencia return y métodos

6.8 La Arquitectura del Sistema. [Proceso]

1.) Cuál es la diferencia entre creatividad e innovación? 2.) Cuáles son los factores de influencia típicos en la creatividad?

GUIA PROGRAMACIÓN ORIENTADA A OBJETOS

Programación Orientada a Objetos en JAVA

Depto de Cs e Ing. de la Computación Universidad Nacional del Sur

Patrones Creacionales Builder. Patrones Creacionales Abstract Factory. Patrones Creacionales Singleton. Patrones Creacionales Prototype

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Capítulos 2 y 5: Modelación con UML y Modelo Objeto

ÍTEMS DEL MENÚ CREACIÓN Y GESTIÓN (Última revisión: lunes, 9 de marzo de 2009)

CAPÍTULO 3 Servidor de Modelo de Usuario

Conceptos. ELO329: Diseño y Programación Orientados a Objetos. ELO 329: Diseño y Programación Orientados a Objetos

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

2. Conceptos básicos Abstracción La abstracción como un proceso mental natural La abstracción en el desarrollo de software

Módulo II - PowerPoint

Curso de Doctorado: Tecnologías de Objetos

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Refactorizar (v) Reestructurar el software aplicando una secuencia de refactorizaciones.

DIAGRAMA DE CLASES EN UML

Metodologías de diseño de hardware

Proyecto Help Desk en plataforma SOA Modelo de Dominio Versión 1.3. Historia de revisiones

Diseño orientado al flujo de datos

Curso de Spring Framework

PART II: Moviendo al jugador

Administración Colaborativa de Riesgos

Pruebas de unidad con JUnit

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

MODELADO DEL DOMINIO (MODELO CONCEPTUAL)

Introducción a la Programación Orientada a Objetos (POO) Introducción a la Programación Orientada a Objetos (POO)

Java Inicial (20 horas)

TABLA DE DECISION. Consideremos la siguiente tabla, expresada en forma genérica, como ejemplo y establezcamos la manera en que debe leerse.

Metodología Orientada a Objetos Clave Maestría en Sistemas Computacionales

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Modelo Entidad-Relación

Proceso Unificado de Rational PROCESO UNIFICADO DE RATIONAL (RUP) El proceso de desarrollo de software tiene cuatro roles importantes:

Universidad Católica del Maule. Fundamentos de Computación Especificación de tipos de datos ESPECIFICACIÓN ALGEBRAICA DE TIPOS DE DATOS

Técnicas Avanzadas de Testing Automatizado

Diagrama de Clases. Diagrama de Clases

Refactoring: otra práctica de la Programación extrema

La explicación la haré con un ejemplo de cobro por $ más el I.V.A. $16.00

Creación de Funciones de Conducción

Apuntes de Matemática Discreta 1. Conjuntos y Subconjuntos

Patrones para persistencia (I) Ingeniería del Software II

Los números racionales

Ecuaciones de primer grado con dos incógnitas

K2BIM Plan de Investigación - Comparación de herramientas para la parametrización asistida de ERP Versión 1.2

Propiedad Colectiva del Código y Estándares de Codificación.

XP- EXTREME PROGRAMMING

Capítulo IV. Manejo de Problemas

Nota 2. Luis Sierra. Marzo del 2010

Unidad VI: Supervisión y Revisión del proyecto

Práctica del paso de generación de Leads

Reconocimiento de Créditos Automatizado. Módulo de Gestión

Repetir el proceso para cada abstracción identificada hasta que el diseño este expresado en términos sencillos

App para realizar consultas al Sistema de Información Estadística de Castilla y León

PATRONES. Experto. Solución:

BPMN Business Process Modeling Notation

Guía Corta: Alcance y Asociaciones. 1. Preliminares: Nombres y Asociaciones

Ingeniería del Software I Clase de Testing Funcional 2do. Cuatrimestre de 2007

6. Gestión de proyectos

Introducción a la Administración de una Red bajo IP

E-learning: E-learning:

Capitulo 3. Test Driven Development

Tecnología de Programación

NORMA INTERNACIONAL DE AUDITORÍA 706 PÁRRAFOS DE ÉNFASIS Y PÁRRAFOS DE OTROS ASUNTOS EN EL

Sistemas de Información Geográficos (SIG o GIS)

Figura 4.1 Clasificación de los lenguajes de bases de datos

Portal INAPI INAPI Conecta Instructivo de Gestión en Sitio Web

Nuevas tendencias: Virtualización de computadores / servidores

Factory method (Gamma et al.)

ESCUELA DE CIENCIAS ADMINISTRATIVAS, CONTABLES, ECONÓMICAS Y DE NEGOCIOS - ECACEN 1. METODO DELPHI

Constructores y Destructores

ISO9001:2015. Todos los certificados emitidos en este periodo tienen una fecha de caducidad de 15 de septiembre de 2018.

Transcripción:

Tecnología de Programación Diego C. Martínez Departamento de Ciencias e Ing geniería de la Computación Universidad Nacional del Sur

Patterns - Antipatterns Los patrones de diseño son soluciones s de diseño a problemas recurrentes en el desarrollo de software. Los anti-patrones (antipatterns) son son soluciones negativas que presentan más problemas que los que soluciona. Es una ilustración de la aplicación de lo que parece ser la solución correcta en el momento incorrecto. Es una muestra de ciertas construcciones dañinas de software, lo cual es la antítesis de la idea propuesta por Go of. Es mucho más que la consecuencia de malos hábitos. Denotan usualmente problemas de desarrollo. El propósito p de catalogar los antipatrones es que puedan ser reconocidos y remediados. Pueden ser tan complejos como un diseño incorrecto de clases y objetos y tan simples como código mal estruct turado. En todos los casos, demandan una solución.

Refactorización La refactorización (refactoring) es el pr roceso de cambiar un sistema de software de forma tal que no altera el comportamiento externo, mejorando su estructura interna. Refactorizar es mejorar el diseño del código una vez escrito. Lo correcto: buen diseño primero, la codificación segundo. Sin embargo, sucesivas modificacion nes degradan usualmente la calidad del código de nuestro sistema. La refactorización es una forma disciplinada de "limpiar" el código minimizando la posibilidad d de introducir i errores. Referencia clásica: Refactoring. Improving the design of existing code. Martin Fowler.

Refactorización Los primeros en elaborar la idea de ref factoring: William Opdyke Autor de la tesis doctoral Refactoring Object- Oriented Frameworks. Kent Beck Trabajó durante mucho tiempo en Smalltalk, de donde surge la noción de refactorización. Uno de los precursores de los patrones de diseño. Creador de Extre me Programming. Ward Cunningha m También experto en Smalltalk y patrones de diseño. Coautor de The Wiki Way.

Refactorización para qué Para qué r efactorizar? Mejora el diseño del software Sin refactorización, el diseño del programa decae en calidad. Los cambios sobre la marcha hacen que el código pierda su estructura. Hace el software fácil de comprender En todo proyecto de software, eventualmente alguien leerá el código en algún momento. Usualmente no se pie nsa en esta persona al programar. Ayuda a encontrar errores Refactorizar es comprender el código escrito y por lo tanto poder distinguir su correctitud. Ayuda a programar más rápidamente Contradicción? No. Un buen diseño es un terreno firme sobre el cual poder avanzar.

Refactorización cuándo Cuándo re efactorizar? Regla de tres La tercera vez que hacemos algo similar, refactorizar. Refactorizar cuando agregamos una fu unción Un buen momento es cuando se agregan nuevas funciones o responsabilidades a una parte del software. Refactorizar cuando es necesario reparar un bug Un error es una señal de posible refactorización pendiente. Refactorizar cuando se revisa el código La revisión de código debe ser periódica y con grupos pequeños, facilitando la distribución del conocimiento del pro oducto en desarrollo.

Refactorización - indicios Es necesario observar los síntomas que pueden ser indicio de problemas en el código del software. Esto se denomina code smell yguardan cierta relación con los antipatrones. Kent Beck (probablemente el autor del término) y Martin Fowler catalogan una serie de bad smells in code. Son posibles señales de la necesidad de una refactorización. Como es razonable, no existe una métrica que obligue a la refactorización, por lo que son simplemente señales de alerta a tener en cuenta.

Bad smells in code Código Duplicado Según Fowler, number one in the stink parade. Ejemplos: La misma expresión en dos métodos de la misma clase. Solución: Extract Method La misma expresión en dos clases herm manas. Solución: Extract Method, Pull Up Method, o Substitute Algorithm Código duplicado en clases diferentes Solución: Extract Class

Bad smells in code Método largo/extenso Lo ideal es producir métodos cortos y específicos. Las razones son obvias: fácil de mantener / comprender / reemplazar / reusar La solución es descomponer el método en submétodos. Algunas refactorizaciones utiles: Extract t Method, Introduce Parameter Object Replace Method with Method Object Decompose Conditional Clase larga/extensa También identificado a veces como el antipatrón Blob La solución es disminuir la complejidad Algunas refactorizaciones utiles: Extract Class, Extract Subclass y las responsabilidades

Bad smells in code Lista de parámetros larga/extensa En los inicios de la programación, todo lo necesario para una rutina era pasado como parámetro. En orientación a objetos esto no es completamente cierto, ya que la rutina puede comunicarse con un objeto que le provea lo necesario. Las listas de parámetros extensas pueden simplificarse con algunas refactorizaciones clásicas: Replace Parameter with Method, Preserve Whole Object, Introduce Parameter Object

Bad smells in code Cambio divergente El cambio divergente ocurre cuando una clase es cambiada de forma diferente por diferentes razones. Debo cambiar estos tres métodos cada vez que usamos una nueva base de datos; debo cambiar estos cuatro métodos cada vez que tenemos una nueva herramienta financiera Solución posible: Extract Class. Shotgun Surgery Similar al anterior, pero ocurre cuando al hacer un cambio, se requieren muchos pequeños cambios en clases diferentes. Solución posible: Move Method, Move Field.

Bad smells in code Data clumps Son agrupaciones de datos que son usadas en conjunto en muchos lugares. Deberían probablemente ser parte de un objeto. Soluciones: Primitive Obsession Extract Class, Introduce Parameter Object, Preserve Whole Object Muchos datos construidos en base a tipos primitivos, en lugar de encapsularlos en pequeños objetos. Típicamente: arreglos, strings, enteros. Soluciones: Replace Data Value With Object, Replace Type Code With Class, Replace Type Code with State/Strategy Los mismos de Data Clumps.

Bad smells in code Lazy Class Una clase que no se justifica, redundante, o de poca utilidad. Entorpece la comprensión del sistema. A veces es producto de refactorizaciones anteriores. Soluciones: Collapse Hierarchy Inappropriate Intimacy Clases demasiado íntimas, que constantemente indagan en aspectos privados de ambas. Soluciones puritanas :) Unidirectional, Move Method, Move Field, Change Bidirectional Association to Hide Delegate

Algunas refactorizaciones... Add Parameter Change Association Reference to value Value to reference Collapse hierarchy Consolidate conditionals Procedures to objects Decompose conditional Encapsulate collection Encapsulate downcast Encapsulate field Extract Interface Extract method Extract subclass Extract superclass Form template method Hide delegate Hide method Inline class Inline temp Introduce assertion Introduce explain variable Introduce foreign method Refactoring. Improving the design of existing code Martin Fowler

Composing methods - Extract Method Es uno de las principales refactorizacion nes que apuntan a empaquetar código apropiadamente. Básicamente, es un fragmento de código que puede ser agrupado y apartado. void printowing() { printbanner(); } //print details System.out.println ("n name: " + _name); System.out.println ("a amount " + getoutstanding()); void printowing() { printbanner(); printdetails(getoutstanding()); } void printdetails (double outstanding) { System.out.println ("name: " + _name); System.out.println ("amount " + outstanding); }

Composing methods - Extract Method Pasos: Crear un nuevo método, nombrarlo apropiadamente según lo que hace. Copiar el código extraído del origen Escanear el código extraído por referencias a variables locales al origen. Escanear el código extraído por variables temporales. Evaluar el uso de las variables (son Pasar al nuevo método las variables necesarias como parámetros. Compilar este nuevo método. a este nuevo método modificadas? son solo de lectura?) Reemplazar el código extraído por una llamada al nuevo método.

Composing methods - Inline Method El cuerpo de un método es tan claro co mo su nombre. La solución es eliminar el método trasladando el cuerpo a sus invocadores. int getrating() { return (morethanfiv velatedeliveries())? 2 : 1; } boolean morethanfivelatedelive eries() { return _numberoflat tedeliveries > 5; } int getrating() { return (_numberofla atedeliveries > 5)? 2 : 1; }

Composing methods - Replace Temp with Query Se usa una variable temporal para guar rdar el resultado de una expresión. El problema es que son temporales y locales y tienden a generar métodos extensos. La solución es convertir la expresión en un método y reemplazar su uso por la invocación correspondiente. double baseprice = _quantity * _itemprice; if (baseprice > 1000) return baseprice * 0.95; else return baseprice * 0.98; if (baseprice() > 1000) return baseprice() * 0.95; else return baseprice() * 0.98;... double baseprice() { return _quantity * _itemprice; }

Composing methods - Introduce explaining variable Existe una expresión muy complicada. La solución es usar variables temporales con nombres significativos para simplificar la expresión. if ( (platform.touppercase().indexof("mac") > -1) && (browser.touppercase().indexof("ie") > -1) && wasinitialized() && resize > 0 ) {... } final boolean ismacos = platform.touppercase().indexof("mac") > -1; final boolean isiebrowser = browser..touppercase().indexof("ie") > -1; final boolean wasresized = resize > 0; if (ismacos && isiebrowser && wasinitialized() && wasresized) {... }

Composing methods - Replace Method with Method Object Existe un método extenso que usa varia ables locales de forma tal que no se puede aplicar Extract Method. La solución es convertir el método en un objeto de manera tal que las variables locales son ahora campos del objeto. Luego se puede descomponer el método en otros métodos dentro de la misma clase. yyyyyyy () Xxxxxx Xxxxxxx Xxxxxxxx Xxxxxxx Xxxxxxx Xxxxxx Xxxxxxxx Xxx Xxxxxx X xxx Xxxxx Xxxxx Xxxxxx Xxxx Xxxx Xxxxx Xxxxxxxxxx X Xx Xxxxx Xxxx xxxxx Xxxxxx Xxxxxxx Xxxxxxxx Xxxxxxx Xxxxxxx Xxxxxx Xxxxxx () Xxxxxx Xxx Xxxxxx X xxx Xxxxx Xxxxx Xxxxxx Xxx Xxxxxx Xxxx Xxxxx Xxxxx Xxxxxx Xxx Xxxxxx X xxx Xxxxx Xxxxx

Moving Features Moving Method Existe un método que es o será usado por más aspectos de otra clase que de la clase misma en la que es definido. Puede ocurrir cuando una clase tiene muchas responsabilidades, o cuando las clases colaboran demasiado y existee mucho acoplamiento. La solución es crear un nuevo método con un cuerpo similar en la clase que mas lo usa. El viejo método se elimina o delega la tarea al nuevo. Mecánica del proceso 1. Examinar todo lo que debe moverseaotraclase clase. 2. Controlar las dependencias con las subclases y las superclases 3. Declarar el nuevo método en la clase destino. 4. Copiar el código del origen al destino y hacer los ajustes necesarios. 5. Compilar la clase destino. 6. Determinar el vínculo de la clase 7. Convertir el código origen en un delegando 8. Compilar y testear origen a la clase destino.

Moving Features Extract Class Hay una clase que está haciendo una ta area que deberían hacerla dos. Demasiados métodos, muchos datos, exceso de responsabilidades. La solución es crear una nueva clase y trasladar los campos y métodos relevantes de la clase vieja a la clase nueva. Mecánica del proceso 1. Decidir cómo dividir las responsabilidades de la clase 2. Crear una nueva clase que exprese esa división (tal vez deban renombrarse amb bas) 3. Hacer un link desde la clase vieja a la nueva. (tal vez una asociación bidireccional) 4. Usar Move Field y Move Method, y compilar luego de aplicar esas refactorizaciones. 5. Revisar las interfaces y reducirla as en lo necesario. 6. Examinar la visibilidad de la nueva clase en la clase vieja.

Moving Features Extract Class La inversa de Extract Class es Inline Class. En esta refactorización una clase abs orve a otra pues esta última no tiene muchas responsabilidades asociadas.

Organizing data Replace data value with object Existe un item de datos que necesita da atos o comportamiento adicional Es básicamente un conjunto de datos que en su momento no fue considerado como objeto del sistema. La solución es convertir ese item de datos en un objeto.

Organizing data Replace type code with class Una clase tiene un código de tipo numé érico que no afecta su comportamiento. Los códigos numéricos son comunes en el diseño de una clase. El problema es que son básicamente números, y cuando se usan o necesitan, son tratados como números. Nos vemos obligados a usar nombres significativos para recordar su intención. La solución es reemplazar el código con una nueva clase.

Generalización Pull Up Method Existen métodos con idénticos resultado os en varias subclases. Usualmente son consecuencia de copy+paste. También surge al refinar abstracciones incompletas. La solución es trasladar los métodos a las superclases.

Generalización Push down Method Parte del comportamiento de una clase La solución es trasladar los métodos a las subclases. es relevante sólo a algunas subclases.

Generalización Extract Subclass Una clase tiene aspectos que son usad os sólo en algunas instancias. Puede ocurrir como una sobrecarga de responsabilidades, o una dependencia sobre los atributos. Algunas instancias los usan, otras no. Lo mejor es no mezclarlas y generar clases separadas. La solución es crear subclases para los subconjuntos de aspectos relevantes a cierta instancias.

Generalización Extract Subclass Mecánica del proceso 1. Definir una nueva subclase de la clase origen. 2. Proveer constructores para la nueva subclase. Utilizar super con los argumentos adecuados 3. Buscar todas las invocaciones a constructores de la superclase y reemplazarlo por el constructor de la subclase si es necesario. Si la superclase ya no puede ser instanciada, declararla abstracta. 4. Aplicar Push Down Method y Push Down Field hasta que ya no sea necesario. 5. Eliminar campos que distinguían entre las instancias (usualmente booleans) 6. Compilar y testear luego de cada push down.

Visitar www.refactoring.com