template-browser-not-supported

Grado en Ingeniería Informática del Software

Back Back

Diseño del Software

Código asignatura
GIISOF01-3-004
Curso
Tercero
Temporalidad
Primer Semestre
Materia
Ingeniería de Software
Carácter
Obligatoria
Créditos
6
Pertenece al itinerario Bilingüe
Yes
Actividades
  • Prácticas de Laboratorio (28 Hours)
  • Tutorías Grupales (2 Hours)
  • Prácticas de Aula/Semina (7 Hours)
  • No Presenciales (0 Hours)
  • Clases Expositivas (21 Hours)
Guía docente

El diseño de software desempeña un papel fundamental en la construcción de sistemas informáticos complejos, comprendiendo un conjunto de principios y técnicas que permiten pasar de los requisitos a la implementación obteniendo un código de calidad, entendiendo como tal aquél que es fácil de entender y que resulta fácil de modificar para adaptarse a los cambios en los requisitos. Es por ello una pieza esencial en la formación de los graduados en ingeniería del software, aportándoles los conocimientos específicos necesarios para su práctica profesional.

La asignatura, de carácter eminentemente práctico (pero que requiere un sólido conocimiento y comprensión de los principios y patrones de diseño a aplicar), pertenece al módulo de tecnología específica en ingeniería del software, encuadrándose a su vez en la materia de ingeniería del software, y pretende, por un lado, proporcionar una visión de más alto nivel sobre los conocimientos adquiridos en otras asignaturas de programación, como Introducción a la Programación, Metodología de la Programación o Tecnologías y Paradigmas de la Programación, así como asentar las bases que le posibiliten luego enfrentarse al diseño y construcción de software de dimensión industrial, aplicando las buenas prácticas existentes (concretamente, ciñéndonos al paradigma orientado a objetos). Igualmente, la asignatura aporta al alumno las competencias necesarias para poder abordar otras asignaturas como Arquitectura del Software y Diseño de Lenguajes de Programación.

El alumno deberá dominar al menos un lenguaje orientado a objetos (en la asignatura, si bien se podrán comentar características aisladas de diferentes lenguajes, se empleará Java como lenguaje de implementación). Sería igualmente deseable que poseyese al menos nociones básicas de diseño orientado a objetos, como modularidad, bajo acoplamiento, alta cohesión, herencia frente a delegación, etcétera, más allá de la sintaxis particular del lenguaje de programación empleado, si bien en la asignatura se repasarán y ampliarán tales conceptos, para subir rápidamente el nivel de abstracción y centrarse en la enseñanza de patrones de diseño, que representan el grueso de esta asignatura.

Concretamente, el alumno deberá haber cursado y superado al menos las asignaturas de Introducción a la Programación, Metodología de la Programación y Tecnologías y Paradigmas de la Programación.

Se espera que el alumno aprenda técnicas avanzadas de diseño orientado a objetos, fundamentalmente patrones de diseño. Al terminar el curso debería no sólo conocer la mayoría de patrones de diseño fundamentales descritos en el libro clásico sobre la materia (Gamma et al., 1995), sino de razonar el diseño de una aplicación en términos de tales patrones, siendo capaz de identificar dónde se hace necesario el uso de un determinado patrón en contextos diferentes a los vistos en clase. Igualmente, se pretende que el curso sirva para asentar principios básicos de diseño orientado a objetos, como identificar correctamente las clases e interfaces participantes en un diseño y determinar su comportamiento, colaboraciones y responsabilidades. También debería terminar el curso habiendo mejorado su estilo de programación, aprendiendo a usar guías de estilo y principios de factorización de código.

Además de eso, y de acuerdo con la memoria de verificación del título de Grado en Ingeniería Informática del Software de la Universidad de Oviedo, las competencias que el alumno debe adquirir al cursar la asignatura de Diseño del Software son las siguientes:

Competencias técnicas o específicas:

  • Capacidad para planificar, concebir, desplegar y dirigir proyectos, servicios y sistemas informáticos en todos los ámbitos, liderando su puesta en marcha y su mejora continua y valorando su impacto económico y social. (Com.2)
  • Capacidad para analizar, diseñar, construir y mantener aplicaciones de forma robusta, segura y eficiente, eligiendo el paradigma y los lenguajes de programación más adecuados. (Com.8)
  • Conocimiento de las características, funcionalidades y estructura de los sistemas operativos y diseñar e implementar aplicaciones basadas en sus servicios. (Com.10)
  • Capacidad para desarrollar, mantener y evaluar servicios y sistemas software que satisfagan todos los requisitos del usuario y se comporten de forma fiable y eficiente, sean asequibles de desarrollar y mantener y cumplan normas de calidad, aplicando las teorías, principios, métodos y prácticas de la Ingeniería del Software. (ISW.1)
  • Capacidad de identificar y analizar problemas y diseñar, desarrollar, implementar, verificar y documentar soluciones software sobre la base de un conocimiento adecuado de las teorías, modelos y técnicas actuales. (ISW.4)
  • Capacidad de identificar, evaluar y gestionar los riesgos potenciales asociados que pudieran presentarse. (ISW.5)
  • Capacidad para diseñar soluciones apropiadas en uno o más dominios de aplicación utilizando métodos de la ingeniería del software que integren aspectos éticos, sociales, legales y económicos. (ISW.6)

Competencias generales:

  • Competencia para el diseño de soluciones a problemas (CG-1)
  • Capacidad de abstracción (CG-3)
  • Análisis y síntesis (CG-4)

El alumno será capaz de (resultados de aprendizaje):

  • RA.IS-1. Realizar Proyectos de Ingeniería del Software complejos que den solución a problemas reales y solucionarlos mediante técnicas y tecnologías relacionadas con los procesos de fabricación de software incluyendo frameworks, patrones arquitectónicos, patrones de diseño y de integración persiguiendo el desarrollo de software de calidad [Com2], [Com.8], [Com10], [ISw.1], [ISw.4], [ISw.6], [CG1], [CG3], [CG4]
  • RA.IS-3. Aplicar distintas técnicas de construcción de software en el diseño de bajo nivel [Com.8], [ISw.1], [ISw.4], [CG1]
  • RA.IS-4. Desarrollar diseños y programación orientados a objetos con un elevado nivel de competencia [Com.8], [ISw.4], [CG1], [CG4]
  • RA.IS-5. Evolucionar y refactorizar diseños existentes ante cambios en los requisitos [ISw.1], [ISw.6]
  • RA.IS-6. Determinar el grado de mantenibilidad, fiabilidad y eficiencia de diseños software [Com.8], [ISw.1], [ISw.4], [CG1]
  • RA.IS-9. Diseñar y llevar a cabo controles e inspecciones eficientes y efectivas de validación, verificación y calidad, planes de pruebas [ISw1], [ISw4], [CG4]
  • RA.IS-10. Analizar estadísticamente la densidad de defectos y probabilidad de fallos [ISw4], [ISw5]
  • RA.IS-11. Evaluar la calidad de un proceso de software desde el punto de vista de la calidad del producto [ISw1]

En función de los objetivos planteados se seleccionan los siguientes contenidos:

  1. Técnicas y principios de calidad para el diseño disciplinado de software
    • Introducción al diseño
    • Representación del diseño
    • Criterios de diseño
    • Paso del diseño a implementación
  2. Patrones de diseño
    • Introducción a los patrones
    • Estructura de un patrón
    • Patrones por familia: de creación, estructurales y de comportamiento
    • Catálogo de patrones
  3. Evolución disciplinada de diseños y reingeniería
    • Los patrones como herramienta de comunicación
    • El papel del diseño en el proceso de desarrollo de software
    • Introducción a la reutilización de diseños mediante frameworks
    • El diseño en metodologías ágiles

La asignatura utilizará la siguiente tipología de modalidades organizativas:

  • En las clases expositivas se explicarán los principios y patrones de diseño desde un punto de vista conceptual. Dado el carácter de la asignatura, estás clases serán dialogadas, fomentando el aprendizaje guiado. El profesor a su vez podrá pedir a los alumnos como trabajo autónomo la lectura de artículos, wikis y de los capítulos correspondientes a los patrones de diseño concretos del libro de texto de la asignatura que serán discutidos en la clase siguiente.
  • En los seminarios se plantearán problemas de diseño reales que habrán de ser resueltos en papel por los alumnos, ya sea de manera individual o en grupo, aplicando los principios y patrones expuestos en las clases teóricas, facilitando el aprendizaje por descubrimiento. Posteriormente se resolverán y discutirán entre todos en clase, analizando las ventajas e inconvenientes de las soluciones propuestas.
  • En las clases prácticas de laboratorio se empleará un enfoque de aprendizaje basado en problemas. Así, se planteará un determinado problema de diseño y los estudiantes comenzarán a trabajar en él en clase de manera autónoma, aunque bajo la supervisión y con la guía del profesor. A continuación, dispondrán de una semana para continuar trabajando él y entregar el proyecto antes de la siguiente clase de laboratorio. Normalmente, cada práctica involucrará el uso de uno o varios patrones de diseño, y el objetivo es que el alumno trate de llegar a ellos por sí mismo, antes incluso de haberlos estudiado en clase de teoría. Al inicio de la siguiente sesión práctica se explicará la solución correcta, analizando el porqué de cada decisión de diseño tomada y comparándola con otros posibles enfoques llevados a cabo por los alumnos.
  • En las tutorías grupales se realizará un seguimiento de los alumnos para detectar lagunas y se les orientará sobre cómo solucionarlas.

La siguiente tabla desglosa por temas y horas las actividades anteriormente descritas:

TRABAJO PRESENCIAL

TRABAJO NO

PRESENCIAL

Temas

Horas totales

Clase expositiva

Prácticas de aula / seminarios / talleres

Prácticas de laboratorio

Tutorías grupales

Sesiones de evaluación

Total

Trabajo en grupo

Trabajo autónomo

Total

Técnicas y principios de calidad para el diseño disciplinado de software

42

6

2

8

16

26

26

Patrones de diseño

79

11

4

14

1

2

32

47

47

Evolución disciplinada de diseños y reingeniería

29

4

1

6

1

12

17

17

Total

150

21

7

28

2

2

60

90

90

Y a continuación se resumen, por horas, las diferentes modalidades de enseñanza seguidas:

MODALIDADES

Horas

%

Totales

Presencial

Clases Expositivas

21

14

60

Práctica de aula / seminarios / talleres

7

4,7

Prácticas de laboratorio

28

18,7

Tutorías grupales

2

1,3

Sesiones de evaluación

2

1,3

No presencial

Trabajo en grupo

90

Trabajo individual

90

60

Total

150

De forma excepcional, si las condiciones sanitarias lo requieren, se podrán incluir actividades de docencia no presencial, en cuyo caso se informará a los estudiantes de los cambios efectuados.

Como se ha visto en el apartado anterior, en la metodología docente de la asignatura, las diferentes modalidades de clases están sólidamente engranadas, de tal forma que no se concibe la teoría sin la práctica o viceversa. Las diferentes actividades de la asignatura han sido cuidadosamente pensadas para intentar proporcionar el mejor itinerario didáctico posible, de tal modo que, al final del curso, todas las piezas encajen entre sí y el alumno acabe adquiriendo de manera natural una compresión natural de una materia compleja como ésta y sea capaz de aplicar las técnicas de diseño adquiridas a problemas de ámbitos muy diversos.

Semanalmente en clase de prácticas se planteará un determinado problema de diseño. En unos casos se deberá realizar desde cero y, en otros, se proporcionará un código que funciona pero que adolece de problemas de diseño que el alumno deberá, primero, detectar, y luego intentar resolver con los principios generales de diseño y, en su caso, mediante la aplicación de uno o varios patrones de diseño, a los que idealmente debería haber llegado sin haberlos visto aún en clase de teoría, descubriéndolos por sí mismo. Cualquier entrega fuera de plazo o en otra tarea del campus virtual distinta a la establecida para cada grupo y sesión de laboratorio no será tenida en cuenta.

Es fundamental hacer notar que lo importante de dichas prácticas, y su utilidad como herramienta de evaluación y aprendizaje, no es tanto la corrección de estas como que el alumno se haya esforzado en su realización, aun cuando no haya sido capaz de llegar a la solución «ideal». Es más, en lo concerniente a esta materia, puede llegar a ser más didáctico que el alumno yerre inicialmente y no sea capaz de dar con dicha solución puesto que, a cambio, cuando en la siguiente sesión de prácticas se explique la solución correcta, rápidamente será capaz de detectar las bondades del patrón correspondiente en términos de flexibilidad del código frente a su solución.

Por este motivo dichas prácticas no llevarán asociada una nota numérica como tal, sino únicamente dicha calificación de apto o no apto en función del esfuerzo realizado, pues de lo que se trata es de que el alumno las realice libremente, por su cuenta, sabiendo que no es la corrección del diseño final lo que se tendrá en cuenta. Como se ha dicho, en la siguiente sesión de prácticas se dedicará la primera parte de la clase a comentar en clase las distintas soluciones propuestas por los estudiantes debatiendo entre todos las virtudes y defectos de cada, y se corregirá el ejercicio, dejando disponible a los estudiantes el código fuente de la solución para que puedan compararlo con la suya y hacer los cambios oportunos en su diseño e implementación.

Este último punto (dejar el código con la solución a disposición del alumno) consideramos que es una parte esencial del aprendizaje en esta asignatura, y es otro motivo por el que difícilmente se podrían evaluar con una calificación numérica unas prácticas de las que el alumno ya cuenta con la solución.

Por todo ello, la evaluación en la convocatoria ordinaria comprenderá las siguientes actividades:

  • Para superar la parte práctica de la asignatura será necesario, en primer lugar, cumplir los requisitos de la evaluación continua, esto es, haber asistido al menos a un 80 % de las clases prácticas y contar con dicho porcentaje mínimo de evaluaciones positivas de sus entregas de prácticas semanales.
  • Además, habrá un examen práctico consistente en la realización de un ejercicio similar a los planteados en las diferentes sesiones de laboratorio. Se entiende que en dicho examen se evalúa por un lado, y junto a la mencionada calificación de apto o no, el trabajo semanal realizado (que realmente las prácticas presentadas hayan sido hechas de forma autónoma por el alumno), esto es, representa el instrumento con el que cuenta el profesor para la evaluación formativa y continua en la realización de prácticas, y, por otro, tendrá también la consideración de evaluación final de prácticas de laboratorio, teniendo un peso global del 50 % en la nota final, y en el que será necesario obtener una nota igual o superior a cinco para superar la asignatura.
  • Por otra parte, habrá un examen teórico que constará de dos partes: una de preguntas de tipo test, que supondrá el 40 % de la nota de dicho examen, seguida de una serie de preguntas teóricas a desarrollar, así como de pequeños ejercicios de diseño similares a los vistos en clases de seminario, con un peso del 60 % restante en la nota del examen. A su vez, dicho examen teórico supondrá el 50 % de la nota final y, al igual que en el caso del examen práctico, será necesario obtener una nota igual o superior a cinco para superar la asignatura.

Cumplidos todos los requisitos anteriores, la nota final de la asignatura en la convocatoria ordinaria se calculará de acuerdo con la siguiente fórmula:

            Nota final = Nota de teoría × 50 % + Nota de prácticas × 50 %

Cumplidos todos los requisitos anteriores, la nota final de la asignatura en la convocatoria ordinaria se calculará de acuerdo con la siguiente fórmula:

            Nota final = Nota de teoría × 50 % + Nota de prácticas × 50 %

En otro caso, si el alumno se ha presentado a al menos uno de los dos exámenes finales, pero no cumple alguno de los requisitos mencionados (esto es, no alcanza el mínimo en alguno de ellos o no cumple los requisitos de evaluación continua) la nota final de esta convocatoria ordinaria se calculará de la siguiente forma:

            Nota final = mínimo (4, nota según la fórmula anterior)

Quienes no se presenten a ninguno de los dos exámenes figurarán como no presentado.

Por último, si alguien se presentara únicamente a uno de los dos exámenes, para el cálculo de la nota final según las fórmulas anteriores se entenderá que ha obtenido un cero en la otra prueba.

En el caso de los alumnos a quienes se les haya concedido el sistema de evaluación diferenciado, se les exime de la evaluación continua (el requisito de asistencia y entrega de prácticas desaparece).

En el caso de las convocatorias extraordinarias, el requisito de evaluación continua desaparece, y la evaluación se hará únicamente mediante un examen teórico y otro práctico, de la misma naturaleza y con las mismas condiciones que en la evaluación ordinaria. La nota final se calculará, de nuevo, al igual que en la convocatoria ordinaria, mediante la aplicación de las fórmulas anteriores.

Tanto en la convocatoria ordinaria como en la extraordinaria adelantada de mayo, a aquellos alumnos que hayan superado el mínimo en teoría, pero suspendan sin embargo la evaluación de prácticas, o no se presenten al examen práctico, se le dará la opción de conservar dicha nota de teoría para sucesivas convocatorias del presente curso académico, si así́ lo desean, debiendo examinarse en dichas convocatorias únicamente de la parte práctica. La nota de prácticas no se conserva nunca en ningún caso.

De forma excepcional, si las condiciones sanitarias lo requirieren, se podrán incluir métodos de evaluación no presencial, en cuyo caso se informará a los estudiantes de los cambios efectuados.

Éste será el libro de texto básico de la asignatura:

  • Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides. 1995. Design Patterns. Elements of Reusable Object-Oriented Software. Addison-Wesley. Traducción al español de César Fernández Acebal y Juan Manuel Cueva Lovelle: Patrones de diseño: Elementos de software orientado a objetos reutilizable. Pearson Educación, 2003

Así mismo, son recomendables los siguientes libros para distintas partes de la asignatura:

  • Martin Fowler. 1999. Refactoring: Improving the Design of Existing Code. Addison-Wesley
  • Martin Fowler. 2003. UML Distilled: A Brief Guide to the Standard Object Modeling Language (3rd ed.). Addison-Wesley Professional
  • Robert C. Martin. 2008. Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall
  • Steve McConnell. 2004. Code Complete: A Practical Handbook of Software Construction (2nd ed.). Microsoft Press
  • Joshua Bloch. 2008. Effective Java (2nd Edition). Addison-Wesley
  • Elisabeth Freeman, Eric Freeman, Bert Bates and Kathy Sierra. 2004. Head First Design Patterns. O'Reilly Media
  • Joshua Kerievsky. 2004. Refactoring to Patterns. Addison-Wesley Professional
  • Steve Maguire. 1993. Writing Solid Code. Microsoft Press
  • John Ousterhout. 2021. A Philosophy of Software Design (2nd ed.). Yaknyam Press

Y el wiki primigenio contiene discusiones interesantes sobre patrones de diseño:

  • http://c2.com/cgi/wiki?DesignPatterns