next up previous contents
Next: El caso de estudio Up: Un caso de diseño Previous: Un caso de diseño   Contents


Funciones, problemas y diseño modular

El primer presupuesto del paradigma funcional es caracterizar un problema como una función entre conjuntos, a ser definida.

Tal función podría definirse por extensión, si todos los pares de correspondientes fueran conocidos, o bien, en el caso más general, por una expresión que, convenientemente manipulada, determine la imagen de cada objeto del dominio.

Un ejemplo, de aspecto seguramente familiar, de una tal definición es:

$\displaystyle f(x) = 2 * x + 1
$

En definiciones como la anterior, se llama a $ x$ un argumento nominal de $ f$, y será, en todos los casos, una variable que denota un valor genérico del dominio de la función.

A la derecha del símbolo de igualdad hay una expresión que denota la imagen del valor del argumento nominal en la función que está siendo definida. Es útil analizar esta expresión con detalle:

En ella aparecen los símbolos $ *$ y $ +$, que (es de suponer) denotan las funciones producto y suma, aplicadas a constantes y al argumento $ x$. De este modo se indica que, para calcular la imagen de $ x$ en $ f$ deben usarse otras funciones, aplicándolas a $ x$ y a ciertos valores convenientes. De modo que, en definitiva, la definición de $ f$ se muestra como una combinación adecuada de otras funciones.

En general, podría requerirse que las funciones así usadas tuvieran que ser, a su vez, definidas. Esto conduciría, en el caso anterior, a complementar la definición dada con un par de expresiones, de la misma forma, para $ *$ y $ +$, en las cuales habrán de introducirse, a su vez, nuevas funciones. De esta manera:

(a).
La estructura de definiciones sucesivas se organiza, a grandes rasgos, en forma jerárquica, según como cada función aparece en la definición de otra «más compleja».
(b).
En cada definición, las funciones utilizadas a la derecha de la igualdad se referencian simplemente por un nombre. El significado preciso de éste puede conocerse si se lo reemplaza por su propia definición.
(c).
Debe convenirse un modo de terminar esta sucesión de definiciones. La convención consiste en establecer que ciertos nombres no necesitan ser definidos, aceptándose que tienen un significado «sobreentendido».

Este esquema evoca uno de los aspectos más importantes de las técnicas de diseño modular, en particular, la idea de descomposición de un problema complejo en componentes más simples (módulos) que se combinan convenientemente.

Cada uno de ellos representa, nuevamente, un problema que, o bien tiene una solución sobreentendida, o bien es, a su vez, descompuesto de igual forma.

Como en el caso de $ *$ y $ +$, los módulos pueden ser referenciados apenas por un nombre. Esta facilidad es importante, puesto que hace posible que el empleo de un módulo no involucre el conocimiento de su estructura interna, que podría ser compleja, sino simplemente su afecto. Luego, tal estructura puede desarrollarse por separado, asociándola al nombre utilizado a través de otra definición.

Algunos de estos nombres no necesitan tener sus propias definiciones, conviniendose que sus significados son sobreentendidos: corresponderán a modulos primitivos. Los que no sean primitivos, se llamarán abstractos.

Nótese que unos y otros no se distinguen desde el punto de vista de su forma de uso. En ambos casos, ésta consiste, en principio, en citar su nombre.

De hecho, los módulos abstractos pueden pensarse, en virtud de esta característica, como «primitivas potentes». La idea caracteriza el diseño por refinamientos sucesivos:

La estructura de un problema complejo puede diseñarse en términos de componentes pensados como «ya resueltos», que además, pueden efectivamente usarse como tales. Tales componentes se definirán en un siguiente nivel de detalle, si no son primitivos.

Sin embargo, la elección de estos componentes para un problema arbitrario dado no es, en modo alguno, trivial. El enfoque anterior se complementa, en este sentido, con la idea de elegir la descomposición de modo que puedan emplearse, en todo lo posible, soluciones ya desarrolladas, con un mínimo costo de adaptación.

En términos de los lenguajes de programación, ésto hace interesante el estudio de las facilidades que ellos proveen para definir y emplear módulos de aplicación general. Como se verá más adelante, dichas facilidades constituyen uno de los principales atributos de los lenguajes funcionales.

Algunas de estas ideas comenzarán a ser aplicadas enseguida.


next up previous contents
Next: El caso de estudio Up: Un caso de diseño Previous: Un caso de diseño   Contents
Cesar Ballardini
2003-10-14
Hosted by www.Geocities.ws

1