Introducción a la metodología de diseño descendente
Introducción a la metodología de diseño descendente Introducción a la metodología de diseño descendente
© FUOC • P05/75062/00112 50 Introducción a la metodología de diseño descendentefacturaPaginas{ Post: crea la secuencia de salida t = y (si E i ≠ ‘NoIdentificados’, E i es un nombre de empresa cliente que hay en S)y (F i es el importe correspondiente a la empresa E i de todas las palabras no gratuitas quehay en las páginas de S que pertenecen a E i )y (todas las E i presentes en t son diferentes)y (si no hay ningún E i que sea igual a “NoIdentificados”,m es el número de empresas diferentes de S) }y (si existe una E i igual a “NoIdentificados”,m – 1 es el número de empresas identificadas diferentes de S) }Planteamiento del algoritmo principalLa solución consistirá en hacer que por cada página que obtenemos de la secuencia, identifiquemosa la empresa cliente, calculemos el importe de su factura y lo acumulemos en unaestructura de datos que guarda a las empresas clientes identificadas con los importes facturadoshasta el momento. Se trata, pues, de aplicar el esquema de recorrido sobre la secuenciade páginas. El tratamiento para cada página consistirá en actualizar una estructura de datosque mantiene la facturación de todas las empresas clientes que han ido apareciendo o apareceránmás adelante en S a medida que vayamos progresando. Denominaremos a este objetoFacturas, y ya veremos sus detalles en el nivel del diseño correspondiente.Identificamos el esquema que hayque aplicar, y hacemosabstracciones nuevas.Entendemos que la última página consistirá sólo en la palabra gratuita ‘FinPaginas’ y, portanto, no será necesario tratarla.Aplicación directa del algoritmoCon todo esto, el algoritmo principal resulta de la forma siguiente:Particularizamos la solucióndel esquema de recorridopara este problema.algoritmo facturaPaginas;varfacturas: tFacturas;pagina: tPagina;fvarinicializarFacturas(Facturas);obtenerPagina(Pagina);mientras no ultimaPagina(Pagina) hacerfacturaPagina(Pagina, Facturas);obtenerPagina(Pagina)fmientrasescribirFacturas(Facturas);falgoritmoEspecificación de las accionesaccion obtenerPagina(sal p: tPagina){ Pre: la parte derecha de S contiene una subsecuencia que es una página, como mínimo, ola página especial “FinPaginas”. Denominamos página E a esta subsecuencia. }{ Post: P representa la página E }funcion ultimaPagina (p: tPagina): booleano{ Pre: p = P }{ Post: ultimaPagina (p) es cierto cuando P representa la última página }accion inicializarFacturas(sal F: tFacturas){ Pre: }{ Post: hay 0 empresas propietarias en F }accion facturaPagina (sal p: tPagina; entsal f: tFacturas){ Pre: p = P y f = F y F contiene el importe total por propietarios de páginas procesadas anteriormentepor facturaPagina }{ Post: en f se ha acumulado el importe de P correspondiente al propietario de P. Si P no tienepropietario, el importe se ha acumulado en el propietario especial “NoIdentificados” }
© FUOC • P05/75062/00112 51 Introducción a la metodología de diseño descendenteaccion escribirFacturas(sal f: tFacturas){ Pre: f = F }{ Post: crea una secuencia de salida con la estructura , donde n i es unasubsecuencia de caracteres que representa a un propietario de páginas F y acaba en blanco, ei i es una subsecuencia de caracteres dígitos acabada en blanco que representa el importe totalque hay en F para el propietario n i }2)Segundo nivel: Páginas y FacturasEn este nivel tenemos dos abstracciones: pagina y facturas.a) Pasemos primero a trabajar la abstracción página:– Abstracciones utilizadas: palabra.– Identificación secuencia: página vista como una secuencia de palabras. La obtención delos elementos primero y siguiente se hará por medio de las acciones leerPrimeraPalabra yleerPalabra, y el reconocimiento de la palabra que marca el final será la palabra “FinTexto-HTML”. En el caso especial de estar en la última página, ésta contendrá sólo “FinPáginas”.Definición de los tiposLo único que interesa de una página es conocer a su propietario y el importe de la factura.En el caso de la última página, lo único que interesa es saber que se trata de la última. Definiríamos,pues, el tipo tPagina de la forma siguiente:tipotPagina = tuplapropietario: tPalabra;importe: real;final: booleano;ftuplaftipoPlanteamientos y solucionesIdentificación del esquema: recorrido con identificación previa de si se trata de la última página.accion obtenerPagina (sal p: tPagina)varpalabra, palabraNoIdentificados, palabraFinPaginas, palabraFinTextoHTML, palabra-Propiedad: tPalabra;fvarinicializaPalabraNoIdentificados(palabraNoIdentificados);inicializaPalabraFinPaginas(palabraFinPaginas);inicializaPalabraFinTextoHTML(palabraFinTextoHTML);inicializaPalabraPropiedad(palabraPropiedad);p.Importe := 0.0;p. Propietario := palabraNoIdentificadas; { Lo inicializamos en “NoIdentificados” por siacaso no tiene propietario }leerPrimeraPalabra(palabra);si palabrasIguales(palabra, palabraFinPaginas) entoncesp.final := ciertosinop.final := falsomientras no palabrasIguales(palabra, palabraFinTextoHTML) hacersi palabrasIguales(palabra,palabraPropiedad) entoncesleerPalabra(palabra);p.Propietario := palabrasinocontabilizaPalabra(palabra, p.Importe);leerPalabra(palabra)fsifmientrasfsifaccion { obtenerPagina }
- Page 1: Introduccióna la metodologíade di
- Page 5 and 6: © FUOC • P05/75062/00112 5 Intro
- Page 7 and 8: © FUOC • P05/75062/00112 7 Intro
- Page 9 and 10: © FUOC • P05/75062/00112 9 Intro
- Page 11 and 12: © FUOC • P05/75062/00112 11 Intr
- Page 13 and 14: © FUOC • P05/75062/00112 13 Intr
- Page 15 and 16: © FUOC • P05/75062/00112 15 Intr
- Page 17 and 18: © FUOC • P05/75062/00112 17 Intr
- Page 19 and 20: © FUOC • P05/75062/00112 19 Intr
- Page 21 and 22: © FUOC • P05/75062/00112 21 Intr
- Page 23 and 24: © FUOC • P05/75062/00112 23 Intr
- Page 25 and 26: © FUOC • P05/75062/00112 25 Intr
- Page 27 and 28: © FUOC • P05/75062/00112 27 Intr
- Page 29 and 30: © FUOC • P05/75062/00112 29 Intr
- Page 31 and 32: © FUOC • P05/75062/00112 31 Intr
- Page 33 and 34: © FUOC • P05/75062/00112 33 Intr
- Page 35: © FUOC • P05/75062/00112 35 Intr
- Page 38 and 39: © FUOC • P05/75062/00112 38 Intr
- Page 40 and 41: © FUOC • P05/75062/00112 40 Intr
- Page 42 and 43: © FUOC • P05/75062/00112 42 Intr
- Page 44 and 45: © FUOC • P05/75062/00112 44 Intr
- Page 46 and 47: © FUOC • P05/75062/00112 46 Intr
- Page 48 and 49: © FUOC • P05/75062/00112 48 Intr
- Page 52 and 53: © FUOC • P05/75062/00112 52 Intr
- Page 54 and 55: © FUOC • P05/75062/00112 54 Intr
- Page 56 and 57: © FUOC • P05/75062/00112 56 Intr
© FUOC • P05/75062/00112 50 <strong>Introducción</strong> a <strong>la</strong> <strong>metodología</strong> <strong>de</strong> <strong>diseño</strong> <strong>de</strong>scen<strong>de</strong>ntefacturaPaginas{ Post: crea <strong>la</strong> secuencia <strong>de</strong> salida t = y (si E i ≠ ‘NoI<strong>de</strong>ntificados’, E i es un nombre <strong>de</strong> empresa cliente que hay en S)y (F i es el importe correspondiente a <strong>la</strong> empresa E i <strong>de</strong> todas <strong>la</strong>s pa<strong>la</strong>bras no gratuitas quehay en <strong>la</strong>s páginas <strong>de</strong> S que pertenecen a E i )y (todas <strong>la</strong>s E i presentes en t son diferentes)y (si no hay ningún E i que sea igual a “NoI<strong>de</strong>ntificados”,m es el número <strong>de</strong> empresas diferentes <strong>de</strong> S) }y (si existe una E i igual a “NoI<strong>de</strong>ntificados”,m – 1 es el número <strong>de</strong> empresas i<strong>de</strong>ntificadas diferentes <strong>de</strong> S) }P<strong>la</strong>nteamiento <strong>de</strong>l algoritmo principalLa solución consistirá en hacer que por cada página que obtenemos <strong>de</strong> <strong>la</strong> secuencia, i<strong>de</strong>ntifiquemosa <strong>la</strong> empresa cliente, calculemos el importe <strong>de</strong> su factura y lo acumulemos en unaestructura <strong>de</strong> datos que guarda a <strong>la</strong>s empresas clientes i<strong>de</strong>ntificadas con los importes facturadoshasta el momento. Se trata, pues, <strong>de</strong> aplicar el esquema <strong>de</strong> recorrido sobre <strong>la</strong> secuencia<strong>de</strong> páginas. El tratamiento para cada página consistirá en actualizar una estructura <strong>de</strong> datosque mantiene <strong>la</strong> facturación <strong>de</strong> todas <strong>la</strong>s empresas clientes que han ido apareciendo o apareceránmás a<strong>de</strong><strong>la</strong>nte en S a medida que vayamos progresando. Denominaremos a este objetoFacturas, y ya veremos sus <strong>de</strong>talles en el nivel <strong>de</strong>l <strong>diseño</strong> correspondiente.I<strong>de</strong>ntificamos el esquema que hayque aplicar, y hacemosabstracciones nuevas.Enten<strong>de</strong>mos que <strong>la</strong> última página consistirá sólo en <strong>la</strong> pa<strong>la</strong>bra gratuita ‘FinPaginas’ y, portanto, no será necesario tratar<strong>la</strong>.Aplicación directa <strong>de</strong>l algoritmoCon todo esto, el algoritmo principal resulta <strong>de</strong> <strong>la</strong> forma siguiente:Particu<strong>la</strong>rizamos <strong>la</strong> solución<strong>de</strong>l esquema <strong>de</strong> recorridopara este problema.algoritmo facturaPaginas;varfacturas: tFacturas;pagina: tPagina;fvarinicializarFacturas(Facturas);obtenerPagina(Pagina);mientras no ultimaPagina(Pagina) hacerfacturaPagina(Pagina, Facturas);obtenerPagina(Pagina)fmientrasescribirFacturas(Facturas);falgoritmoEspecificación <strong>de</strong> <strong>la</strong>s accionesaccion obtenerPagina(sal p: tPagina){ Pre: <strong>la</strong> parte <strong>de</strong>recha <strong>de</strong> S contiene una subsecuencia que es una página, como mínimo, o<strong>la</strong> página especial “FinPaginas”. Denominamos página E a esta subsecuencia. }{ Post: P representa <strong>la</strong> página E }funcion ultimaPagina (p: tPagina): booleano{ Pre: p = P }{ Post: ultimaPagina (p) es cierto cuando P representa <strong>la</strong> última página }accion inicializarFacturas(sal F: tFacturas){ Pre: }{ Post: hay 0 empresas propietarias en F }accion facturaPagina (sal p: tPagina; entsal f: tFacturas){ Pre: p = P y f = F y F contiene el importe total por propietarios <strong>de</strong> páginas procesadas anteriormentepor facturaPagina }{ Post: en f se ha acumu<strong>la</strong>do el importe <strong>de</strong> P correspondiente al propietario <strong>de</strong> P. Si P no tienepropietario, el importe se ha acumu<strong>la</strong>do en el propietario especial “NoI<strong>de</strong>ntificados” }