Catálogo de Refactorizaciones

Slides:



Advertisements
Presentaciones similares
Complejidad Computacional
Advertisements

Complejidad Computacional
Curso de java básico (scjp)
FACHADA COMPOSITOR MEMENTO
Lenguaje de programación Java
COLEGIO DE BACHILLERES PLANTEL 13 XOCHIMILCO-TEPEPAN MATERIA:TIC EQUIPO:23 PRESENTACION: BASE DE DATOS ALUMNAS: Velazquez Corona Elsa Ponciano Antonio.
Pruebas de Unidad y Refactorización
Arquitectura CLARO-TECNOTREE
Desarrollo de Aplicaciones para Internet
Técnicas de Programación con Visual Basic
Capitulo 3 Java util.
Informática II Prof. Dr. Gustavo Patiño MJ
Aplicación del paradigma orientado a objetos
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Encapsulamiento y Abstracción
Programación Orientada a Objetos en Java
Tema 3. Optimización de Código
METODOLOGIA DE LA PROGRAMACION
PROGRAMACIÓN EN JAVA Curso-taller inicial de programación en JAVA Facultad de Estadística e Informática TEMA II.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
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.
Tema 6: Clases Antonio J. Sierra.
Al término de la clase, el alumno reconoce las ventajas de usar JAVASCRIPT para un proyecto web.
Técnicas avanzadas de programación Interfaces
Semana 5 Subprogramas..
UNIDAD 2 CLASES Y OBJETOS. CLASE Elementos cabecera y cuerpo de la clase. Cabecera: aporta información fundamental sobre la clase en sí y constituye de.
(c) P. Gomez-Gil, INAOE DISEÑO DE COMPONENTES DE SOFTWARE * NOTAS DEL CURSO Ingeniería de Software I DRA. MARIA DEL PILAR GÓMEZ GIL INAOEP.
Análisis de Algoritmos

Capítulo 1 “Elementos de Programación”
ESTRUCTURA DE DATOS EN JAVA

(Organización y Manejo de Archivos)
PROGRAMACIÓN PROCEDIMENTAL
Material de apoyo Unidad 4 Estructura de datos
Software Testing Juan Carlos Olivares Rojas MSN:
Herramientas de polimorfismo y herencia en C++
Luis Pereda Calvo1 Comportamiento de Objetos Estrategia (Strategy) *Política (Policy)
Control de errores visual basic
Estructuras de Control.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6
Introducción a la tecnología Realizado por: Miguel Ángel Arias.
Patrón Iterator Santiago García Sánchez Rebeca Marcos Salcedo Mª Cristina Zapatero Gironda.
Programación orientada a objetos Capítulo 6 Diseño de clases.
Herencia. Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando.
INTRODUCCIÓN A LA INGENIERÍA DEL SOFTWARE
Programación Procedural y Recursiva en C++
El modelo de análisis tiene como objetivo generar una arquitectura de objetos que sirva como base para el diseño posterior del sistema. Dependiendo del.
Objetivo Mostrar los fundamentos de la programación a través de ejemplos y prácticas utilizadas cotidianamente en el desarrollo de aplicaciones.
COLEGIO DE BACHILLERES PLANTEL 13 XOCHIMILCO-TEPEPAN MATERIA:TIC EQUIPO:21 PRESENTACION: BASE DE DATOS ALUMNAS: Adán Millán Sánchez.
ELEMENTOS DE COMPUTACIÓN Profesor: Guillermo Figueroa
Visual Basic FUNCIONES Y PROCEDIMIENTOS
Patrones de diseño equipo n.1
Capítulo 2 “Subprogramas/Funciones - Arreglos”
UNIVERSIDAD TECNICA DE BABAHOYO EXTENSION DE QUEVEDO  Espinales Lisseth G RUPO N º 2 Temas:  Herencia  Polimorfismo  Encapsulamiento  2 Ejemplos Estudiante.
CONCEPTOS.
Práctica Profesional PHP.
Introducción a los TADs
75.41 Algoritmos y Programación II Cátedra Ing. Patricia Calvo Complejidad algorítmica.
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) V. GESTIÓN DE TIPOS Y GENERACIÓN DE CÓDIGOS.
Fundamentos de Ingeniería de Software
Tratamientos Secuenciales Generalizados II Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 19 Versión
Factorías e Iterables Introducción del concepto de patrón de diseño Construcción de tipos para recorridos con for extendido Fundamentos de Programación.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) IV. IMPLANTACION DE ALGORITMOS.
Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 3.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Transcripción de la presentación:

Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011

Agenda Composición de Métodos Moviendo Características entre objetos Organización de datos Email: jcolivar@itmorelia.edu.mx Skype: juancarlosolivares Web: http://antares.itmorelia.edu.mx/~jcolivar

Agenda Simplificación de expresiones condicionales Simplificar llamadas a métodos Generalización* Refactorizaciones mayores* Email: jcolivar@itmorelia.edu.mx Skype: juancarlosolivares Web: http://antares.itmorelia.edu.mx/~jcolivar

Competencia Específica Investigará las técnicas de reestructuración necesarias para corregir los errores de código, y las aplicará en un caso práctico. Competencia Específica Nos auxiliamos de muchas competencias genéricas (ver programa de la materia) Genéricas Instrumentales: Capacidad de análisis y síntesis, Solución de problemas, Toma de decisiones. Interpersonales: Capacidad crítica y autocrítica, Capacidad de trabajar en equipo interdisciplinario, Habilidad para trabajar en un ambiente laboral, Compromiso ético. Sistémicas: Capacidad de aprender, Capacidad de adaptarse a nuevas situaciones, Capacidad de generar nuevas ideas (creatividad), Habilidad para trabajar en forma autónoma, Preocupación por la calidad.

Criterios de Evaluación 70% Examen práctico 30% Desarrollo de portafolio de evidencias (trabajos, tareas y prácticas)

Composición de Métodos

Las categorías de refactoring de la presente unidad están basadas en (Fowler, 1999). Esta categoría tiene como objetivo evitar los malos olores producidos por la duplicación de código (métodos grandes, clases envidiosas, etc.). Composición de Método

La clave para solucionar estos problemas es reescribir código, de tal forma que se pueda entender mucho mejor con la menor redundancia posible. El primer refactoring es “Extract Method“ visto con anterioridad. Composición de Método

Inline Method Problema: existe mucha indirección de código cuando un método llama a otro y este último es muy pequeño o poco representativo. Solución: El cuerpo de un método debe ser tan claro como el nombre del mismo.

Inline Method Para lograr esto, es necesario poner el cuerpo del método dentro de sus propias llamadas y posteriormente pueda ser eliminado el otro método. como a continuación se muestra. Lenguajes como C++ hacen uso de métodos y variables en línea.

Inline Method

Inline Temp Problema: cuando una variable es utilizada una sola vez o pocas veces. Solución: es conveniente substituirla por el valor de la asignación temporal

Inline Temp Se debe tener cuidado de que el manejo en valores en línea sea más simple y claro que el uso de una variable temporal.

Replace Temp with Query Problema: una variable temporal se utiliza en diversas partes del programa provocando que se recalcule varias veces Solución: reemplazar dicha variable por la invocación de un método. Replace Temp with Query

Replace Temp with Query

Introduce Explaining Variable Problema: si se tiene una expresión compleja que se desea reducir su complejidad Solución: introduce el resultado de la expresión (o partes de ella) en una variable temporal que explique el propósito.. Introduce Explaining Variable

Introduce Explainig Variable

Split Temporary Variable Problema: cuando se asigna una variable temporal más de una vez, pero no es una variable de control (de ciclo) ni tampoco una variable de alguna colección (estructura). Split Temporary Variable Se repiten varias variables

Split Temporary Variable Solución: se debe fraccionar la variable haciendo una variable diferente para cada asignación. ¿POR QUÉ? Utilizar variables temporales más de una vez (para mas de una cosa) es confuso. Split Temporary Variable

Split Temporary Variable

Remove Assigment to Parameters Problema: se le asigna un valor a un parámetro y su forma de acceso no es por referencia. Solución: utilizar una variable temporal en su lugar Remove Assigment to Parameters

Remove Assigment to Parameters

Replace Method with Method Object Problema: hay un método largo que usa variables locales de tal forma que no es posible aplicar “Extraer Método”. Solución: convertir el método en un objeto, de modo que todas las variables locales sean a tributos de dicho objeto.

Replace Method with Method Object public class orden{ public double precio(){ double primerPrecioBase; double segundoPrecioBase; double tercerPrecioBase; //CÁLCULO GRANDE …. }

Replace Method with Method Object

Problema: se quiere cambiar un algoritmo por otro que es más claro y/o eficiente. Solución: cambiar el cuerpo del método por el nuevo algoritmo. De preferencia se deben conservar las interfaces de los métodos Substitute Algorithm

Substitute Algorithm

Actividad: del programa criba substituir el algoritmo para mejorar la legibilidad del código. Encontrar de manera individual cada número primo desde 1 hasta n Substitute Algorithm

Actividad: es importante que las interfaces del método (parámetros, tipo de retorno) queden igual al original. Corroborar con pruebas de regresión (pruebas unitarias). Substitute Algorithm

Un algoritmo puede medir su desempeño de diversas formas. La medición depende de exactamente lo que se quiere medir. Si se trata de legibilidad de código no es tan sencilli Medición de Desempeño

La legibilidad puede darse en tener menos líneas de código o en estar más entendible. Esta es una métrica muy subjetiva. En general el desempeño de un algoritmo se mide por su complejidad. Medición de Desempeño

La complejidad generalmente se mide en tiempo de CPU consumido aunque también puede manejarse por otros factores como el espacio de almacenamiento. Respecto a la velocidad se puede tomar el tiempo de pared que tarda el algoritmo. Medición de Desempeño

El tiempo de pared no es una métrica muy exacta El tiempo de pared no es una métrica muy exacta. Se puede mejorar si se usa el tiempo desde la computadora aunque sigue sin ser exacto. Bajo este tipo de métrica, las pruebas unitarias pueden auxiliarnos dado que registran tiempo. Medición de desempeño

Con la misma prueba unitaria, realiza la corrida de los dos algoritmos para generar números aleatorios, ¿cuál fue la más rápida? La estadística juega un papel fundamental, por ello, deberás realizar corridas más de cada una y sacar el promedio final Actividad

La forma más genérica de encontrar la complejidad de un algoritmo es a través de un análisis matemático. En general los programas de cómputo son lineales, en este caso se maneja una constante C que es el número de líneas totales. Medición de Desempeño

Entre programas lineales, es más eficiente el que tiene menos líneas de código. En general, si se presentan ciclos se maneja un término lineal n. Se pueden tener polinomios más complejos y generalmente la constante C no es tomada en cuenta. Medición de Desempeño

Medición de Desempeño Por ejemplo: boolean perfecto = false; suma = 0; for(int i=1;i<n-1;i++){ if(n%i==0) suma+=i; } if(suma==n) perfecto = true; Medición de Desempeño

Medición de Desempeño Este algoritmo tiene la siguiente complejidad: Las primeras dos líneas son secuenciales por lo tanto C=2. Después se tiene un ciclo que se repite n-1 veces con una instrucción que siempre se repite Medición de Desempeño

Por lo tanto la complejidad es de (n-1) * 1 = n-1 Al final se tiene una decisicon incrementandose la constante C, quedando C=3 Se dice que C es constante por que independiente de los datos siempre se ejecuta. Medición de Desempeño

Medición de Complejidad La variable n depede de los datos de entrada del algoritmo. La complejidad del algoritmo es (n-1)+3 = n+2. Generalmente se desprecia c por lo que la complejidad se maneja como n o simplemente lineal. Medición de Complejidad

En general en los polinomios de complejidad la parte más importante es el monomio con la mayor grado, así una complejidad de n2+2n+5 se reduce en n2, siendo cuadrático. Si se tienen dos algoritmos de n+10 y de 2n+1 se consideran prácticamente iguales. Medición de Desempeño

Es muy común en la determinación de complejidad manejar tres escenarios de como se comportan los algoritmos en el mejor de los casos, en el peor de los casos y en el caso promedio. En general se comparan las curvas de la complejidad de los algoritmos. Medición de Desempeño

Determina cual es la complejidad del primer algoritmo (recuerda que si se invocan métodos la complejidad es la suma de la complejidad de los métodos) Determina la complejidad del nuevo algoritmo y comparala con el anterior. Actividad

En cuestión de espacio simplemente se revisa la cantidad de variables y su tamaño. En este caso hay que contabilizar el tamaño total en bytes de las estructuras de datos utilizadas de ambos algoritmos y compararlas. Medición de Desempeño

Moviendo Características entre Objetos

Moviendo características Atacan principalmente el problema de que las responsabilidades de un clase realmente no le pertenecen. Se soluciona moviendo el código de una clase a otro. El refactoring más sencillo es el ya visto de Move Method.

Move Field Problema: un atributo es usado más en otra clase distinta a la que está. Solución: mover el atributo a la otra clase.

Problema: una clase está haciendo lo que deberían hacer dos clases (podría ser una clase grande). Solución: crear una nueva clase y colocar la funcionalidad repartida entre las dos clases Extract Class

Extract Class

Inline Class Problema: Una clase no está haciendo mucho (perezosa) Solución: mover todas sus características en otras clases y borrar dicha clase. Inline Class

Problema: una clase cliente llama a la clase delegada de otro objeto, situación que no debe de ocurrir. Solución: ocultar el método de la clase delegada así como el orden de las interacciones Hide Delegated

¿Qué hay de malo en esto? Hide Delegate

Solución Hide Delegate

Remove Middleman Problema: se tiene una clase intermedia que hace más difiícil de entender la delegación de responsabilidades (lo contrario al problema anterior). Solución: quitar la clase intermedia y hacer la delegaciónde forma directa

Remove middleman

Problema: una clase servidora necesita de un método adicional, pero no podemos modificar la clase Solución: crear un método en la clase cliente con una instancia de la clase servidora como primer argumento Introd. Foreign Method

Date newStart = new Date (previousEnd. getYear(), previousEnd Date newStart = new Date (previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1); Date newStart = nextDay(previousEnd); private static Date nextDay(Date arg) { return new Date (arg.getYear(),arg.getMonth(), arg.getDate() + 1);} Introd. Foreign Method

Introd. Local Extension Problema: una clase servidora necesita de múltiples métodos pero no podemos modificar la clase. Solución: crear una nueva clase que contenga estos métodos. Hacer de esta una subclase, clase de extensión o Wrapper de la original. Introd. Local Extension

Introd. Local Extension

Organización de Datos

Se propone una serie de lineamientos enfocados al correcto uso de la información de un objeto, como puede ser el encapsulamiento de atributos, el reemplazo de referencias por valores, el reemplazo de estructuras por objetos, etc. Organización de Datos

Self Encapsulated Field Problema: se accede directamente un campo, pero el acoplamiento con éste se torna poco manejable Solución: crear métodos de get y set para manipular los campos y utilizar solo ésos métodos para acceder a los campos.

Self Encapsulated Field

Repl. Data Val with Obj. Replace Data Value with Object Problema: se necesita algún dato adicional o complementario Solución: el dato se vuelve un objeto. Repl. Data Val with Obj.

Repl. Data Val with Obj.

Change Value to Reference Problema: se tiene una clase con muchas instancias iguales que se desea reemplazar con un objeto simple. Solución: cambiar el objeto por una referencia al objeto

Change Value to Reference

Change Value to Reference class Customer { public Customer (String name) {}_name = name;} public String getName() {return _name;} private final String _name; }

Change Value to Reference class Order... public Order (String customerName) {_customer = new Customer(customerName);} public void setCustomer(String customerName) {_customer = new Customer(customerName);} public String getCustomerName() {return _customer.getName(); private Customer _customer;}

Change Value to Reference Y el siguiente código cliente: private static int numberOfOrdersFor(Collection orders, String customer) { int result = 0; Iterator iter = orders.iterator();

Change Value to Reference while (iter.hasNext()) { Order each = (Order) iter.next(); if (each.getCustomerName().equals(customer)) result++; } return result;}

Change Value to Reference ¿qué hay de malo en el código? Siempre se crea un nuevo cliente cada vez que se usa el código. Se debe cambiar el código para devolver una referencia en caso de que exista. Ocupa de ver más refactorings.

Change Reference to Value Problema: se tiene una referencia a objeto que es pequeña, inmutable y fácil de manejar Solución: cambiar la referencia por el valor de un objeto Change Reference to Value

Change Reference to Value

Sintactic Sugar

Azúcar Sintáctico Es una facilidad dada por los desarrolladores del lenguaje para escribir menos. El ejemplo más sencillo es el operador ++, C++ es equivalente a C=C+1 Ciclo for (implementación while)

Azúcar Sintáctico IF como operador ternario ?: Goto en java, etiquetas: public  static  void  imprimir(String ...  cadenas) {      for (String  cadena : cadenas)         System.out.println(cadena);    }  }  

Azúcar Sintáctico Boxing automático de Datos Primitivos a Objetos: Integer a int Anotaciones: @deprecated Arreglos Triangulares Uso de objetos y métodos Thread-safe El uso de objetos sincronizados hace más lento el desempeño de las aplicaciones. Si la aplicación no maneja concurrencia no hay necesidad de utilizarlas (en java Vector y ArrayList hacen exactamente lo mismo sólo que Vector es sincronizada).

Replace Array with Object Problema: se tiene un arreglo con valores de diferente elementos. Solución: crear un objeto con propiedades de cada valor. Replace Array with Object

Replace Array with Object Ejemplo: String[] row = new String[3]; row [0] = "Liverpool"; row [1] = "15"; Performance row = new Performance(); row.setName("Liverpool"); row.setWins("15"); Replace Array with Object

Otros conocidos Replace Magic Number with symbolic Constant Encapsulated Field Otros conocidos

Laboratorio Del código proporcionado realizar lo siguiente: Determinar malas prácticas de programación. Indicar que refactoring de los vistos en el catálogo se aplicó en el código. Laboratorio

Es opcional pero ampliamente recomendable la utilización de pruebas unitarias. El programa deberá realizar las mismas funciones que el original. Podrá realizarse en parejas. Laboratorio

Siete Pecados Capitales en el Diseño de Lenguajes Tomadoen parte del artículo: “Seven Deadly Sins of Introductory Programming Language Design” de Linda McIver y Damian Conway. Department of Computer Science Monash University, Victoria, Australia

1. Menos es Más No se debe de abusar de la simplicidad. Por ejemplo lenguajes como LISP solo tienen un tipo de datos: la lista. Esto hace que el lenguaje sea simple pero difícil de manejar para el programador. 1. Menos es Más

Este pecado se puede ver en los lenguajes interpretados donde sólo hay un tipo de datos genérico, el cual puede convertirse en múltiples tipos dependiendo del contexto. La estructura de un programa debe de ser simple. 1. Menos es Más

Los lenguajes deben de ser lo más versátiles y poderosos Los lenguajes deben de ser lo más versátiles y poderosos. C es de propósito general con un enfoque hacia abajo nivel. En general los programas deben de ser funcionales y brindar “experiencias” a los usuarios. 2. Más es Más

Los lenguajes deben tener sinónimos semánticos para simplificar su uso (llamado Azúcar sintáctico). Por ejemplo para acceder al segundo valor de un arreglo en C se tienen las siguientes formas: array[1] *(array+1) 1[array] *++array Las aplicaciones deberán manejar formas alternas de utilizarse. 3. Trampa Gramatical

4. Dependencia del Hardware Los lenguajes no deben de depender tanto del hardware para poder funcionar. Las aplicaciones deben de poder correr en cualquier tipo de arquitectura sin ningún problema. 4. Dependencia del Hardware

5. Compatibilidad hacia a traás Los compiladores por razones de compatibilidad deben de soportar las versiones anteriores de los lenguajes, esto hace más pesado e ineficiente el proceso de compilación. Se recomienda que las aplicaciones nuevas no dependan de las anteriores. 5. Compatibilidad hacia a traás

6. Inteligencia Excesiva El lenguaje debe ser simple de manejar. Las aplicaciones deben ser fácilmente manipulables por los usuarios. 6. Inteligencia Excesiva

7. Violación de Expectativas Las instrucciones deben de realizar una sola cosa. En muchas ocasiones el comportamiento depende del contexto de la aplicación. Por ejemplo, algunos lenguajes utilizan el operador = para asignación y para igualdad. 7. Violación de Expectativas

7. Violación de Expectativas En general las aplicaciones deben de realizar una acción en concreto. 7. Violación de Expectativas

Encapsular Colección Cuando se devuelvan colecciones (estructuras de datos) se debe de proteger la obtención de las mismas a través de un objeto no cambiante. Esto con la finalidad que a partir de un método get no se pueda modificar la colección.

Encapsular Colección ¿Cómo implementarla? Sino se tiene alguna interfaz para no modificar estructura de datos se deberá construir un objeto nuevo.

Reemp. Cod. Tipos por clase Problema: Se da cuando una clase tiene atributos numéricos repetitivos que no afectan su comportamiento. Solución: La solución es reemplazar los números por una clase Reemp. Cod. Tipos por clase

Reemp. Cod. Tipos por clase

Reemp. Cod. Tipos por subclase Cuando se tiene atributos de código que afectan al comportamiento de la clase se deberá reemplazar por sublcases:

Reemp. Cod. Tipo por Estrategia En algunas ocasiones no se puede realizar generalización al momento de reemplazar el atributo repetitivo por lo que se recomienda utilizar el patrón Strategy o un objeto Estado:

Permite tener una interfaz común hacia diversas implementaciones de un problema. Este patrón es útil cuando un problema puede resolverse por diversos algoritmos o estrategias. Patrón Estrategia

Patrón estrategia

Reemp. Subclases con campos Problema: se tienen subclases que sólo varían en los datos que devuelven los métodos que se consideran constantes. Aunque son muy útiles, no exhiben un comportamiento distinto, por lo que habrá que eliminar la generalización. Solución: subir tanto el atributo como el método a la clase padre y eliminar las subclases.

Reemp. Subclases con campos ¿cómo queda la reestructuración?

Simplificación de Expresiones Condicionales

Descompose Conditional Problema: se tiene una condicional compleja. Solución: se extraen métodos para la condición y para las acciones de falso y verdadero. Descompose Conditional

Descompose Conditional

Consolidate Conditional Expression Existe una serie de condicionales que se pueden unificar. Consolidate Conditional Expression

Consolidate Duplicate Conditional Fragments Problema: Se repite el mismo fragmento de código en todas las ramas. Solución: Sacarlo de la expresión Consolidate Duplicate Conditional Fragments

Consolidate Duplicate Conditional Fragments

Remove Control Flag ¿Cuál es el problema con el siguiente código?

Remove Control Flag Problema: una variable está actuando como un indicador de control para una serie de expresiones lógicas. Solución: sustituir por breaks o returns

Remove Control Flag

Remove Control Flag En el código anterior found sirve de variable de control y además guarda el resultado. Si se aplica el refactoring se obtiene: void checkSecurity(String[ ] people) { String found = foundMiscreant(people); someLaterCode(found); }

Remove Control Flag

Patrón MVC En la década de 1980’s los Sistemas de Información se desarrollaban con UI basadas en Texto. En la década de 1990’s los desarrollos fueron “visuales”. La década de 2000 se caracterizó por el desarrollo Web.

Patrón MVC En la década de 2010 se caracterizará probablemente por el desarrollo móvil y ubicuo. Si estas aplicaciones no se desarrollan de forma especial, se tendría que realizar la aplicación desde el inicio. Para solucionar este problema existe el patrón de diseño Modelo-Vista-Controlador.

Patrón MVC

Patrón MVC Modelo: lógica de datos. Si es java se trata de que sean beans. Vista: interfaz de usuario Controlador: liga tanto a la vista como al el controlador. Responde generalmente al manejo de eventos. Es mala recomendación dejar embebido en la interfaz código de lógica de programa.

Patrón MVC Es una variante del principio de separación de interfaces. En un desarrollo Web, la vista es la página en HTML, el modelo es la Base de Datos y el Controlador es el código que interactúa para hacer el manejo de entradas/salidas y manda llamar al proceso.

Patrón MVC Existen diversas implementaciones de este patrón, no hay ninguna estandarizada como tal. Puede haber un modelo con varias vistas y controladores. Existen muchos frameworks que trabajan con este principio de forma nativa (Struts, Codeigniter, Ruby on Rails).

Patrón MVC El Flujo de control es el siguiente: 1.El usuario realiza una acción en la interfaz 2.El controlador trata el evento de entrada. Previamente se ha registrado. Patrón MVC

3.El controlador notifica al modelo la acción del usuario, lo que puede implicar un cambio del estado del modelo (si no es una mera consulta) 4.Se genera una nueva vista. La vista toma los datos del modelo. El modelo no tiene conocimiento directo de la vista Patrón MVC

5.La interfaz de usuario espera otra interacción del usuario, que comenzará otro nuevo ciclo Patrón MVC

Patrón MVC

public class ProgramaDeConversión { public static void main(String[] args) { ConversorEurosPesetas modelo = new ConversorEurosPesetas(); vista = new VentanaConversor(); Patrón MVC

ControlConversor control = new ControlConversor (vista, modelo); vistavista.setControlador(control); vista.arranca(); } Patrón MVC

Replace Conditional with Guard Clauses Problema: un método tiene un comportamiento condicional que obscurece el flujo del programa. Solución: implementar “clausulas guardianas” para los casos especiales. Las clausulas guardianas permiten el manejo de datos de forma más segura. Pueden ser elementos de control como break, return o bien alguna clase dada.

Replace Conditional with Guard Clauses

Replace Conditional with Polimorfism Problema: Una sentencia condicional realiza una acción dependiendo del tipo de objeto instanciado. Solución: mover cada parte de la condicional a un método de una subclase. La clase padre debe de ser de preferencia abstracta. Replace Conditional with Polimorfism

Replace Conditional with Polimorfism

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. Solución: cree clases de estado para cada estado que implementan una interfaz común.

Patrón Estado Utiliza una superclase abstracta (clase de estado), la cual contiene métodos que describen los comportamientos para los estados de un objeto. Se maneja una clase de contexto que es la que sirve de interfaz al cliente.

Patrón Estado

Simplificar llamadas a métodos

Ref. mejorar Simplicidad Método Estos refactorings tratan de mejorar la legibilidad del uso de los métodos. Algunos refactorings ya se han visto como Rename method Rename Method: cambiar el nombre de un método por otro más indiciativo. En muchas ocasiones no se puede a la primera vez pero no hay que caer en la tentación de dejarlo tal cual.

Add Parameter Problema: El método necesita que se le pase más información. Solución: agregar un parámetro. Si se necesita el método anterior se necesitará realizar polimorfismo. En la medida de lo posible hay que evitar el tener una lista de parámetros muy grande. También existe Remove Parameter Siempre hay que ver si la información se puede obtener a través de otros objetos. Cuando se quede una lista muy grande de parámetros se recomienda enmascarar la lista de argumentos en un objeto estructura.

Separate query from Modifier Malor olor: un método devuelve un valor pero también cambia el estado de un objeto. Desodorante: crear dos métodos uno para la consulta y otro para el modificador.

Parametizer Method Malor olor: varios métodos hacen lo mismo pero con diferentes parámetros. Desodorante: crear un método que use un parámetro para los diferentes valores.

De la biblioteca Vector utilizarla como modelo y desarrollar un programa aplicando el Patrón MVC. Considerar dos vistas: una gráfica y una textual que deberán poderse seleccionar al inicio del programa como argumento en CLI. Actividad

Actividad java AppVector [text] La aplicación debe de funcionar con los 5 métodos definidos en la biblioteca. El día de hoy se entrega el modelado arquitectónico de la aplicación. Actividad

Repl. Param. with Explicit Meth. Malor olor: un método ejecuta distinto código dependiendo de un valor enumerado. Desodorante: crear un método separado para cada valor del parámetro. Es más claro tener el método switch.turnOn() que switch.setOn(true)

Repl. Param. with Explicit Meth.

Replace Parameter with Method Problema: si un objeto llama a un método que después pasa el resultado obtenido como parámetro para otro método y finalmente el método receptor puede también invocar al primer método, entonces se tiene que eliminar el parámetro y dejar que el receptor invoque directamente al otro método para así ahorrarnos pasos. Replace Parameter with Method

Replace Parameter with Method

Introduce Parameter Object Problema: un grupo de parámetros que de manera natural van juntos, representan un problema Solución: hay que reemplazarlos con un objeto Introduce Parameter Object

Introduce Parameter Object

Problema: el tiempo de creación de un atributo debería estar fijo y nunca alterado. Solución: remover los métodos set. Remove Setting Method

Remove Setting Method

Hide Method Problema: un método no está siendo utilizado por ninguna otra clase Solución: el método deberá ser privado.

Hide Method

Replace Error Code With Exception Cuando un método devuelve un código especial para indicar un error, lo recomendable es hacer el uso de una excepción Replace Error Code With Exception

Replace Error Code With Exception

Dudas