© FUOC • P05/75062/00112 14 <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>nte<strong>de</strong> este modo hasta completar un algoritmo completamente formal y concreto.Podéis notar que esta forma <strong>de</strong> expresar <strong>la</strong> resolución tiene el inconveniente<strong>de</strong> que en cada nivel <strong>de</strong>bemos reescribir el algoritmo y al final <strong>de</strong>l <strong>de</strong>sarrollo,si tenemos muchos niveles, po<strong>de</strong>mos encontrarnos con un algoritmo muy <strong>la</strong>rgoy muy difícil <strong>de</strong> compren<strong>de</strong>r a causa <strong>de</strong> los numerosos <strong>de</strong>talles que abarca.Esta técnica<strong>de</strong> refinamiento...... es <strong>la</strong> que hemos utilizadopara aplicar los esquemas.Una forma más a<strong>de</strong>cuada <strong>de</strong> expresar nuestro <strong>diseño</strong> se basa en <strong>la</strong>s herramientasque nos proporciona <strong>la</strong> notación algorítmica. Po<strong>de</strong>mos encapsu<strong>la</strong>r medianteacciones y/o funciones parametrizadas cada subproblema a resolver. Por otro<strong>la</strong>do, po<strong>de</strong>mos encapsu<strong>la</strong>r cada objeto complejo mediante los constructores <strong>de</strong>tipos, o <strong>de</strong>c<strong>la</strong>rando nuevos tipos (enumerativos, etc.). De este modo, en cadanivel escribimos ya un algoritmo y una acción y/o función con total precisióny formalidad, y no reescribimos <strong>la</strong>s partes ya resueltas <strong>de</strong>l <strong>diseño</strong>. El uso <strong>de</strong> parámetrosnos permitirá alcanzar <strong>la</strong> máxima in<strong>de</strong>pen<strong>de</strong>ncia entre niveles y entrelos subproblemas p<strong>la</strong>nteados, pues nos concentraremos en una parce<strong>la</strong> limitada<strong>de</strong>l problema global.La especificación <strong>de</strong> acciones y/o funciones tendrá una doble utilidad: por un<strong>la</strong>do, servirá <strong>de</strong> puente entre niveles para verificar <strong>la</strong> corrección <strong>de</strong> <strong>la</strong>s solucionesp<strong>la</strong>nteadas, asumiendo que <strong>la</strong>s acciones y/o funciones utilizadas en el nivel <strong>de</strong>estudio cumplen <strong>la</strong> especificación dada, y por otro <strong>la</strong>do, <strong>la</strong> especificación <strong>de</strong> unaacción y/o función es en sí el enunciado formalizado <strong>de</strong>l subproblema que hayque resolver en el nivel que corresponda. Si en el <strong>diseño</strong> <strong>de</strong> <strong>la</strong> acción y/o funciónse respeta <strong>la</strong> especificación, el <strong>diseño</strong> global funcionará como se espera.Reflejaremos el análisis <strong>de</strong>scen<strong>de</strong>nte <strong>de</strong>l problema mediante los mecanismos<strong>de</strong> encapsu<strong>la</strong>do que nos ofrece <strong>la</strong> notación algorítmica (<strong>de</strong>finición<strong>de</strong> tipos, constructores <strong>de</strong> tipos y acciones y/o funciones).Siguiendo nuestro ejemplo <strong>de</strong> trabajo, el resultado <strong>de</strong>l primer nivel queda <strong>de</strong><strong>la</strong> siguiente forma:algoritmo AnalisisCorreccionesvarResultadosAnalisisTexto: tDatosAnalisis;Frase: tFrase;fvar{ Pre: en <strong>la</strong> entrada tenemos una secuencia <strong>de</strong> frases, T, que pue<strong>de</strong> estar vacía. Cadafrase <strong>de</strong> T contiene información para saber si es necesario corregir<strong>la</strong> o no }InicioResultadosAnalisis(ResultadosAnalisisTexto);ObtenerFrase(frase);mientras no UltimaFrase(Frase) hacerActualizaResultadosAnalisis(frase, ResultadosAnalisisTexto);ObtenerFrase(frase)fmientrasEn esta solución...... sólo aparecen los comentarios<strong>de</strong> <strong>la</strong> precondición y <strong>la</strong>postcondición. La elección<strong>de</strong> unos nombres apropiadosa <strong>la</strong>s acciones, funciones yvariables hace que no seannecesarios más comentarios,si <strong>de</strong>spués especificamos cadauna <strong>de</strong> <strong>la</strong>s acciones y/o funciones.Esto lo veremos más a<strong>de</strong><strong>la</strong>nte,y completará el nive<strong>la</strong>ctual <strong>de</strong> trabajo.
© FUOC • P05/75062/00112 15 <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>nteescribirResultadosAnalisis(ResultadosAnalisisTexto);{ Post: en el caso <strong>de</strong> que no sea necesario corregir T no se escribe nada. En el caso <strong>de</strong>que T sea un texto por corregir, se generará en <strong>la</strong> salida una secuencia R formadapor tres elementos:R1 representa <strong>la</strong> media <strong>de</strong> pa<strong>la</strong>bras que hay que corregir por frase <strong>de</strong> T.R2 representa el porcentaje <strong>de</strong> frases que hay que corregir en T.R3 representa el máximo <strong>de</strong> pa<strong>la</strong>bras que hay que corregir por frase <strong>de</strong> T }falgoritmoObservad que <strong>la</strong> última solución presentada por el primer nivel tiene <strong>la</strong> particu<strong>la</strong>ridad<strong>de</strong> ser sintácticamente correcta. Sin embargo, no es completa porque faltapor <strong>de</strong>finir el tipo tFrase y un conjunto <strong>de</strong> acciones y/o funciones (obtenerFrase, yultimaFrase), y el tipo tDatosAnalisis con sus acciones (inicioResultadosAnalisis, actualizaResultadosAnalisis,y escribirResultadosAnalisis), que se <strong>de</strong>berán <strong>de</strong>finir en unsegundo nivel.A pesar <strong>de</strong> que no es completa, hay otra ventaja que po<strong>de</strong>mos aprovechar: po<strong>de</strong>mosrazonar <strong>la</strong> corrección <strong>de</strong> <strong>la</strong> solución hasta ahora formu<strong>la</strong>da sin necesidad<strong>de</strong> conocer los <strong>de</strong>talles <strong>de</strong> los tipos aún no <strong>de</strong>finidos, ni <strong>de</strong> cómo <strong>la</strong>sacciones y/o funciones realizarán el efecto que se espera <strong>de</strong> el<strong>la</strong>s, que todavíaestán por <strong>de</strong>sarrol<strong>la</strong>r. La especificación <strong>de</strong> cada una <strong>de</strong> <strong>la</strong>s acciones o funcionesque hay que <strong>de</strong>sarrol<strong>la</strong>r nos indica cuál es su efecto; a partir <strong>de</strong> aquí po<strong>de</strong>mosrazonar <strong>la</strong> corrección <strong>de</strong> <strong>la</strong> solución formu<strong>la</strong>da. Cuando se <strong>de</strong>sarrolle el siguientenivel, si <strong>la</strong>s acciones o funciones <strong>de</strong>sarrol<strong>la</strong>das respetan sus precondiciones ypostcondiciones, se mantendrá <strong>la</strong> corrección <strong>de</strong>l nivel actual. La especificaciónjuega aquí un papel importante <strong>de</strong> puente entre niveles, ya que ayuda a separarel qué <strong>de</strong>l cómo.La corrección <strong>de</strong> <strong>la</strong> solución nos viene asegurada por el hecho <strong>de</strong> que hemosaplicado el esquema <strong>de</strong> recorrido a una secuencia <strong>de</strong> frases. En <strong>la</strong> solución propuestahemos consi<strong>de</strong>rado una última frase que actúa como marca <strong>de</strong> final <strong>de</strong>secuencia. Es preciso averiguar si esta frase es sólo una marca o si es al mismotiempo una frase que se <strong>de</strong>be tratar y una marca.Si examinamos el enunciado, observamos que al final <strong>de</strong>l texto tendremos doscaracteres “.”. El primer punto pertenece a <strong>la</strong> última frase “real” <strong>de</strong>l texto. El segundopunto pue<strong>de</strong> verse como un punto que cierra una frase vacía (no tieneninguna pa<strong>la</strong>bra) y sólo sirve para marcar el final <strong>de</strong>l texto. La frase vacía indicaráel fin <strong>de</strong> <strong>la</strong> secuencia <strong>de</strong> frases; por lo tanto, no es necesario tratar<strong>la</strong> (analizar<strong>la</strong>,en este caso). Sólo hay que analizar cada frase leída no vacía, acumu<strong>la</strong>ndolos resultados <strong>de</strong> su análisis en el objeto ResultadosAnalisisTexto. Cuando salgamos<strong>de</strong> <strong>la</strong> iteración mientras , habremos analizado todas <strong>la</strong>s frases “reales” <strong>de</strong>ltexto (es <strong>de</strong>cir, con caracteres y, por lo tanto, con contenido), y ResultadosAnalisisTextotendrá el resultado <strong>de</strong>l análisis global <strong>de</strong>l texto.Uno <strong>de</strong> los puntos...... fuertes <strong>de</strong> los esquemas resi<strong>de</strong>en que conocemos todos los<strong>de</strong>talles <strong>de</strong> su funcionamiento ocomportamiento, que nos sirven<strong>de</strong> base para razonar cómodamentesobre <strong>la</strong> corrección<strong>de</strong>l algoritmo o fragmento <strong>de</strong>algoritmo resultante <strong>de</strong> <strong>la</strong> aplicación<strong>de</strong> los esquemas.A<strong>de</strong>más, el hecho <strong>de</strong> que el algoritmo no entre en <strong>de</strong>talles <strong>de</strong>l tipo no <strong>de</strong>finido,pues <strong>la</strong> responsabilidad <strong>de</strong> estos <strong>de</strong>talles pertenece a <strong>la</strong>s acciones y/o funcionesque tratan el tipo, hace que <strong>la</strong> <strong>de</strong>finición concreta <strong>de</strong> tFrase sea irrelevanteLa orientación a objetos nos facilitauna separación <strong>de</strong> los problemasmuy efectiva para <strong>de</strong>scomponerlosen subproblemas in<strong>de</strong>pendientes.