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

12.07.2015 Views

© 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 }

© 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” }

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!