54
Análisis y Diseño de Software Departamento de Ingeniería de Sistemas Telemáticos http://moodle.dit.upm.es Introducción Análisis y Diseño Carlos A. Iglesias <[email protected]>

Introducción Análisis y Diseño

Embed Size (px)

DESCRIPTION

Introducción análisis y diseño

Citation preview

Page 1: Introducción Análisis y Diseño

Análisis y Diseño de Software

Departamento de Ingeniería de Sistemas Telemáticoshttp://moodle.dit.upm.es

IntroducciónAnálisis y Diseño

Carlos A. Iglesias <[email protected]>

Page 2: Introducción Análisis y Diseño

Introducción. Diseño 2

Temario

● Ciclo de vida software● Análisis y Diseño Software● Técnicas OO de Diseño Descendente – Tarjetas CRC– Identificación de clases y métodos

● Técnicas de Diseño Ascendente– Refactorización y Patrones de Diseño

● Pruebas

Page 3: Introducción Análisis y Diseño

Introducción. Diseño 3

Teoría

Ejercicio práctico en el ordenador

Ampliación de conocimientos

Lectura / Vídeo / Podcast

Práctica libre / Experimentación

Leyenda

Page 4: Introducción Análisis y Diseño

Introducción. Diseño 4

Objetivos

● Entender el ciclo de vida del software● Conocer qué es el análisis y el diseño software● Aprender técnicas de diseño básicas● Aplicar estas técnicas en el desarrollo de un programa Java

Page 5: Introducción Análisis y Diseño

Introducción. Diseño 5

Ciclo de vida sofware

● SDLC – Software Development Life Cycle● Fases de desarrollo software

Page 6: Introducción Análisis y Diseño

Introducción. Diseño 6

Fases del ciclo de vida

Page 7: Introducción Análisis y Diseño

Introducción. Diseño 7

Secuenciación SDLC

● Clásico o en cascada (waterfall): fases sucesivas● Iterativo o espiral: cascada sucesiva● Ágil: énfasis en código de calidad, e ir haciendo mejoras en el código

Page 8: Introducción Análisis y Diseño

Introducción. Diseño 8

Análisis software

Page 9: Introducción Análisis y Diseño

Introducción. Diseño 9

Diseño software y programación

Page 10: Introducción Análisis y Diseño

Introducción. Diseño 10

Venta e Instalación en el cliente

Page 11: Introducción Análisis y Diseño

Introducción. Diseño 11

Operación y facturación

Page 12: Introducción Análisis y Diseño

Introducción. Diseño 12

Soporte

Page 13: Introducción Análisis y Diseño

Introducción. Diseño 13

SDLC

● ¿Qué diferencias ves entre una secuencia en cascada o en espiral? ●¿Qué contratarías? ●¿Qué seguirías si montas una startup?

Page 14: Introducción Análisis y Diseño

Introducción. Diseño 14

Análisis Software = QUÉ

● Determinar qué quiere realmente el usuario● Permitir valorar qué es importante y qué no de entre las cosas que pide

Page 15: Introducción Análisis y Diseño

Introducción. Diseño 15

Análisis

●¿Piensas que es difícil entender qué quiere un usuario? ¿Por qué?● ¿Qué sucede si le entendemos mal?

Page 16: Introducción Análisis y Diseño

Introducción. Diseño 16

Evaluación de alternativas● Viendo qué quiere el cliente, podemos:– Realizarlo nosotros (y

pasamos a diseño)– Subcontrarlo– Comprar un producto

(COTS, Commercial-Off-TheShelf Software)• Licencia o servicio en la

nube

Page 17: Introducción Análisis y Diseño

Introducción. Diseño 17

Evaluar alternativas

● ¿Qué criterios seguirías para diseñar, subcontratar o comprar un producto?● ¿Qué opción es la más habitual?

Page 18: Introducción Análisis y Diseño

Introducción. Diseño 18

Diseño Software = CÓMO

● Determinamos qué elementos SW (paquetes, clases, métodos, funciones, …) realizan las funcionalidades que deseamos

Page 19: Introducción Análisis y Diseño

Introducción. Diseño 19

Diseño

● ¿Crees que hay un diseño que es 'el bueno'?● ¿Son todos los posibles diseños igual de buenos?● ¿Cómo sabes si un diseño es 'bueno'?

Page 20: Introducción Análisis y Diseño

Introducción. Diseño 20

Desarrollo software...

Page 21: Introducción Análisis y Diseño

Introducción. Diseño 21

Especificación de requisitos

● Lista de cosas que el proyecto debe cumplir– Normalmente priorizados (obligatorios,

opcionales, deseables)

– Distinguimos entre• Qué debe hacer = requisitos funcionales• Requisitos y preferencias que deseamos que

cumpla (requisitos no funcionales)– Seguridad, Almacenamiento, Compatibilidad con una

plataforma, Velocidad, Eficiencia, ...

Page 22: Introducción Análisis y Diseño

Introducción. Diseño 22

Técnicas de especificación

● Casos de uso– Ver cómo el usuario

'usa el sistema'

– Distinguimos casos 'normales' y excepciones (qué pasa si hay un error)

Page 23: Introducción Análisis y Diseño

Introducción. Diseño 23

Diseño

● Depende del paradigma de programación (objetos, funciones, …) ●… e incluso del framework (Android, ...)

Page 24: Introducción Análisis y Diseño

Introducción. Diseño 24

Paradigmas y lenguajes de programación

Page 25: Introducción Análisis y Diseño

Introducción. Diseño 25

Estrategias de Diseño

Diseño

Programación

Ascendente (bottom-up)

Técnicas: refactorización

Descendente (top-down)

Técnicas: especificación diseño

Page 26: Introducción Análisis y Diseño

Introducción. Diseño 26

Especificación diseño OO● Identificamos clases principales, sus atributos y relaciones– Tarjetas CRC– Análisis del dominio

(nombres, ...)● Empleamos una notación gráfica– UML (Unified Modeling

Language)

Page 27: Introducción Análisis y Diseño

Introducción. Diseño 27

Identificación Clases

● Identifica clases candidatas– Busca nombres y frases nominales (clases),

adjetivos (atributos) y verbos (métodos) en casos de uso o descripción del problema

– Técnica tarjetas CRC (Class-Resonsibility-Collaborator)

Page 28: Introducción Análisis y Diseño

Introducción. Diseño 28

Tarjetas CRC

Page 29: Introducción Análisis y Diseño

Introducción. Diseño 29

Calidad del diseño

● Acoplamiento– Cambios de código en una clase, implica

cambiar otra(s)● Cohesión– Variedad de funcionalidades

(responsabilidades) que debe realizar una clase

Page 30: Introducción Análisis y Diseño

Introducción. Diseño 30

Ejemplo

Page 31: Introducción Análisis y Diseño

Introducción. Diseño 31

Ejemplo

Page 32: Introducción Análisis y Diseño

Introducción. Diseño 32

Refactorización

● Introducimos buenas prácticas en el código● Normalmente asistidos por el IDE● Ejemplos– Renombrar una variable

– Extraer una interfaz de una clase

– Extraer un método de un trozo de código

– Eliminar variables auxiliares

Page 33: Introducción Análisis y Diseño

Introducción. Diseño 33

Ejemplo – Eliminar variables auxiliares

public boolean bisiesto(int año) { return (año % 4 == 0 && (!(año % 100 == 0))) || año % 400 == 0; }

public boolean bisiesto(int año) { boolean multiplo4 = año % 4 == 0; boolean multiplo100 = año % 100 == 0; boolean multiplo400 = año % 400 == 0; return (multiplo4 && (! multiplo100)) || multiplo400; }

Page 34: Introducción Análisis y Diseño

Introducción. Diseño 34

Ejemplo. Extraer métodos

// cálculo de la diagonal mayor de un paralepípedo rectangular public double getDiagonalMayor(double a, double b, double c) { return Math.sqrt(Math.sqrt(a * a + b * b) * Math.sqrt(a * a + b * b) + c * c); }

// cáclulo de la diagonal mayor de un paralepípedo rectangular public double getDiagonalMayor(double a, double b, double c) { return hipotenusa(hipotenusa(a, b), c); }  // teorema de Pitágoras private double hipotenusa(double x, double y) { return Math.sqrt(x * x + y * y); }

Page 35: Introducción Análisis y Diseño

Introducción. Diseño 35

Ejemplo. Extraer métodos

public void testSimetria(String s) { boolean esSimetrica = true; for (int i = 0; i < s.length(); i++) { int j = s.length() - 1 - i; if (j < i) break; char c1 = s.charAt(i); char c2 = s.charAt(j); if (c1 != c2) { esSimetrica = false; break; } } System.out.println(esSimetrica); }

public void testSimetria2(String s) { System.out.println(isSimetrica(s)); }  private boolean isSimetrica(String s) { for (int i = 0; i < s.length(); i++) { int j = s.length() - 1 - i; if (j < i) return true; char c1 = s.charAt(i); char c2 = s.charAt(j); if (c1 != c2) return false; } return true; }

Page 36: Introducción Análisis y Diseño

Introducción. Diseño 36

Fallos típicos

http://jungla.dit.upm.es/~pepe/doc/adsw/apuntes/fallos.htm

Page 37: Introducción Análisis y Diseño

Introducción. Diseño 37

Fallos típicos

Page 38: Introducción Análisis y Diseño

Introducción. Diseño 38

Fallos típicos● No hacer "private" los campos de las clases.– Todos los campos deben ser privados, salvo que se indique explícitamente

lo contrario● Usar variables globales (de objeto) para cálculos locales (de método)– Las variables siempre deben tener el ámbito más estrecho posible. Una

variable global es fuente habitual de errores de difícil detección.● Hacer más cosas de las que se piden– No vamos a bajar la nota por hacer de más; pero es seguro que tampoco

vamos a subirla por hacer cosas que no se piden.

– De todas formas, lo frustrante es que el que hace más cosas introduce nuevas posibilidades de fallos, en lo obligatorio y en lo extra; y esos fallos si bajan la nota.

– Por tu interés: haz lo que se pide, ni más, ni menos.

Page 39: Introducción Análisis y Diseño

Introducción. Diseño 39

Tufos 'Bad smells'● Campos públicos en una clase● Métodos largos● Malos nombres en clases / atributos / métodos● Clases (o métodos )fuertemente acopladas que hay modificar a la vez● Clases que parecen un cajón de sastre

Page 40: Introducción Análisis y Diseño

Introducción. Diseño 40

Patrones de diseño

● Buenas prácticas● Ej. MVC (Model, View, Controller)– Separación de preocupaciones (concerns)– Definición de responsabilidades– Alta cohesión– Bajo acoplamiento

Page 41: Introducción Análisis y Diseño

Introducción. Diseño 41

De un vistazo...

¿Qué era cada cosa?

Page 42: Introducción Análisis y Diseño

Introducción. Diseño 42

Pruebas

Page 43: Introducción Análisis y Diseño

Introducción. Diseño 43

Pruebas...

● Unitarias: de una funcionalidad● De Integración: con otros sistemas● De Usuario (end-to-end): usabilidad con el usuario● No funcionales: de estrés, de carga, ...● Aceptación: pruebas especificadas en los requisitos

Page 44: Introducción Análisis y Diseño

Introducción. Diseño 44

Test Driven Development

Page 45: Introducción Análisis y Diseño

Introducción. Diseño 45

Pensamientos

● “Probar programas puede ser una forma efectiva de mostrar la presencia de bugs, pero es totalmente inadecuado para mostrar su ausencia” - E. W. Dijkstra

Page 46: Introducción Análisis y Diseño

Introducción. Diseño 46

Pensamientos

● “Si hubiese preguntado a mis clientes qué querían, me hubieran dicho que “caballos más rápidos”, Henry Ford

Page 47: Introducción Análisis y Diseño

Introducción. Diseño 47

Pensamientos

● “No importa cómo de bueno es un diseño sino si el diseño mejora o empeora. Si mejora, día a día, puedo vivir con él para siempre. Si empeora, estoy muerto”, Kent Beck

Page 48: Introducción Análisis y Diseño

Introducción. Diseño 48

Referencias

●Objects First with Java: A Practical Introduction Using BlueJ, D. Barnes and M. Kölling, Prentice Hall, 2011, capítulo 6

Page 49: Introducción Análisis y Diseño

Introducción. Diseño 49

Referencias●Head First Object-Oriented Analysis and Design, Brett McLaughlin; Gary Pollice; David West, O'Reilly Media, Inc., 2006●http://proquest.safaribooksonline.com/book/software-engineering-and-development/object/0596008678

Page 50: Introducción Análisis y Diseño

Introducción. Diseño 50

●Refactoring: Improving the Design of Existing Code, Martin Fowler; Kent Beck; John Brant; William Opdyke; Don Roberts, Addison-Wesley Professional, 1999●http://proquest.safaribooksonline.com/book/software-engineering-and-development/refactoring/0201485672

Referencias

Page 51: Introducción Análisis y Diseño

Introducción. Diseño 51

Referencias

●Objects First with Java: A Practical Introduction Using BlueJ, D. Barnes and M. Kölling, Prentice Hall, 2011, capítulo 6

Page 52: Introducción Análisis y Diseño

Introducción. Diseño 52

Enlaces● Glosario– http://www.lab.dit.upm.es/~fprg/curso/temario/glosario.htm

● Pruebas– http://www.dit.upm.es/~pepe/doc/adsw/apuntes/junit.pdf

● Vademécum– http://jungla.dit.upm.es/~pepe/libros/vademecum.pdf– http://jungla.dit.upm.es/~pepe/libros/vademecum/index.html

● Fallos típicos– http://jungla.dit.upm.es/~pepe/doc/adsw/apuntes/fallos.htm

Page 53: Introducción Análisis y Diseño

Introducción. Diseño 53

Resumen

● El ciclo de vida software tiene diversas fases para concebir y diseñar el software● Hay varias técnicas, tarjetas CRC, reconocer nombres para realizar identificar clases durante el diseño.

Page 54: Introducción Análisis y Diseño

Introducción. Diseño 54

¿Preguntas?