Pildoritas de POO y Java: Introducción

Comenzamos ya sí que sí, estas Pildoritas de POO y Java. Este primer post es puramente introductorio, pero no por ello menos importante.

Vamos a ver muy por encima qué es la programación, un poco de fundamentos de informática relacionados a la misma y el progreso histórico que ha sufrido esta rama hasta llegar a nuestros días. También veremos tres de los pilares fundamentales de la programación comson la Abstración, la Encapsulación y la Modularidad.

Como no me puedo extender demasiado (podría surgir otra serie de Pildoritas si lo hiciera xD), esta parte será muy resumida (aunque no os lo parecerá), así que recomiendo abrir los enlaces a la Wikipedia que hay en el post.

¿Qué es la programación?

Según la wikipedia es “el proceso de diseñar, codificar, depurar y mantener el código fuente de programas computacionales”.

Quizás de primeras esta definición os suene a chino, así que mejor explicarlo un poco mejor.

Un poco de historia

Los ordenadores están compuestos de una CPU, de la Memoria y de los dispositivos de Entrada/Salida. Dentro de la CPU tenemos registros que almacenan estados pequeños, la ALU (Unidad Aritmético-Lógica), encargada de realizar operaciones aritméticas y lógicas, y la Unidad de Control, que coordina el flujo del procesador y comunica a través de los buses de datos la información entre sus diferentes componentes. Esta Arquitectura se denomina Aquitectura Von Neumann, y es la utilizada tanto en el famoso ENIAC, como en el PC o el Smartphone con el que estás leyendo esta pildorita.

A partir de sentencias almacenadas en memoria e interpretadas por la CPU, se pueden realizar funciones que atajen determinados problemas. Estas sentencias, que primero comenzaron como puros 0 y 1, y más adelante con ensamblador hasta llegar a Java, no son más que algoritmos que explican al procesador que operaciones realizar. Eso es lo que comúnmente se conoce como programas informáticos.

Los programas no son más que el código fuente que describe las acciones a realizar por parte de un proceso informático, y un proceso informático es un programa en ejecución. En la definición de la wikipedia se habla del mantenimiento del código fuente de un programa, lo cual es redundante. El código fuente es en sí el programa.

Cuando nosotros “piquemos” en Java estaremos haciendo programas. Cuando ejecutemos ese programa, este será un proceso más en ejecución de nuestro sistema operativo (que no es más que otro proceso).

Desde que el ser humano convive con los ordenadores, ha intentado siempre que la comunicación con el ordenador se realizara en un lenguaje cada vez más amigable para las personas. Es por ello, que la evolución de los lenguajes, hasta llegar a la POO (y otras más novedosas como la Programación Orientada a Aspectos), ha seguido siempre estas tres metas.

Abstracción

Es el proceso mental por el cual el ser humano se centra en lo esencial, ignorando los detalles superfluos.

La abstracción es subjetiva y depende del observador, por lo cual los detalles en cada metodología son diferentes.

Encapsulación

Proceso que oculta las características esenciales del proceso de abstracción utilizado. Por tanto, la encapsulación y la abstracción son complementarios.

Resumiendo, si no es necesario el conocimiento de cierta información, no debe de conocerse.

Modularidad

Descomposición de un programa en trozos independientes (no acoplados) y con significado por si mismos (cohesivos).

Cuando menos acoplado e independientes sea una aplicación, menor será su nivel cohesivo, ya que cuanto más se separe el software resultará más incomprensible. Por otra parte, un software muy acoplado tampoco es bueno, ya que aumenta ingentemente el esfuerzo en el desarrollo y mantenimiento de ese código, por no hablar de que habrá código repetido y redundante.

 

En la persecución de estas tres metas, han surgido muchos paradigmas de programación, pero todos están englobados en dos grandes bloques: programación declarativa y programación imperativa.

Paradigmas de programación

La programación imperativa se describe en términos de estados y de sentencias que cambian dichos estados. En ella, se indica al ordenador en todo momento que tiene que hacer, se le da órdenes. La programación imperativa se divide en muchos otros sub-paradigmas, como la Programación Modular, la Estructura, o la Programación Orientada a Objetos.

Por contraposición, la programación Declarativa no indica al procesador como llegar exactamente a la solución de un problema, sino que establece preposiciones, condiciones, ecuaciones, restricciones, etc. que describen el problema. La programación declarativa está también dividida en otros paradigmas: Lenguajes lógicos, algebraicos y funcionales.

De los dos paradigmas el más extendido de lejos es el imperativo, no obstante, esto no significa que supla en sí el declarativo. Muchos problemas se abordan de mejor forma con uno de los paradigmas y no el otro. Por ejemplo, para programas de carácter científico o matemático, por norma general el paradigma más utilizado es el declarativo.

No obstante, como estas pildoritas van sobre Programación Orientada a Objetos, vamos a centrarnos en la Programación Imperativa para ver rápidamente el desarrollo de este paradigma hasta desembocar en su “opera prima”, la Programación Orientada a Objetos.

Desarrollo de la programación imperativa

Como decía antes, en un principio se microprogramaba, es decir, se indicaba con 0 y 1 las acciones a seguir por la unidad de proceso. Este es lo que se llama Código Máquina, y es el nivel más rudimentario de comunicarse con un ordenador.

Debido a lo complejo y tedioso que resulta implementar problemas medianamente extensos con esta mecánica, se creó el Lenguaje Ensamblador, que utiliza, ya sí, un lenguaje un poco más comprensible para un ser humano.

A partir de identificadores, variables (que sustituían las direcciones de memoria donde se encontraban alojados los datos), constantes en hexadecimal (y no en binario como hasta entonces) y controles de flujo (GO TO), se simplificó enormemente la tarea de programar.

No obstante, este primer lenguaje seguía sin ser una buena solución para programas complejos y extensos, resultando en muchos casos un esfuerzo titánico entender el flujo del programa.

Es por ello que surgió la Programación de Alto Nivel, algo ya más parecido a lo que podríamos ver hoy en día, y que acercaba enormemente los lenguajes de programación a los de los seres humanos. Con ella surgen las Estructuras de Control de flujo de ejecución, y los Subprogramas, aunque no se utilizan de forma permanente.

La imposición de esas dos novedades generaron dos nuevos paradigmas dentro de la Programación Imperativa: La Programación Estructurada y la Modular.

La Programación Estructurada nos da un conjunto de estructuras de control de flujo de comportamiento predecible y los algoritmos quedan expresados mediante jerarquías de composición de dichas estructuras de control. De esta forma resultaba mucho más sencillo codificar y comprender un programa.

El otro paradigma, el Modular, centra la construcción de programas en la realización de módulos, es decir, trozos o porciones de subprogramas y variables independientes. Además, surgieron los conceptos de parte Pública, la que puede ser utilizada fuera de los módulos, y parte Privada, aquella interna del módulo y que el resto de procesos no conoce. Por tanto, este paradigma aumentó considerablemente la abstracción, encapsulación y modularidad en los programas informáticos.

Al igual que estos paradigmas surgieron por el uso sistemático de los conceptos de abstracción, encapsulación y modularidad en la programación de alto nivel, la Programación Orientada a Objetos surgió por el uso sistemático de los Tipos Abstractos de Datos (los módulos) y la Herencia, concepto adquirido de la Inteligencia Artificial. No entraremos en la Herencia hasta la parte teórica de POO, pero basta decir que aumentaba enormemente la cercanía de los lenguajes de programación a nuestra concepción del mundo.

 

Bueno, con esto ya ponemos punto final a la pildorita más coñazo de toda la serie. Espero que la chapa no os haya repelido a leer las próximas entregas, pero este tostón es necesario para aquellos que se acerquen por primera vez al mundo de la programación. ¿Cómo aprender a programar si no tienes ciertos conceptos claros de informática?

Además, yo me he podido dar el gusto de meter una pequeña introducción de la informática y hasta mencionar el ENIAC. Por un momento me he recordado a mi misma cuando estudiaba diciendo “¿Otra vez el coñazo del ENIAC?”

Índice de Pildoritas

Share