jueves, 26 de enero de 2023

Modelos de programación

Programación funcional. Conceptos básicos.

Hemos estado hablando de forma reiterada de funciones y es momento para detenernos brevemente en lo que implica su uso y el basarnos en ellas para desarrollar un algoritmo.




Trabajar con funciones consiste, en esencia, en subdividir un problema general en partes y afrontar cada una de esas partes de modo independiente. Reconstruir el todo consiste en desarrollar procedimientos para interrelacionar las partes dando respuesta al interrogante que inicialmente constituyó el todo.

Aunque esto pueda parecer muy abstracto, en realidad es una forma muy común de proceder cuando nos encontramos con problemas complejos. El famoso "vamos por partes..." no es más que la vulgarización de esta filosofía de trabajo.

Desde el punto de vista de la programación (que es lo que nos ocupa), el siguiente esquema representa el procedimiento de trabajo que supone aplicar el modelo o paradigma funcional.


A partir de un problema planteado genéricamente, vamos identificando sucesivamente las diferentes partes en que se puede ir descomponiendo, ideándolas como funciones, hasta llegar a la función más simple que ya no es necesario o no es posible descompones. Este procedimiento se denomina diseño de arriba a abajo y consiste en aplicar un proceso de refinamiento gradual o por etapas.

En esto consistiría la primera fase del desarrollo del proyecto, siendo la segunda el desarrollo de cada una de las funciones y su implementación en la estructura de relaciones que hemos representado esquemáticamente en la imagen anterior. Este segundo proceso se puede desarrollar, a su vez, mediante dos estrategias básicas:
  • De arriba a abajo
  • de abajo a arriba
Las ventajas de este modo de trabajar se pueden sintetizar como sigue:
  • Simplifica la resolución de problemas complejos.
  • Facilita la comprensión del algoritmo
  • Simplifica la realización de pruebas y la depuración del código
  • Permite reutilizar código
  • Reduce el tiempo de escritura del programa
  • Genera programas más fáciles de mantener y de modificar
  • Facilita trabajar en grupo y la propia organización de este modo de trabajo.
La programación funcional hace uso intensivo de dos conceptos que podemos considerar interrelacionados: abstracción y encapsulamiento.

Aplicándola a la programación funcional, entendemos por abstracción la cualidad que posee una función de poder diferenciar su definición de su uso. Definir una función implica saber cómo es su funcionamiento interno. La abstracción nos permite desconocer dicho funcionamiento sin que ello afecte al uso de la función, siempre que respetemos su forma de funcionar. 

Desde esta perspectiva, la función se comporta como una caja negra (encapsulamiento), de modo que desconocer su código no nos impide beneficiarnos de su funcionalidad. Si la función es mejorada, seguiremos ajenos a su conocimiento, pero nos beneficiaremos de esta mejora igualmente. Esto tiene muchas ventajas (ver el listado anterior), siendo posible, por ejemplo, diferenciar el trabajo de los diferentes creadores del código, y el de estos del que precisa un usuario. También hace posible realizar mejoras parciales sin afectar al funcionamiento general del programa.

Para finalizar esta breve incursión por la programación funcional, decir que existen funciones recursivas que son especialmente interesantes por simplificar procesos de programación que, de realizar de modo lineal, supondría aplicar complejos procesos iterativas. Una función recursiva es sencillamente aquella que se llama a si misma. Veamos un sencillo ejemplo realizado en Python:

def factorial(n):
    if n==0:
        return 1
    else:
        return n * factorial(n-1) # En este punto se produce la reutilización de la función
   dentro de la misma función (recursividad)

def main():
    n=eval(input("Introduce un entero positivo para calcular su factorial: "))
    print("El factorial de ", n , " es ", factorial(n))

main()  

No hay comentarios:

Publicar un comentario

Comenta esta entrada