“Bad Smells” en código
-
Upload
byron-mayo -
Category
Documents
-
view
125 -
download
2
description
Transcript of “Bad Smells” en código
![Page 1: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/1.jpg)
“Bad Smells” en código
M.C. Juan Carlos Olivares Rojas
Febrero 2011
![Page 2: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/2.jpg)
Agenda
• Código Duplicado
• Métodos grandes
• Clases grandes
• Lista de Parámetros excesiva
• Características de la “envidia”
![Page 3: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/3.jpg)
Agenda
• Sentencias Switch
• Jerarquías de Herencia Paralelas
• Campos Temporales
• Encadenamientos de mensajes
![Page 4: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/4.jpg)
Agenda
• Clases alternativas con diferentes interfaces
• Librerías de clases incompletas
![Page 5: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/5.jpg)
Com
pete
ncia
Esp
ecífica
•aprenderá e identificará los malos hábitos de codificación (bad smells), conociendo así los errores que generalmente se cometen al desarrollar código.
![Page 6: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/6.jpg)
Criterios de Evaluación
• 70% Examen práctico
• 30% Desarrollo de portafolio de evidencias (trabajos, tareas y prácticas)
![Page 7: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/7.jpg)
Código Duplicado
![Page 8: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/8.jpg)
Bad
Sm
ells
• Un “bad smell” es una mala práctica de programación que debe de ser eliminada para que el código sea más legible y por ende más mantenible.
• Los refactoring funcionan como desodorante permitiendo que sea mejor la programación.
![Page 9: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/9.jpg)
Bad
smell
• Si algo huele mal…
• Muy probablemente este mal.
• La codificación deficiente trae consigo una serie de características que la evidencian rápidamente.
![Page 10: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/10.jpg)
Bad
smell
• Los “malos olores” son visto como signos de debilidad del código.
• En general, para cada “mal olor” existe una serie de refactorings propuesto para solucionarlos.
![Page 11: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/11.jpg)
Malos OloresBAD SMELL REFACTORING PROPUESTO
CODIGO DUPLICADO EXTRAER EL MÉTODOSUBIR VARIABLESSUSTITUIR EL ALGORITMO
MÉTODOS LARGOS EXTRAER EL MÉTODOINTRODUCIR OBJETOS COMO PARÁMETROSREEMPLAZAR EL MÉTODO CON UN OBJETO MÉTODO
CLASES GRANDES EXTRAER CLASESEXTRAER SUBCLASES
CARACTERÍSTICA DE LA “ENVIDIA” MOVER MÉTODO
CLASES “PEREZOSAS” COLAPSAR JERARQUÍAS
![Page 12: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/12.jpg)
Cód
igo D
up
licad
o
• Es el principal indicador de un malor olor.
• ¿cómo detectamos código duplicado?
![Page 13: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/13.jpg)
Cód
igo D
up
licad
o• Misma expresión en dos
métodos de la misma clase.
• Misma expresión en dos subclases hermanas.
• Códigos que sean similares, pero no iguales.
![Page 14: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/14.jpg)
Cód
igo D
up
licad
o• Métodos que hagan lo
mismo con diferente algoritmo.
• Duplicidad de código en dos clases independientes.
• La gran mayoría de los “Bad Smells” se da por la “codificación excesiva”
![Page 15: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/15.jpg)
Cód
igo D
up
licad
o• La codificación excesiva se
da por muchas razones: malos hábitos de programación, presión del tiempo de desarrollo, etc.
• La decisión de reestructurar código depende de los desarrolladores.
![Page 16: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/16.jpg)
Mal D
iseñ
o• Aunque no está enfocado
directamente con la codificación, es el principal mal olor en la implementación del software.
• Generalmente no se hace diseño y cuando llega a hacerse se hace muy superficial sólo por cumplir el requerimiento.
![Page 17: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/17.jpg)
Mal D
iseñ
o
• En un diagrama de clases en UML es posible verificar algunos indicadores de malos olores y poder reestructurarlos antes de codificarlos.
![Page 18: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/18.jpg)
Mal D
iseñ
o• Existirán indicadores que no
son muy visibles en el modelado como los métodos largos o el código duplicado.
• Se pueden utilizar otros diagramas de UML como los de secuencia, actividades, estados, etc.
![Page 19: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/19.jpg)
Práctica 3
![Page 20: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/20.jpg)
Práctica 3
• TDD (Test-Driven Development) es una metodología de diseño la cual consiste en codificar en principio las pruebas unitarias del código.
• Se diseñan todos los posibles casos de prueba y se verifican sus resultados.
![Page 21: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/21.jpg)
Práctica 3
• Se codifican las pruebas unitarias y hasta que no se pasen al 100% el programa no puede terminar.
• Nótese que al inicio las pruebas no pueden correrse hasta que se ejecute el código.
![Page 22: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/22.jpg)
Cód
igo D
up
licad
o• Los malos olores también
pueden ser determinados a través de herramientas automatizadas, generalmente conocidos como analizadores de códigos.
• Una herramienta popular es PMD que puede analizar código escrito en Java
![Page 23: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/23.jpg)
Patro
nes d
e D
iseñ
o• ¿Si se codifica bien desde el
principio no se tendría que reestructurar el software?
• Sólo serían muchos menores los cambios
• La solución para el buen desarrollo de software son los patrones de diseño.
![Page 24: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/24.jpg)
Patro
nes d
e D
iseñ
o
• Es una solución bien documentada que los expertos aplican para solucionar nuevos problemas porque han sido utilizadas con éxito en el pasado.
![Page 25: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/25.jpg)
Patro
nes d
e D
iseñ
o• Los patrones suponen una
evolución en abstracción y reutilización del software.
• Los patrones de diseño están basados en esquemas que funcionan. ¿Cómo es una casa estilo americano?
![Page 26: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/26.jpg)
Patro
nes d
e D
iseñ
o• Realizar un programa que
permita que un momento dado uno y solo un objeto pueda estar en ejecución (no se permiten dos o más ejemplares).
• La utilización de patrones puede resolver este problema. Caso de ejemplo: Singleton
![Page 27: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/27.jpg)
Sin
gle
ton
• Problema: se admite exactamente una instancia de una clase. Los objetos necesitan un único punto de acceso global.
• Solución: Defina un método estático de la clase que devuelva el Singleton
![Page 28: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/28.jpg)
Sin
gle
ton
![Page 29: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/29.jpg)
public class Singleton { private static Singleton INSTANCE =
null; private Singleton() {} private synchronized static void
createInstance() { if (INSTANCE == null){ INSTANCE = new Singleton(); } }
Singleton
![Page 30: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/30.jpg)
Patrón de Diseño de un Menú
![Page 31: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/31.jpg)
• Realizar el análisis del programa Criba cn la herramienta PMD a nivel máximo y tratar de minimizar la mayor cantidad de errores posibles
Actividad
![Page 32: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/32.jpg)
• Modificar el patrón singleton para que permita que un objeto se pueda crear un número específico de veces (por ejemplo de 3 a 5)
• ¿Cómo quedaría dicho patrón?
• Tarea: traer un programa con orientación a objetos de más de 200 LOC. Mañana por e-mail antes de las 13:00 horas.
Actividad
![Page 33: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/33.jpg)
Métodos Grandes
![Page 34: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/34.jpg)
Métodos grandes
• El tener métodos grandes trae consigo muchas consecuencias como el hecho de que es menos reusable y más dificil de leer.
• Se recomienda que los métodos no sean mayores a 24 líneas
![Page 35: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/35.jpg)
Métodos grandes
• El número de líneas puede ser variable pero se recomienda que se pueda leer en una sola pantalla.
• Es deseable que los métodos no sea tan cortos para evitar el seguir el flujo del programa
![Page 36: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/36.jpg)
Extract Method
• Extract Method es el refactoring más popular para malos olores como código duplicado y métodos grandes (casi el 99% de la solución es este refactoring)
![Page 37: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/37.jpg)
Extract Method
• El nuevo método que se ha extraído contiene el código seleccionado y el código seleccionado del miembro existente, se reemplaza por una llamada al nuevo método.
![Page 38: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/38.jpg)
Extract Method
![Page 39: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/39.jpg)
Clases Grandes
![Page 40: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/40.jpg)
Clases Grandes
• En la gran mayoría de las ocasiones, una clase grande es sinónimo de código duplicado o que la clase está realizando más acciones de las debidas.
• ¿cómo sabemos que una clase es grande?
![Page 41: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/41.jpg)
Clases Grandes
• Las clases no son grandes por el tamaño de su código ni por su número de elementos.
• Se debe verificar que la clase realice solo las acciones necesarias. Por ejemplo que no mezcle E/S con la lógica de la aplicación.
![Page 42: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/42.jpg)
Antipatrones de Diseño
• Antipatrón es un patrón de diseño que invariablemente conduce a una mala solución para un problema.
• Al documentarse tanto los antipatrones como los patrones de diseño, sirven de base para no escoger malos caminos, partiendo de documentación disponible en lugar de simplemente la intuición.
![Page 43: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/43.jpg)
Antipatrón BLOB
• Mejor conocido como “objeto todopoderoso”. Se presenta cuando una clase es muy grande tanto en atributos y/o en métodos.
![Page 44: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/44.jpg)
Antipatrón BLOB
• Entre más grande son las clases es más difíciles de mantener, reusar y probar. Su gran tamaño puede perjudicar el tiempo de carga. Generalmente son el resultado de un mal diseño o de sistemas legados.
![Page 45: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/45.jpg)
Antipatrón BLOB
![Page 46: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/46.jpg)
Antipatrón BLOB
![Page 47: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/47.jpg)
Antipatrón BLOB
![Page 48: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/48.jpg)
Antipatrón BLOB
• Algunos autores consideran al Singleton (Simplicidad) un ejemplo de un antipatrón ¿por que?
![Page 49: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/49.jpg)
Antipatrón BLOB
• Dificulta las pruebas de código ya que promueve un alto acoplamiento.
• La clase controla su propia creación cuando esta no debe de ser su responsabilidad.
![Page 50: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/50.jpg)
Antipatrón BLOB
• Se recomienda utilizar el patrón de diseño Factory para crear objetos.
• En general su naturaleza estática y pública no son del todo bien vistas.
![Page 51: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/51.jpg)
Lista de Parámetros excesiva
![Page 52: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/52.jpg)
Lista de Parámetros excesiva
• El manejo de parámetros de forma excesiva es una mala práctica de programación ya que implica el paso de muchos parámetros difíciles de recordar.
• No hay una métrica exacta para el número de parámetros
![Page 53: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/53.jpg)
Lista de Parámetros excesiva
• Nuestra recomendación será manejar hasta 4 parámetros como máximo.
• Si se supera del límite establecido se deberá reestructurar.
![Page 54: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/54.jpg)
Lista de Parámetros excesiva
• Se pueden elegir otras métricas como que el ancho del código no rebase 80 caracteres o bien una sola pantalla de texto.
• Se debe hacer uso de las bondades del lenguaje como el polimorfismo y el uso de parámetros predeterminados.
![Page 55: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/55.jpg)
Lista de Parámetros excesiva
• En general se debe de reestructurar el número de parámetros por la utilización de estructuras como arreglos y/o objetos.
• Se recomienda utilizar refactroings como: Replace parameters with method e Introduce parametrs with object
![Page 56: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/56.jpg)
Características de la Envidia
![Page 57: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/57.jpg)
En
vid
ia• Cuando una entidad como
una clase o método están más interesados en el comportamiento de otra entidad se le denomina envidia.
• La envidia viola el principio de diseño de la cohesión y eleva el acoplamiento.
![Page 58: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/58.jpg)
En
vid
ia• La envidia se presenta sobre
todo con los datos (atributos).
• La solución generalmente implica utilizar move method cuando todo el método es envidioso.
![Page 59: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/59.jpg)
En
vid
ia• Si una sola parte de un
método o clase es envidiosa se debe utilizar extract method.
• Si se presenta envidia con muchas entidades se deberá escoger aquella que sea la más fuerte para colocar en ella el método.
![Page 60: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/60.jpg)
Activ
idad
• Actividad: del código de la criba se deberá reestructurar de la siguiente forma:
• Nótese que el método generarCriba es muy grande por lo que deberá simplificarse utilizando Extract Method de la siguiente forma:
![Page 61: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/61.jpg)
Activ
idad
• Encuentre las funcionalidades y extraiga 3 métodos: inicializarCandidatos(max), eliminarMultiplos(), obtenerCandidatosNoEliminados();
• Haga los ajustes necesarios y verifique que otras partes del código se pueden reestructurar.
![Page 62: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/62.jpg)
Sentencias Switch
![Page 63: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/63.jpg)
Sentencias Switch
• La estructura switch causa generalmente duplicidad en el código.
• En general en POO debemos utilizar polimorfismo para hacer más legibles e intuitivos los códigos.
![Page 64: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/64.jpg)
Sentencias Switch
• Generalmente se aplica los refactoring Extract Method y Move Method aunque en otros casos aplican refactoring más elaborados como: Replace Type Code with Subclasses, Replace Type Code with State/Strategy, Replace conditional with Polimorphism, entre otros.
![Page 65: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/65.jpg)
Jerarquía de Herencias Paralelas
![Page 66: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/66.jpg)
Jerarquía de Herencia Múltiples
• Es un caso especial de Shotgun Surgery.
• La “cirugía de escopeta” se da cuando al modificar una clase se tienen que modificar otras clases en forma de cadena
![Page 67: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/67.jpg)
Jerarquía de Herencias Paralelas
• Este mal olor se caracteriza por que cada vez que se crea una sublcase de una clase x, se debe crear otra subclase de otra clase, que generalmente tiene el mismo prefijo que la otra jerarquía.
![Page 68: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/68.jpg)
Jerarquía de Herencias Paralelas
• Para solucionar este mal olor se debe utilizar refactroings como Move Method o Move fields para quitar las referencias de la otra subclase creada.
![Page 69: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/69.jpg)
Reingeniería de Software
• La refactorización es parte importante del proceso de reingeniería.
• La reingeniería es una actividad de reconstrucción, preferible de realizar antes de que se “derrumbe” la obra.
![Page 70: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/70.jpg)
Técnicas de Reingeniería
• Análisis de Inventario• Reestructuración de Documentos
• INGENIERÍA INVERSA
• Reestructuración de Códigos• Reestructuración de Datos
• Ingeniería directa
![Page 71: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/71.jpg)
Ingeniería Inversa
• Se aplica para obtener un modelo detallado de análisis, ingeniería de requerimientos, diseño y en algunos casos implementación teniendo una solución.
• Es una actividad penada por la ley
![Page 72: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/72.jpg)
Ingeniería Inversa
• Los archivos ejecutables pueden ser desemsamblados obteniendo su código fuente en ensamblador.
• Los archivos ejecutables con código portable (Java, .NET) pueden ser desemsamblados para obtener su código fuente.
![Page 73: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/73.jpg)
Ingeniería Inversa
• Existen herramientas como los decompiladores que a partir de un código objeto pueden obtener código fuente.
• Todas las aplicaciones nativas se descomponen en instrucciones en ensamblador.
![Page 74: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/74.jpg)
Ingeniería Inversa
• Sólo se puede obtener el código exacto si se conoce la técnica de generación de código objeto.
• En el caso de java existe un decompilador básico llamado javap o bien herramientas más avanzadas como cavaj, MacJAD o Java Decompiltaor, etc.
![Page 75: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/75.jpg)
Ingeniería Inversa
• ¿Cómo se puede proteger nuestros códigos?
![Page 76: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/76.jpg)
Ofuscación
• La ofuscación es una técnica avanzada de refactorización que permite a un código mantenerle obscuro (es decir no muy legible) con diversos propósitos de optimización.
• ¿No viola esto el principio de claridad en la implantación?
![Page 77: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/77.jpg)
Ofuscación
• La ofuscación se realiza en muchas casos para hacer un código ilegible, también en muchos casos se puede reducir el tamaño del código fuente y del código binario realizado.
![Page 78: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/78.jpg)
Ofuscación
![Page 79: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/79.jpg)
• Realizar la ofuscación del código Example de Martin Fowler
• Refactoring de identificadores (métodos, clases, atributos) con nombres muy grandes y poco descriptivos.
• Agregando comentarios javadoc sin coherencia.
• Agregando funcionalidades no utilizadas así como código no útil.
Actividad
![Page 80: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/80.jpg)
Téc, d
e O
fusca
ción
• La ofuscación al igual que el refactoring se puede hacer sobre las estructuras de datos.
• Por ejemplo en arreglos:
![Page 81: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/81.jpg)
Tec. d
e O
fusca
ción
• Arreglos
![Page 82: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/82.jpg)
Tec. d
e O
fusca
ción
• También se puede ofuscar clases:
![Page 83: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/83.jpg)
Tec. d
e O
fusca
cion
• Clases
![Page 84: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/84.jpg)
Tec d
e O
fusca
ción
• Variables
![Page 85: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/85.jpg)
Tec. d
e O
fusca
ción
• Variables
![Page 86: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/86.jpg)
Tec. d
e O
fusca
ciòn
• Sobre el flujo del programa
![Page 87: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/87.jpg)
Tec. d
e O
fusca
ción
• Sobre el flujo del programa
![Page 88: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/88.jpg)
Tec. O
fusca
ción
• Sobre el flujo del programa
• Paralelización
![Page 89: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/89.jpg)
Tec. d
e O
fusca
ción
• Paralelización
![Page 90: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/90.jpg)
Tec. d
e O
fusca
ción
• Paralelización
![Page 91: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/91.jpg)
Tec. d
e O
fusca
ción
• Ciclos
![Page 92: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/92.jpg)
Tec. d
e O
fusca
ción
• Ciclos
![Page 93: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/93.jpg)
Téc. D
e O
fusca
ción
• Lo más adecuado es realizar la ofuscación sobre el código objeto generado sin alterar el original.
• Existen ofuscadores como proguard, yguard que son libres o comerciales como Dasho o KlassMaster
![Page 94: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/94.jpg)
• Comparar su proyecto ofuscado con el original a través de diff y patch
• Determina el grado de legibilidad de la aplicación calculado a través de la siguiente fórmula:
• Líneas negras / líneas blancas * 100
Actividad
![Page 95: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/95.jpg)
• De la página principal del sitio Web de su profesor: http://antares.itmorelia.edu.mx/~jcolivar/
• Realizar ofuscación de códigos para obtener el archivo más pequeño posible. Por ejemplo si la página es de 10KB y se reduce en 8KB es buena la ofuscación. Trate de eliminar líneas en blanco. La página NO debe de cambiar. Se premiará al que logre el menor tamaño posible con 1 PUNTO EXTRA. En caso de empate se anula.
Lab
![Page 96: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/96.jpg)
Campos Temporales
![Page 97: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/97.jpg)
Cam
pos T
em
pora
les
• Se presentan cuando existen variables o atributos de la clase subutilizadas.
• Generalmente están allí debido a la utilización de algoritmos complicados.
![Page 98: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/98.jpg)
Cam
pos T
em
pora
les
• Se pueden utilizar refactorings como extract class o Introduce Null Objects
![Page 99: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/99.jpg)
Encadenamiento de Mensajes
![Page 100: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/100.jpg)
Encadenamiento de Mensajes
• Este mal olor es muy notorio y se caracteriza por tener líneas de código en las que un objeto pide por otro y a su vez este por otro, y así sucesivamente logrando lo que se conoce como cadenas de mensajes
![Page 101: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/101.jpg)
Cadenas de Mensajes
• Aparentemente se reduce el manejo de objetos temporales pero en realidad se está realizando mucho acoplamiento.
• Cualquier cambio en las relaciones internas provoca el cambio en las subsecuentes.
![Page 102: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/102.jpg)
Cadena de Mensajes
• Se pueden presentar el problema de “middle man” al tener muchos intermediarios.
• La solución es en muchos casos aplicar Hide Delegate, Extract and Move Method.
![Page 103: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/103.jpg)
Clases Alternativas con Distintos Mensajes
![Page 104: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/104.jpg)
Cla
ses A
ltern
ativ
as
• Se presenta cuando se tienen métodos similares en diferentes clases.
• Generalmente se debe de renombrar el método, y en otros casos renombrarlo.
![Page 105: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/105.jpg)
Librerías de Clases Incompletas
![Page 106: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/106.jpg)
Librerías de Clases Incompletas
• Las bibliotecas de clases aunque promueven el reuso de software, sino están bien elaboradas ocasionan muchos problemas.
• El problema radica en que la gran mayoría de las ocasiones, no se cuenta con el código de la biblioteca.
![Page 107: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/107.jpg)
Librería de Clases Incompletas
• Al no poseer el código fuente, se vuelve complicado realizar modificaciones.
• Se puede optar por los refactorings de Introducir Método Foraneo o Introducir Extesión Local
![Page 108: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/108.jpg)
Actividad
• Desarrollar una biblioteca en Java que permita realizar operaciones básicas con vectores en dos y tres dimensiones.
• Para ello, se deberán construir “Beans” de la implementación.
![Page 109: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/109.jpg)
Actividad
• Una vez construida la biblioteca deberá ser utilizada en un proyecto donde la funcionalidad sea utilizada por el usuario final.
• Se deberá documentar la biblioteca con comentarios JavaDoc.
![Page 110: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/110.jpg)
Actividad
• Las operaciones a realizar son:
• Suma• Resta• Igualdad• Multiplicación por un Escalar• Producto punto
![Page 111: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/111.jpg)
Suma
![Page 112: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/112.jpg)
Resta
Producto Punto
![Page 113: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/113.jpg)
Producto Vectorial
Producto de un vector por un Escalar
Se multiplica el escalar por cada componente del vector
kA donde k es un escalar y A un vector se tiene:
kA= kA1x + kA2y + kA3z….
![Page 114: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/114.jpg)
Otros Malos Olores
• Existen diversas clasificaciones de malos olores. Una de las más populares es la Mika Mäntyla, el cual divide los malos olores en cinco categorías:
![Page 115: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/115.jpg)
1. Infladores
• Los que aumentan el tamaño del código como:
• Método largo, clase larga• Obsesión por tipos primitivos:
aquí no se utilizan ADT cuando el tipo de dato lo requiere. Ejemplo: tipo de dato teléfono
![Page 116: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/116.jpg)
1. Infladores
• Lista de parámetros larga
• Grupos de datos (dataclump): se presenta cuando se utilizan muchos datos aislados que podrían simplificarse utilizando un objeto o estructura para ello.
![Page 117: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/117.jpg)
2. Abusadores de POO
• Sentencias switch• Campo temporal• Clases alternas con distintas
interfaces• Rechazo del legado: cuando
una clase se reusa a utilizar su herencia.
![Page 118: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/118.jpg)
3. Impedidores de cambio
• Cambio divergente: cuando se implementan en las clases funcionalidades diferentes al contexto de la clase
• Cirugía de escopeta• Jerarquía de herencias
paralelas
![Page 119: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/119.jpg)
4. Los prescindibles
• Clases holgazanas• Clases de datos: cuando una
clase sólo almacena datos pero no tiene métodos para acceder a ellos
• Código duplicado
![Page 120: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/120.jpg)
4. Los prescindibles
• Código muerto: código legado que ya no se utiliza en la versión actual del código.
• Generalización especulativa: sucede cuando un código intenta solucionar problemas más allá de sus alcances originales.
![Page 121: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/121.jpg)
5. Los emparejadores
• Alertan sobre alto acoplamiento de componentes.
• Característica de la envidia• Cadenas de mensajes• Intermediarios
![Page 122: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/122.jpg)
5. Los emparejadores
• Intimidad inapropiada: ocurre cuando dos clases se conocen demasiado y se usan con demasiada confianza, el problema se presenta cuando esa relación en términos de POO es inapropiada.
![Page 123: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/123.jpg)
Hiso
ria d
e U
suario
• Necesito de un software que permita llevar acabo el seguimiento de mis pacientes.
• La secretaria debe poder agendar una cita y tener los datos de contacto del paciente (teléfono, domicilio, etc.)
![Page 124: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/124.jpg)
Histo
ria d
e U
suario
• Por mi parte, debo de poder realizar una cita clínica y poder imprimir una receta médica.
• Las citas clínicas se van almacenando en un expediente electrónico para posteriormente visualizarlo
![Page 125: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/125.jpg)
Lab
ora
torio
5
• Interacción 1: funcionalidad de agendar citas
• Interacción 2: funcionalidad de captura de historia clínica y expedición de recetas
• Interacción 3: funcionalidad de consultar expedientes clínicos.
![Page 126: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/126.jpg)
Lab
5
• Programar la interacción que les corresponda.
• Aspectos de diseño de interfaces de usuarios salen en segundo plano.
![Page 127: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/127.jpg)
Con
clusio
nes
• Los malos olores dependen del autor aunque son consistentes.
• Por ejemplo Jeff Bay en su artículo Object Calisthenics sugiere 9 reglas a seguir para construir software de calidad:
![Page 128: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/128.jpg)
Con
clusio
nes
• 1.Usa solo un nivel de indentación por método
• 2.No uses el “else” dentro de una condicional
• 3.Usa Wrappers para los tipos primitivos y las cadenas
• 4.Solo usa un punto por línea
![Page 129: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/129.jpg)
Con
clusio
nes
• 5.No abrevies
• 6.Mantén las entidades pequeñas
• 7.No utilices una clase que tenga más de 2 variables de instancia.
![Page 130: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/130.jpg)
Con
clusio
nes
• 8.Una clase que contenga una colección no debe contener otras variables de instancia
• 9.No use propiedades, ni getters ni setters
![Page 131: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/131.jpg)
Actividad
• ¿qué se tendría que hacer en el programa si la biblioteca utilizada realiza cálculos erróneos (por ejemplo manejar números complejos) y no se dispone del código fuente para modificarlo?
• Identificar mal olor
![Page 132: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/132.jpg)
Actividad
• Librerías de Clases Incompletas
• Solución: introducir método foráneo o introducir extensión local.
• Se puede utilizar el patrón de diseño adapatador
![Page 133: “Bad Smells” en código](https://reader030.fdocuments.net/reader030/viewer/2022033010/5681353a550346895d9c9ef9/html5/thumbnails/133.jpg)
Du
das