> Manuales > Manual de iniciación a la programación

Qué son los paradigmas de desarrollo del software, los estilos o tipos de programación que podemos llegar a utilizar al desarrollar aplicaciones. A veces un lenguaje puede permitir organizar el código con diversos paradigmas al mismo tiempo.

Paradigmas de la programación

En este artículo del Manual de iniciación a la programación vamos a ver los distintos estilos de programación que encontramos actualmente en la industria del software. En un pasado artículo hablamos brevemente de los tipos de lenguajes, destacando los de alto y bajo nivel. Ahora no se trata de analizar el lenguaje en sí, sino el paradigma que implementan, es decir cómo tendremos que programar con ellos.

La idea es, como siempre en este manual, tener una visión global de qué nos podemos encontrar en nuestro camino como programadores, aunque a decir verdad se podrían llenar prácticamente libros enteros con cada uno de estos paradigmas.

Qué es un paradigma de la programación

Los paradigmas de la programación son estilos que se siguen a la hora de programar un software. Como estilo podemos referirnos a muchas cosas, por ejemplo las estructuras de control que vengamos utilizando, o la manera de estructurar los programas, incluso las piezas elementales que tendrán éstos.

A lo largo de la historia del software se han incorporado diferentes paradigmas que iban agregando mejores posibilidades de organización del código, aportando mayor claridad y la posibilidad de crear el software componiéndolo con piezas más pequeñas y por lo tanto menos complejas. Los lenguajes de programación a lo largo del tiempo han nacido con el paradigma que estaba más establecido en el momento de su creación, aunque muchos han ido evolucionando e incorporando la posibilidad que los programadores usasen otros estilos o paradigmas de la programación si lo deseaban. Es así como actualmente la mayoría de los lenguajes implementan diversos tipos de programación, lo que se conoce a veces como multi-paradigma.

Los tipos o técnicas de programación son bastante variados, aunque puede que muchos de los lectores sólo conozcan un método para realizar los programas. En la mayoría de los casos, las técnicas se centran en programación modular y programación estructurada, pero existen otros tipos de programación. Los explicaremos a lo largo del artículo.

El paradigma o estilo de programación más usado actualmente es la programación imperativa en la que realizamos algoritmos con acciones que se van ejecutando una detrás de otra. De este modo imperativo le decimos al ordenador, paso a paso, todas las cosas que debe de hacer para resolver un problema. La programación imperativa tiene varios estilos de programación, como la estructurada o la orientada a objetos. Como contraposición a ella tenemos el paradigma funcional o el lógico. De todo ello hablaremos a continuación.

Programación estructurada (PE)

La programación estructurada esta compuesta por un conjunto de técnicas que han ido evolucionando aumentando considerablemente la productividad del desarrollador y la posibilidad de estructurar el programa en piezas pequeñas como son las funciones. Gracias a ellas se consiguió reducir el tiempo de depuración y mantenimiento del software.

Antes de la programación estructurada los programas eran listados enormes en los que no había separación del problema, simplemente líneas de código una detrás de otra. Los programas se ejecutaban secuencialmente, pero el programador podía en un momento dado enviar el flujo de ejecución a otra línea del listado, generando flujos poco predecibles y poco intuitivos.

Esta programación estructurada utiliza un número limitado de estructuras de control y creando un flujo bien definido de ejecución del software. Esto facilita la comprensión de los programas, reduce considerablemente los errores y facilita la extensibilidad y adaptabilidad del código.

Esta técnica incorpora:

Diseño descendente (top-dow): el problema se descompone en etapas o estructuras jerárquicas. Cada uno de los elementos de esa jerarquía tiene una responsabilidad, las piezas de arriba de la jerarquía son más generales y las de abajo más concretas.

Recursos abstractos (simplicidad): consiste en descompones las acciones complejas en otras más simples capaces de ser resueltas con mayor facilidad. Podemos comenzar diseñando la estrucutra más superior, más abstracta, apoyándonos en subprogramas (a menudo denominados funciones) que vamos imaginando que existen, aunque no estén todavía desarrollados. A medida que se van desarrollando los subprogramas, se pueden apoyar en otros, hasta llegar a niveles de complejidad elemental y muy concretos.

Estructuras básicas: existen tres tipos de estructuras básicas:

Las principales ventajas de la programación estructurada son:

Un programa esta estructurado si posee un único punto de entrada y sólo uno de salida, existen de "1 a n" caminos desde el principio hasta el fin del programa y por último, que todas las instrucciones son ejecutables sin que aparezcan bucles infinitos.

Programación modular

En la programación modular tenemos distintos módulos de los que forma parte un programa. Según el autor pueden referirse a módulos como funciones, o como distintos ficheros de código.

Si entendemos la programación modular como el hecho de poder trabajar con funciones, podríamos decir que consta de varias secciones dividas de forma que interactúan a través de llamadas a procedimientos, que integran el programa en su totalidad.

Procedimientos y funciones son la misma cosa. Aunque hay lenguajes que distinguen entre ellos, diciendo que los procedimientos simplemente hacen cosas y las funciones hacen cosas y devuelven valores. Pero esto es algo propio del lenguaje. Recomendamos inicialmente entenderlos como sinónimos y, si nuestro lenguaje hace una distinción, entonces saber qué significado le han dado para hacer las cosas correctamente.

En la programación modular, entendida como dividida en funciones, el programa principal coordina las llamadas a los módulos secundarios y pasa los datos necesarios en forma de parámetros. A su vez cada modulo puede contener sus propios datos y llamar a otros módulos o funciones.

Sin embargo, también podemos entender la programación modular como aquella que está compuesta por módulos. Antes de la programación modular un programa podía tener cientos o miles de líneas en un solo archivo. Sin embargo, moverse por un archivo tan largo y encontrar lo que queremos es muy complejo. Por eso actualmente los lenguajes permiten dividir el código de los programamas en distintos archivos, que tienen unidades de control relacionadas entre sí.

Dentro de un módulo (un archivo independiente de los muchos que pueden componer un programa) podemos encontrar artefactos como clases, interfaces (de las que vamos a hablar a continuación) o incluso simples funciones. Existirá un módulo principal que es el que inicia la ejecución del programa, que se apoyará en módulos secundarios con piezas de software que va necesitando para poder realizar sus tareas.

Programación orientada a objetos (POO)

Se trata de una técnica que aumenta considerablemente la sencillez del código, creando estructuras llamadas clases que nos permiten agrupar funcionalidades acotadas y bien definidas. Gracias a la programación orientada a objetos se suele adquirir mayor velocidad de desarrollo de los programas gracias y unos grados de reutilización del código mucho mayores. Sin embargo, lo más importante es que nos permite una organización mayor, lo que acaba posibilitando que se puedan desarrollar programas más complejos.

Antes de la programación orientada a objetos se dice que un programa podría llegar a tener 100.000 líneas de código antes de volverse inmanejable. Gracias a la programación orientada a objetos es posible llegar a 1.000.000 de líneas de código sin que todo se vuelva un caos. Esto son números simplemente para hacernos una idea de la magnitud de la mejora, pero no los tomes al pie de la letra. Por supuesto, la capacidad de realizar un buen diseño del software también influye en una variación de estos números, por lo que depende mucho del programador o el equipo de desarrollo.

Solemos explicar el concepto de la programación orientada a objetos mirando el mundo real. En nuestra vída encontramos sistemas que están compuestos por muchas piezas (por ejemplo el cuerpo humano compuesto de corazón, cerebro, miembros, etc.) que colaboran entre sí para realizar sus funciones. Luego, cada una de esas piezas, como el cerebro, puede estar compuesta de diversos elementos, como las neuronas y las conexiones nerviosas. A su vez esas piezas se componen de otras y así hasta que llegamos a las menos complejas que podríamos considerarlas las células.

Entendiendo esto podemos decir que en el mundo de la programación orientada a objetos también construimos sistemas que tienen objetos que colaboran entre si para realizar las funcionalidades de las aplicaciones. Unos objetos se apoyan en otros más concretos, hasta que llegamos a objetos que solamente se apoyan en elementos básicos como números o cadenas de caracteres. Sin embargo, el paradigma orientado a objetos va bastante más allá y esto es solamente una simplificación para entender el estilo de programación.

La herencia y el polimorfismo son unas de sus principales características y por ello dedicaremos más adelante un artículo exclusivamente a tratar estos dos términos.

En DesarrolloWeb.com hemos publicado un manual completo para explicar lo que es la programación orientada a objetos.

Programación concurrente

Este tipo de programación se utiliza cuando tenemos que realizar varias acciones a la vez. Se entiende como varias acciones a la vez a procesos separados que se ejecutan al mismo tiempo, en paralelo.

En al programación generalmente se ejecuta el código con un único flujo secuencial. En la programación concurrente podemos tener varios hilos de ejecución que se ejecutan al mismo tiempo, pasando a la vez por varios puntos del código de la aplicación.

Se suele utilizar para controlar los accesos de usuarios y programas a un recurso de forma simultanea. Por ejemplo podemos tener un sistema de red en el que, cada vez que un cliente se conecta, se crea un hilo de ejecución para atenderlo.

Se trata de una programación más compleja y laboriosa que la programación secuencial, por lo que solamente se usa cuando realmente es necesario para resolver una funcionalidad concreta dentro de las aplicaciones.

Programación funcional

La programación funcional se caracteriza por no especificar las acciones de manera imperativa, sino declarativa. En la programación funcional no tenemos asignaciones, sino simplemente funciones que se alimentan unas a otras con su salida. Es un poco más compleja que la programación imperativa (la más común) porque requiere declarar y llamar a funciones dentro de otras funciones, con lo que es fácil perder la noción de lo que se está haciendo, ya que no vemos claramente el "paso a paso" que permite la programación imperativa.

La programación funcional es uno de los paradigmas más importantes, creado hace muchos años pero que durante décadas no ha llegado a cuajar. Actualmente muchos lenguajes de programación funcional están adquiriendo cierta relevancia porque hay algunos problemas que se resuelven de manera mucho más sencilla y elegante con este estilo de programación. Sin embrgo, sigue siendo minoritaria.

Paralelamente, algunos lenguajes de programación tradicional, imperativa, están haciendo posible incorporar recursos que vienen de la programación funcional, pero eso no quiere decir que implementen el paradigma funcional de manera fiel.

Programación lógica

Es otro paradigma de la programación que existe de manera tradicional pero que no ha llegado a extenderse de manera relevante. Se trata de una programación basada en el cálculo de predicados (una teoría matemática que permite lograr que un ordenador basándose en hecho y reglas lógicas, pueda dar soluciones inteligentes).

Se suele utilizar en la inteligencia artificial y pequeños programas infantiles, pero no existen muchos lenguajes que la implementen.

Conclusión

Este ha sido un artículo de cultura general sobre los tipos de programación que nos podemos encontrar en nuestra vida profesional. Lo más normal es que los vayamos estudiando en distintas etapas de nuestra vida como programadores.

Generalmente los primeros estilos de programación que se estudian son los estructurados. Luego se aprende la programación orientada a objetos, que nos aporta nuevas maneras de entender y organizar el software. Finalmente, si somos profesionales dedicados a una área particular puede que nos toque aprender lenguajes funcionales. No te preocupes ahora por saberlo todo, como decíamos la idea es tener un conocimiento general de las posibilidades del desarrollo de software. Lo mejor es ir poco a poco.

En el siguiente artículo vamos a cambiar algo de tercio, ofreciendo una charla en la que queremos mostraros posibilidades del lenguaje Javascript, enfocadas en personas que quieren aprender desde cero este lenguaje.

Luego seguiremos ofreciendo más conceptos esenciales de la programación.

Sara Alvarez

Equipo DesarrolloWeb.com

Manual