04. Diseño descendente
Objetivos
Los objetivos de este módulo son:
- Entender el concepto de diseño descendente.
- Ser capaces de analizar problemas de cierta complejidad y descomponerlos en subproblemas más sencillos con la aplicación de la técnica de diseño descendente por refinamientos sucesivos.
- Darse cuenta de que a la hora de descomponer los problemas para el diseño, hay maneras de hacerlo más convenientes y efectivas que otras. La elección de abstracciones convenientes al problema y el seguimiento de las pautas indicadas en este módulo te llevarán a descomposiciones efectivas.
- Saber aplicar los conceptos estudiados en los otros módulos para resolver cada uno de los subproblemas sencillos mediante la abstracción de código y datos.
Introducción
En Fundamentos de Programación vimos que podemos modularizar nuestro código mediante acciones, funciones e incluso librerías. La modularización del código se plantea como una técnica para hacer que nuestro código sea más legible, mantenible y reutilizable. El diseño descendente es una técnica que nos permite reducir problemas complejos a problemas más simples de forma sistemática. Esta reducción en subproblemas es equivalente al concepto de modularidad, por tanto, estamos sistematizando lo que ya habíamos visto desde un punto de vista más práctico.
Diseño descendente
Leed cuidadosamente el siguiente documento. Veréis que en algunos ejemplos también se utiliza la formalización de algoritmos, por lo tanto es importante que hayáis revisado el módulo de precondiciones y postcondiciones antes de leer el documento.
Ejemplo
En el documento anterior hemos visto ejemplos desde un punto de vista formal. En el siguiente documento, que forma parte de las transparencias de síntesis de la introducción, veremos un ejemplo de diseño descendente desde un punto de vista más práctico. En este caso, se utilizan comentarios para definir los subproblemas que habrá que afrontar.