Programación: Guía Completa

 

Guía de la Programación

Todo lo relacionado con el mundo de la Programación lo vas a encontrar aquí, para que puedas crear lo que quieras con el uso de la imaginación y de todos los sistemas y herramientas puestas a tu disposición.

ÚLTIMOS ARTÍCULOS:

Dónde aprendo CSS
Aprender CSS: En el complejo, pero fascinante mundo del desarrollo web, existen etapas que tarde o temprano todo programador, sin ...
Leer Más

En la era en que vivimos, el uso de los ordenadores se ha hecho prácticamente imprescindible en nuestra vida cotidiana, por ello, la programación informática, es aprovechada por millones de personas a nivel mundial cada día.

Se automatizan tareas, se planifican reuniones, se controlan grandes maquinarias, se comunican millones de personas en un instante, cada segundo se ejecutan procesos que manualmente tardarían semanas, meses y hasta años en llevarse a cabo.

En cada uno de estos procedimientos, se cuenta con la colaboración de al menos un programa informático. Pero, ¿Cómo se realizan todos estos programas que facilitan nuestras vidas?, ¿Qué hay más allá de esa pantalla que con un par de clicks o algunos golpes de teclado permiten que se creen aplicaciones maravillosas?

Las repuestas a interrogantes anteriores (y muchas más), las encontramos cuando estudiamos la Programación Informática, a la cual nos estaremos refiriendo simplemente como “Programación” en el resto de esta guía.

 

¿Qué es la Programación?

Podemos definir la programación como el proceso que permite diseñar, codificar en lenguaje de máquina y mantener, las instrucciones correspondientes al código fuente que da origen a un programa informático.

Mediante la programación se establecen los pasos e instrucciones a seguir para la creación y mantenimiento del código fuente de programas informáticos.

El objetivo de la programación es simplemente crear un software con un determinado propósito, el cual se repetirá de manera idéntica cada vez que se ejecute el código fuente el programa diseñado.

 

¿Qué es el Código Fuente?

Cuando hablamos de el código fuente o (Source Code en Inglés) de un programa informático, nos estamos refiriendo al conjunto de instrucciones, dispuestas de manera conveniente, para indicarle al ordenador la acción o las acciones que debe realizar.

El código fuente está basado en un lenguaje de programación que interpreta las directrices deseadas para que el ordenador finalmente las entienda y las ejecute.

 

¿Qué es un Algoritmo?

Un algoritmo simplemente, una serie ordenada de operaciones que tienen como propósito, buscar la solución a un problema o realizar la ejecución de un proceso determinado.

Los algoritmos son muy importantes en la programación porque permiten tener una idea clara y precisa del proceso que se desea realizar antes de plasmarlo en el código fuente sin importar el lenguaje de programación que vaya a ser utilizado; por ello, es una buena práctica, y además muy conveniente, la utilización de algoritmos cuando realizamos algún programa informático.

Un algoritmo puede ser representado de distintas formas, entre las cuales podemos mencionar las siguientes:

  • En lenguaje natural: Cuando hablamos de lenguaje natural, nos referimos al lenguaje hablado por los humanos, sin importar el idioma. Para ello precisamente, solo se necesita conocer el idioma utilizado para entenderlo, sin embargo, dependiendo de la manera en que haya sido realizado, puede prestarse a ambigüedades obteniendo una interpretación incorrecta del proceso descrito.
  • A través de diagramas de flujos o flujogramas: Es una de las representaciones gráficas de algoritmos más antiguas, sin embargo aún siguen siendo utilizadas debido a su practicidad y facilidad de uso. En un diagrama de flujo, se utilizan “cajas” las cuales indican situaciones específicas dentro del proceso tales como: Inicio o fin del algoritmo, ingreso de datos, tomas de decisiones, entre otras. En la siguiente imagen podemos apreciar los elementos utilizados en un flujograma y su distinto significado:

Comprar Dominio Web

  • Haciendo uso de Pseudocódigos: Los pseudocódigos, también llamados códigos falsos, se refieren a la representación de un algoritmo informático de programación, compuestos por convenciones estructurales que se utilizarán en un lenguaje de programación verdadero, pero que están diseñados para la lectura humana en lugar de la lectura de un ordenador, y que en definitiva, no depende de ningún lenguaje de programación en específico.
  • Normalmente, dentro de un pseudocódigo se pueden omitir detalles que no son imprescindibles para la comprensión del algoritmo por parte de un ser humano, tales como declaraciones de variables, algunas subrutinas y alguna por ción de código específico del sistema. Se utilizan principalmente en entornos científicos y educativos, así como en las etapas previas al desarrollo de un software, a manera de boceto o diseño preliminar,  antes de proceder a la codificación en algún lenguaje de programación.

A continuación podemos ver un ejemplo gráfico de cómo se vería un pseudocódigo y un diagrama de flujo (flujograma) para realizar la lectura de 3 valores, los cuales serán almacenados en las variables A, B y C respectivamente.

Se debe validar que A, B y C sean valores distintos entre sí, y presentar una alerta en el caso de que sean iguales. Una vez que se ha validado que los valores de A, b y C son distintos, se debe identificar cuál de los valores es el mayor y cuál es el menor.

Flujograma y Algoritmo

Se puede apreciar la diferencia entre ambas técnicas, sin embargo, ambas describen el mismo proceso de manera bastante práctica.

 

Características básicas de los Algoritmos

Entre las principales características de los algoritmos podemos destacar las siguientes:

  • Precisos: Los algoritmos son definidos de manera estricta, no dan lugar a ambigüedades e indicar el orden de realización de cada paso.
  • Definidos: Un algoritmo puede repetirse la cantidad de veces que sea necesaria y siempre deberá arrojar el mismo resultado
  • Finitos: Siempre tienen un punto de partida o apertura y un punto de cierre, ya que describen el procedimiento a ejecutar desde el principio hasta el final.
  • Puede tener o no elementos de entrada: En un algoritmo se pueden utilizar elementos iniciales que permitan comenzar el proceso de acuerdo a determinadas condiciones o bien, puede darse el caso que el algoritmo no necesite elementos iniciales para comenzar.
  • Debe arrojar siempre un resultado: Los pasos ejecutados en el algoritmo deben dar lugar a un resultado determinado.
  • Deben ser legibles: El texto que lo describe debe ser claro, tal que permita entenderlo y leerlo fácilmente
  • Entre dos algoritmos que lleven al mismo resultado, se recomienda siempre elegir aquel que realiza el proceso en un número menor de pasos, es decir, el más corto de los dos.

En un algoritmo se deben identificar tres partes:

  1. Entrada de datos, los cuales se refieren a los datos que el algoritmo necesita como insumo para ser ejecutado.
  2. Proceso: Es la secuencia de pasos establecidos que deben seguirse para ejecutar el algoritmo.
  3. Salida: Son los resultados obtenidos después de la ejecución del Proceso.

 

Algoritmos cualitativos

Son aquellos en donde los pasos involucrados no incluyen cálculos numéricos, por ejemplo, una receta de cocina simple, una rutina de ejercicio físico, los pasos para hallar un tesoro, entre otros.

 

Algoritmos cuantitativos

Son aquellos en donde están involucrados cálculos numéricos, por ejemplo, solucionar una ecuación matemática.

 

Tipos de Programación

Existen distintos tipos o métodos de programación, dependiendo de los métodos y técnicas utilizadas. Entre ellos podemos mencionar los siguientes:

 

Programación Imperativa

Es uno de los tipos de programación más generales, ya que describe la programación en términos del estado del programa y sentencias que, al ser ejecutadas, cambian dicho estado.

Los programas imperativos están compuestos por instrucciones, que le indican al ordenador cómo realizar una tarea, de una forma análoga a la manera imperativa que se utilizaría con un ser humano, cuando se le pide realizar una tarea en específico.

Es un tipo de programación ampliamente utilizado, sin embargo, al depender de variables globales, puede dificultar el razonamiento, depuración y escalabilidad del código implementado.

Algunos lenguajes de programación utilizados en modo imperativo son: BASIC, C, Fortran, Pascal, PHP, Perl, Java, Phyton, Javascript.

 

Programación Declarativa

A diferencia de la programación imperativa, se trata de un tipo de programación basado en la declaración de un conjunto de condiciones, mediante las cuales se le explica al ordenador lo que debe hacer para resolver un problema, sin importar la manera que el ordenador utilice para ejecutar el procedimiento propuesto..

Las ventajas de utilizar la programación declarativa dependen principalmente del lenguaje de programación que se esté utilizando.

Por ejemplo, si utilizamos un lenguaje de programación de tipo funcional, la principal ventaja es que al trabajar con funciones, no necesitamos preocuparnos por el estado de la información, ya que los datos sean inmutables.

Observemos el siguiente ejemplo:

Queremos realizar un código que nos permita sumar los números del 1 al 100, dependiendo del lenguaje de programación que utilicemos, una posible solución sería algo como esto:

Programación Imperativa

Utilizando la programación declarativa, pudiéramos reducir todo el código anterior por algo tan simple como esto:

Programación Declarativa

Evidentemente, para implementar el segundo código necesitaremos de un lenguaje de programación que nos permita ejecutar la función “SUM”, lo interesante de la comparación entre ambos códigos, es que el programador no tiene idea de cómo, a nivel interno, el ordenador estaría realizando la suma de los números para llegar al resultado, porque simplemente, a diferencia del primer código, en el segundo código se le indicó al ordenador lo que debía hacer y no cómo debía hacerlo.

Entre las principales ventajas de la programación declarativa, se destaca que la solución de un problema se puede realizar con un nivel de abstracción elevado, sin necesidad de entrar en detalles irrelevantes de implementación, lo cual permite que las soluciones sean entendidas por otras personas, de un amanera más simple.

En contraparte, la desventaja principal de utilizar programación declarativa, es que está limitada al subconjunto de problemas o funciones definidos en el lenguaje de programación utilizado.

Algunos de los lenguajes de programación más comunes, utilizados en programación declarativa, son SQL y HTML.

 

Programación Estructurada

Este tipo de programación surgió a finales de la década de los años 70, permitiendo obtener programas eficientes y fiables y al mismo tiempo, con una estructura muy bien organizada, lo cual les permite ser más fáciles de comprender a nivel de código, y muy prácticos al momento de realizar actividades tales como pruebas, mantenimiento y modificación de los mismos.

La Programación Estructurada establece que todas las bifurcaciones de control de un programa se encuentran estandarizadas, por lo tanto, es posible leer y comprender la codificación del programa mismo desde su inicio hasta el final en forma continua, sin tener que realizar saltos entre líneas dentro del mismo programa.

Cuando un programa es fácil de leer y comprender, tiende a ser de mantenimiento rápido y simple, además de que permiten que la documentación correspondiente se realice de manera organizada y precisa.

En este paradigma de programación, la estructura del programa, se basa en tres estructuras principales:

  1. Secuencia: Es una sucesión sencilla de dos o más operaciones. Su objetivo principal radica en que las instrucciones de un programa sean ejecutadas, una tras otra, en el mismo orden en el cual aparecen en el programa. Un ejemplo de estructura secuencial a nivel de código sería algo como esto:

INPUT a

INPUT d

auxiliar= a

a= d

d= auxiliar

PRINT a

PRINT d

Representado en un diagrama de flujos se observaría de esta forma:

Estructura secuencial

Podemos observar en ambos casos, que cada una de las instrucciones se ejecutan a continuación de la instrucción anterior.

  1. Selección: Se refiere a la selección entre dos o mas acciones. La decisión tomada, se basa en una condición específica, utilizando instrucciones como If – Else, Switch o Case, dependiendo del lenguaje de programación utilizado. Podemos apreciar un ejemplo de código selectivo a continuación:

IF b > c THEN

PRINT b ; ” es mayor que ” ; c

ELSE

PRINT b ; ” no es mayor que ” ; c

END IF

Si representamos esta estructura en un diagrama de flujo veríamos la siguiente imagen:

Estructura Selectiva

  1. Iteración: Se define como la repetición de una instrucción o conjunto de instrucciones, siempre y cuando se cumpla una condición previamente establecida. Dependiendo del lenguaje de programación que utilicemos, podemos encontrar estructuras cíclicas o bucles como Do, For o While. El código de un bucle o iteración se puede apreciar de la siguiente forma:

x= 0

y= 5

DO WHILE y > x

PRINT x

x= x + 1

LOOP

En un diagrama de flujo, se puede apreciar una iteración de esta manera:

Bucle

El teorema de la programación estructurada establece que con la combinación de estas tres estructuras (Secuencia, Selección e Iteración), puede escribirse cualquier programa o función computable que deseemos realizar.

 

SEGMENTACIÓN

Es una técnica empleada para facilitar la comprensión. Un ejemplo práctico para lograr este fin, es establecer segmentos de código fuente no mayores a una página de codificación, es decir, aproximadamente unas 50 líneas de código.

La segmentación no se trata solo particionar un programa en trozos de 50 líneas de código; ya que se debe cumplir con ciertas características esenciales:

La segmentación debe permitir que los distintos segmentos se relacionen entre sí de jerárquicamente, construyendo una estructura de árbol.

A través de un diagrama de procesos se puede representar gráficamente esta organización, facilitando la comprensión de la relación existente entre un segmento y el resto del programa.

Una segmentación bien estructurada, debe hacer énfasis en las relaciones existentes entre las distintas funciones, de manera que el objetivo del programa sea fácilmente identificable y comprensible. Esto permitirá que los cambios que se efectúen a una parte del programa, bien sea durante la programación original o su mantenimiento, no afecten de ninguna manera al resto del programa que permanece inalterable.

En una segmentación bien organizada, la comunicación entre cada uno de los  segmentos se realiza en forma controlada.

Algunos autores recomiendan que los segmentos sean manejados como procedimientos, y la única comunicación existente entre ellos sea a través de la transmisión una lista de parámetros, esto puede ayudar en el objetivo de que interactúen entre ellos de una manera fluida o entendible.

 

Identación

Es una técnica que permite mejorar la legibilidad humana del código fuente de un programa. Se basa en la utilización de espacios en blanco o sangrías de manera conveniente.

La Identación puede ser de gran ayuda para el ojo humano, ya que permite identificar comienzos y finales de estructuras de código específicas. tal como se muestra continuación, donde ambos programas realizan la misma función, pero el segundo es más fácil de comprender, verificar y corregir.

Código en Lenguaje C sin Identación:

#include <stdio.h>

int main ()

{

int j, k;

for (j = 0; j <= 5; j++){

for (k = 0; k <= 5; k++){

printf(“%j x %j = %j\n”, j, k, j * k);

}

}

return 0;

}

Código en Lenguaje C con Identación:

#include <stdio.h>

int main ()

{

int j, k;

for (j = 0; j <= 5; j++) {

for (k = 0; k<= 5; k++) {

printf(“%j x %j = %j\n”, j, k, j * k);

}

}

retorno 0;

}

 

Características de la Programación Estructurada:

En resumen, las características principales que definen a la Programación Estructurada son:

  • Los programas escritos de esta manera, ofrecen una excelente presentación y una estructura muy bien organizada, pueden ser leídos de forma secuencial, sin necesidad de realizar saltos de líneas de código.
  • La organización del código permite la reducción del esfuerzo empleado en realizar pruebas y depuración del mismo, comparado con otras técnicas de programación.
  • Reducción de los costos de mantenimiento. Facilidad en la detección de errores y en la inclusión de nuevas estructuras de código.
  • Se facilita el diseño y confección de programa que se desea realizar.
  • Bloques de código de fácil comprensión, lo cual facilita la documentación del programa en general.
  • Las instrucciones de salto, como GOTO, no están expresamente prohibidas dentro de la Programación Estructurada, sin embargo, su uso queda reservado solo para casos en donde sea realmente imprescindible su uso.
  • Aunque la programación Estructurada presenta muchas ventajas, también debemos mencionar que cuando se obtiene un bloque de programa único, y el mismo es demasiado grande, el manejo del código fuente puede convertirse en un problema. Debido a esto, se puede combinar con la programación modular, la cual estaremos revisando a continuación.

 

Programación Modular

Esta técnica de programación surge a partir de los problemas generados en la programación estructurada cuando los bloques de código se hacían muy grandes y difíciles de manejar al momento de realizar algún mantenimiento, depuración o escalabilidad del mismo.

La Programación Modular permite la división de un problema en módulos o en subproblemas más simples que permitan obtener de forma mas simple la solución del problema original.

Si estas divisiones no llegaran a ser lo suficientemente eficientes, se deben seguir creando subproblemas hasta que se encuentre el resultado deseado y poder ser manipulados con cualquier lenguaje de programación.

A esta técnica de programación se le conoce como refinamiento sucesivo, en inglés “Top Down”, también se le denomina  “descendente” o “divide y vencerás”

El diseño descendiente se refiere a aquel que comienza desde lo más general y va progresando hasta lo más específico. Los problemas grandes, se irán convirtiendo en subproblemas muchos más pequeños y más sencillos de manejar.

 

Características de la Programación Modular

  • Fácil comprensión del código, a causa de la modularidad
  • Reutilización de módulos, lo cual permite ahorro y optimización del código implementado.
  • Disminuye la complejidad global del algoritmo utilizado.
  • Disminuye el tamaño total del código empleado y por ende del programa.
  • Facilidad de encontrar los errores en el programa.
  • La segmentación en módulos permite que un bloque de código pueda ser modificado sin afectar el resto del código.
  • Permite que el código sea independiente del lenguaje de programación utilizado.
  • Los módulos son llamados rutinas o subrutinas, los cuales son conocidos como procedimientos y funciones en los distintos lenguajes de programación .

Los procedimientos y funciones son subprogramas diseñados para realizar tareas específicas.

Para invocarlos, o indicarle a nuestro programa que se ejecuten, es necesario escribir el nombre del procedimiento o función desde el código principal o inclusive desde otro procedimiento o función.

La diferencia entre procedimiento y función viene dada por la manera en que reaccionan luego de ejecutar el proceso que se les haya programado.

Un procedimiento está diselado para realizar una tarea y al finalizar, debe retornar al punto donde fue invocado, en cambio una función, luego de ejecutarse, devuelve un valor, el cual es retornado al punto donde fue invocado.

Tanto los procedimientos como las funciones, se deben declarar en alguna parte dentro del código del programa.

La declaración de cualquiera de estas dos estructuras no le indica al programa que debe ejecutarlas inmediatamente, solo estarán disponibles para cuando sean llamadas o invocadas por el código principal o por cualquier otra función o procedimiento.

 

Programación Orientada a Eventos

Es un tipo de programación, en el cual el flujo del programa está definido por eventos o sucesos que ocurren desde el mismo programa o a través de otros hilos de ejecución.

Las aplicaciones desarrolladas a través de este método de programación, implementan un bucle principal, también conocido como main loop, en el cual se ejecutan las dos porciones principales de la aplicación, llamadas: Selector de eventos y Manejador de eventos.

El selector de eventos y el manejador de eventos, le permiten al programa interactuar en cualquier momento con el usuario.

 

Propiedades o Atributos

Una propiedad es una característica que describe algo sobre un objeto como un botón o un formulario. Dependiendo de la propiedad, la misma puede ser asignada en tiempo de diseño, usando la ventana Propiedades del entorno de programación y/o en tiempo de ejecución al programar.

A continuación, mostramos dos ejemplos de propiedades en un formulario de Visual Basic.

  • MinButton. Esta propiedad puede tomar como valores: TRUE (verdadero) o FALSE (falso). Esto permitirá que el formulario posea o no, un botón minimizar.
  • BackColor. Esta propiedad permite que se pueda cambiar el color de fondo del botón o formulario.

La programación orientada a eventos surgió a finales de los años 70, cuando los sistemas estaban pensados para trabajar como cadenas de ensamblaje en donde se usaba una entrada y se producía como resultado una salida que sería a su ve utilizada por otro programa.

 

Métodos

Los métodos son funciones, las cuales son llamadas desde cualquier parte del programa, pero a diferencia de los procedimientos, no son programadas por el usuario, sino que vienen ya pre-diseñadas con el lenguaje de programación utilizado.

Cada elemento como formulario, botón, etiqueta, etc, posee métodos que pueden ser utilizados por los programadores.

Los métodos solo pueden ser utilizados en tiempo de ejecución.

Veamos el siguiente diagrama:

programación orientada a eventos

  • Ocurre un flujo de datos que invoca eventos o transacciones.
  • Un disparador los envía a esos eventos a manejadores especializados.
  • El conjunto de manejadores se encarga de realizar operaciones sobre el flujo de datos.

La función del disparador es analizar los eventos para determinar su naturaleza y posteriormente enviarlos al manejador correspondiente, el cual está diselado para trabajar con eventos de esa naturaleza.

El disparador debe procesar un flujo de eventos, por lo tanto consiste en un un bucle de eventos que son enviados a un manejador, para posteriormente volver a un estado de escucha o espera de nuevos eventos que disparar.

Es posible la existencia de un evento particular que interrumpa la ejecución del bucle, a ese tipo de eventos se les llama eventos “finalizadores” y son muy comunes en todas las librerías para escribir aplicaciones GUI.

También puede ocurrir la posibilidad, que el disparador se encuentre con un evento de naturaleza desconocida o para el cual no exista un manejador definidio; en esos casos, el disparador debe descartar el evento o arrojar una excepción que puede ser contralada a través del código.

Veamos un ejemplo de código en Visual Basic:

Private Sub Button1_Click()

Label1.Caption = “Has pulsado el botón Número 1… “

End Sub

En el código anterior, se ha programado el evento “Click” del objeto “Button1”, es decir, el código inmerso entre las líneas “Private Sub Button1_Click()” y “En sub”, será ejecutado cada vez que el usuario haga click en el botón llamado “Button1”.

En este ejemplo se asigna el texto “Has pulsado el botón o pulsado enter… ” a la etiqueta llamada “Label1” a través de la propiedad “Caption”.

En algunas ocasiones es posible que el disparador y los manejadores no puedan atender o procesar los eventos con la misma rapidez que los mismos son capturados, por lo cual, es muy común que se implemente una cola de eventos.

Esta lógica suele ser delicada, y si no se implementa de manera correcta, puede originar cuellos de botella bastante problemáticos.

Lenguajes de programación típicos de este paradigma son: Visual Basic y Javascript, entre otros.

Visual Basic

La programación orientada a eventos, si bien es bastante práctica en la mayoría de los casos, puede suponer un problema importante en determinados momentos, ya que, por su propia naturaleza, el flujo de ejecución del software escapa del control del programador.

En la programación clásica, el flujo del programa está a cargo del programador, el cual es el único que decide el orden de ejecución de los procesos, en cambio en la programación orientada a eventos, es el propio usuario quien decide el flujo del proceso a medida que va provocando eventos.

Con la aparición en los años noventa, de la programación orientada a objetos, surgieron nuevos diseños como ESA (Essential Systems Analysis) y también JSD (Jackson System Development), los cuales acabaronla antigua forna de pensar en métodos estructurados.

 

Programación Orientada a Objetos

La programación Orientada a objetos (POO) o OOP por sus siglas en Inglés, (Object – Oriented Programming) es una forma particular de programar, mucho más parecida a como manejamos las cosas en la vida real, que otros tipos de programación.

Como su nombre lo indica, está basada en objetos, los cuales manipulan los datos de entrada para la obtención de resultados específicos.

Uno de los objetivos principales de la POO, establece que el código implementado pueda ser reutilizado de forma práctica y sencilla, sin importar si se trata de códigos aislados de programas diferentes o inclusive de diferentes programadores.

La POO puede resultar compleja para quien no esté familiarizado con el concepto, por ello es importante establecer una base teórica sólida que permita aprovechar todas las ventajas que ofrece este modelo de programación.

 

Pensando en Objetos

Un objeto se puede definir como todo aquello que pueda ser identificable, bajo un rango de requerimientos o problemas, y además posea características como:

  • Tenga estados definibles, atributos o propiedades (grande, pequeño).
  • Posea comportamientos asociados (puede caminar, hablar, saltar, etc). Éstos comportamientos son denominados “métodos”.
  • Tienen la capacidad de comunicarse con otros objetos a través de sus métodos

Para comprender con mayor claridad, como la POO trata los objetos, podemos utilizar el siguiente ejemplo:

En un típico caso de la vida real, pensemos en un coche, el cual será nuestro elemento principal, ya que posee una serie de características, como podrían ser el color, la marca, el modelo, entre otras propiedades.

Adicionalmente a estas características, existen otras variables como, por ejemplo, el coche puede ponerse en marcha, detenerse o aparcarse.

En un esquema de POO, como habrás imaginado, el coche sería nuestro objeto. El color, la marca y el modelo, serían las propiedades asociadas a nuestro objeto “coche” y las funcionalidades de ponerse en marcha, detenerse y aparcar serían los métodos asociados a nuestro objeto “coche”.

 

caracteristicas de la poo

 

¿Qué son las Clases?

Una vez que hemos entendido el concepto de objeto, podemos deducir el concepto de Clases. Las clases son declaraciones de objetos, también se podrían definir como abstracciones de objetos.

Es decir, una clase es una especie de plantilla en donde se agrupan las propiedades y los métodos de un objeto, una vez que éste sea “instanciado” o creado.

La clase es la “definición” de un objeto. En el ejemplo anterior, en donde utilizamos el coche como nuestro objeto, en realidad estuvimos definiendo la clase “coche”, que al momento de ser instanciada se convertirá en el objeto “coche”.

Para entender la diferencia entre objeto y clase veamos el siguiente ejemplo:

A través del siguiente código, estaremos crenado la clase “persona”

public class Persona {

public String nombre;

public String apellido;

public int edad;

public void saltar(){

}

}

Podemos observar que la clase persona tiene como propiedades: “nombre”, “apellido” y “edad”. De igual manera posee la acción de “Saltar” como método.

Una vez que la clase persona es creada, puede ser utilizada en cualquier parte de nuestro código para instanciar o crear un objeto.

public class Main {

public static void main(String[] args) {

Persona Maria= new Persona();

// Ahora que María es persona, puede saltar.

Maria.saltar();

}

}

A través del código anterior, hemos utilizado la clase persona para crear el objeto María, el cual automáticamente posee todas las propiedades y métodos asociados a la clase persona, es decir, podemos referirnos a la “edad” y al “nombre” de María, así como también podemos ejecutar el método “Correr” sobre dicho objeto.

Por ejemplo, pudiéramos asignar la propiedad edad de la siguiente forma. Obviamente, la sintaxis de la instrucción depende del lenguaje de programación que estemos utilizando, pero en líneas generales sería algo muy similar a esto:

Maria.edad=25

De igual manera, si quisiéramos invocar alguno de los métodos asociados a nuestro objeto, estaríamos utilizando una instrucción parecida a esta:

Maria.saltar()

Los métodos siempre terminan con la apertura y cierre de paréntesis. En algunos casos será necesario enviar parámetros, por ejemplo, el método “Saltar” de nuestro ejemplo, podría aceptar como parámetros “Alto” y “Bajo” y en base a ellos tomar acciones distintas.

La instrucción, en el caso de utilizar parámetros sería algo como esto:

Maria.Saltar(“Alto”)

 

¿Qué es un Constructor?

Todo objeto debe tener un constructor, el cual no es otra cosa que un método que crea una instancia del objeto.

 

Reutilización de código

En la Programación estructurada observamos que podíamos reutilizar código a través del uso de funciones y procedimientos. En la POO podemos también reutilizar código a través de funciones, y procedimientos, pero además podemos hacerlo a través de métodos y a través de una propiedad de la POO llamada “Herencia”.

 

Herencia

Es una característica particular de la POO, la cual hace posible que una clase, a la que llamaremos “Padre”, transmita todas sus propiedades y métodos hacia una clase que llamaremos “Hija”. Es una de las ventajas más importantes dentro de la POO, ya que permite aprovechar código y reducir el tiempo invertido en codificación, evitando el rediseño, la modificación y verificación del código ya implementado.

La herencia permite que se puedan sobrescribir los métodos de la clase “Padre” en la clase “Hija”, esto permite que, aunque ambas clases sean idénticas al momento de crearse la clase “hija”, ésta puede ser modificada de acuerdo a las necesidades del programador, el cual no tiene que escribir la clase completa, y solo tendría que enfocarse en los métodos que necesita cambiar.

Veamos un ejemplo de herencia en el lenguaje de programación Java:

Supongamos que tenemos una clase llamada “Persona”, la cual contenga propiedades comunes como: Nombre, apellidos, color de cabello y ojos, etc. y métodos que identifiquen las acciones que realizan las personas, tales como: Hablar, caminar, saludar, entre otras. A partir de esta clase “Persona” podemos tener una clase adicional heredada de ella, la cual llamaremos “Futbolista”.

public class Futbolista extends Persona{

//Atributos:

public String Posicion;

//Metodos:

public void PracticarPenales(){

//TODO: implementar

}

public void DispararAPuerta(){

//TODO: implementar

}

}

En el lenguaje de programación Java, la palabra “Extends” indica que una clase se está heredando a partir de otra.

Si utilizamos las clases creadas en nuestro código principal basado en Java, observaríamos lo siguiente:

public class Main {

public static void main(String[] args) {

// Instanciar al nuevo Futbolista:

Futbolista LionelMessi = new Futbolista();

//Estas son propiedades de la clase Persona:

Futbolista.nombre = “Lionel Messi”;

Futbolista.edad = 30;

//Esta es propiedad de Futbolista:

Futbolista.posicion = “Delantero”;

//Estos son métodos de Futbolista:

Futbolista.DispararAPuerta();

Futbolista.PracticarPenales();

}

}

Podemos apreciar que, aunque las propiedades nombre y edad no están definidas en la clase “Futbolista”, podemos utilizarlas ya que vienen heredadas de la clase “Persona”, la cual es la clase que dio origen a la clase “Futbolista”

Existen lenguajes de programación que permiten aplicar un concepto más complejo de herencia, llamado “Herencia Múltiple”, mediante el cual una clase “hija” puede heredar de más de una herencia “Padre”.

 

Programación Orientada a Objetos

 

Encapsulamiento

El encapsulamiento es una propiedad de la POO, utilizada para esconderu ocultar las características principales de un objeto, de manera que la estructura del mismo no pueda ser modificado por otros objetos, ofreciendo un efecto de caja negra, en la cual, la interacción entre objetos, no se realiza directamente sino mas bien a través de sus interfaces correspondientes.

A través del encapsulamiento se pueden mantener ocultos los procesos internos que necesita para ejecutar el código, dándole al programador acceso sólo a lo que necesita.

Esto tiene dos ventajas importantes:

  1. Todo lo que el usuario realice con el objeto puede ser controlado internamente (inclusive sus errores), evitando que todo colapse por una intervención indeseada.
  2. La segunda ventaja es que, al hacer que la mayor parte del código esté oculto, podemos realizar cambios y/o mejoras sin que eso afecte el modo como los usuarios van a utilizar nuestro código o como otros objetos pudieran interactuar con nuestro objeto encapsulado

Piensa, por ejemplo, en un televisor como un objeto. Es una caja negra, cuyo funcionamiento interno es ignorado por la mayoría de las personas, simplemente no nos importa mientras las funciones básicas del televisor estén disponibles (Encender, apagar, cambiar de canal, subir y bajar volumen, entre otras)

El televisor estaría encapsulado para que sus funciones internas sean inaccesibles para los usuarios y solamente estén disponibles las funciones para operarlo, lo cual evita el riesgo de alterar su funcionamiento interno, por ejemplo, no hay manera (o no debería haberla) de que utilizando las funciones básicas (cambiar, de canal, subir y bajar volumen, etc.) provoquemos una falla eléctrica que dañe el televisor.

 

Ventajas del encapsulamiento.:

  • La complejidad de la implementación de nuestro código queda escondida al resto de los objetos. Esto se ve reflejado en la vida real, yo quiero que mi televisor funcione, pero no quiero saber cómo funciona la pantalla, ni los circuitos electrónicos en su interior.
  • La implementación de un objeto puede ser alterada por el programador sin que ello afecte a los objetos que interactúan con él. Esto se debe a que el resto de los objetos tienen acceso a algunos de los métodos del objeto y no tienen idea del funcionamiento interno del mismo. De esta manera, si la implementación del objeto (que es algo interno de la clase) varía, el resto de los objetos no se ven afectados.
  • Se protege al objeto de usos indebidos o inapropiados. Si los atributos son accedidos a través de métodos, es posible realizar ciertas validaciones, ya que no son asignados de manera directa, por ejemplo, el método “subirVolumen” de nuestro televisor no debería asignar valores mayores a 100 ya que podría dañar los parlantes del televisor; esto es fácilmente manejable a través del método correspondiente.

Dependiendo del lenguaje de programación utilizado, se tienen reglas distintas de visibilidad para atributos, métodos y / o clases, dichas reglas son:

Privado: Visible sólo para la misma clase y para las clases amigas o pertenecientes al mismo paquete, dependiendo del lenguaje de programación utilizado.

Protegida: Visible sólo para las subclases o clases derivadas.

Pública: Visible para todas las clases con las cuales el objeto está asociado.

Feedly el feed para seguirnos

 

Polimorfismo

Podemos definir Polimorfismo como la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento, dependiendo de los parámetros utilizados durante su invocación.

Un objeto polimórfico es una entidad que puede contener valores de diferentes tipos durante la ejecución del programa.

En palabras más sencillas, el Polimorfismo permite definir clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se comportan de manera distinta. Se puede aplicar tanto a funciones como a tipos de datos.

Dentro del polimorfismo podemos encontrar:

  • Polimorfismo de Sobrecarga: También es conocido como Polimorfismo Ad-Hoc, y se define como aquel que ocurre cuando existen funciones con el mismo nombre, y funcionalidad similar, en clases que son independientes una de otra. Es el compilador quien decide en tiempo de ejecución a cuál método se deberá llamar.
  • Polimorfismo Paramétrico: Es la capacidad de definir varias funciones que utilizan el mismo nombre, pero haciendo uso de parámetros diferentes (tipo y/o nombre). El polimorfismo paramétrico selecciona de manera automática, el método correcto a ejecutar dependiendo del tipo de datos pasados como parámetro.

Es posible que el compilador no identifique a cuál método llamar en tiempo de compilación, por lo cual tendría que identificarlo en tiempo de ejecución.

Podemos ver el siguiente ejemplo: Definimos varios métodos homónimos llamados:  addition() efectuando una suma de valores.

  • El método int addition (int,int) devuelve como resultado la suma de dos números enteros.
  • El método float addition (float, float) devuelve como resultadola suma de dos flotantes.
  • El método char addition (char, char) devuelve como resultado la suma de dos caracteres definidos por el autor.

Veamos un ejemplo de Polimorfismo de Sobrecarga en C#, en el cual encontramos tres versiones sobrecargadas del método “Suma”:

using System;

public class Calculadora

{

public double Suma (int a, int b)

{

return a + b;

}

public double Suma (double a, double b)

{

return a + b;

}

public static void Main()

{

Calculadora calc = new Calculadora();

Console.WriteLine (“Suma de enteros: 3 + 5 = {0}”, calc.Suma(3, 5));

Console.WriteLine (“Suma de decimales (double): 3.5 + 5.3 = {0}”, calc.Suma(3.5, 5.3));

}

}

El Polimorfismo facilita la adición de nuevos elementos y la extensibilidad de la aplicación en futuras iteraciones del desarrollo.

 

SCRUM

No se trata de manera propia de un tipo de programación, sino más bien de una metodología ágil y flexible, que puede ser aplicada para cualquier tipo de proyecto, pero no queremos dejar de mencionarla en este artículo ya que en los últimos años ha sido muy utilizada en proyectos de programación llevados a cabo por equipos de programadores.

En la metodología SCRUM intervienen los siguientes perfiles:

  • Product Owner: Es la voz del cliente y del resto de interesados pero no involucrados directamente en el proyecto. Es el Product Owner, quien se encarga de definir los objetivos del proyecto al mismo tiempo que garantiza el modo de trabajo ideal para el alcance de los objetivos propuestos
  • Scrum Master: Es aquel que se encarga de asegurar que el resto del equipo no tenga inconvenientes para asumir sus tareas y funciones. También sirve como ayuda al Scrum Team, guiándolos para garantizar el cumplimiento de objetivos. En otras palabras, este perfil motiva al equipo a mantenerse productivo y activo en todo momento.
  • Scrum Team: Es el equipo que desarrolla y entrega el producto. Es aquí donde estarían ubicados los programadores.
  • Stakeholders: Acá se encuentran los interesados de alguna manera en el producto: dueños, directores, patrocinantes. Si bien no forman parte del Scrum Team, deben ser tomados en cuenta.

El proceso inicia con la elaboración de un archivo genérico llamado Product Backlog, el cual recoge el conjunto de actividades, solicitudes y las funcionalidades requeridas por el proyecto. Cualquier miembro del equipo puede hacer modificaciones en este documento, pero solamente el Product Owner es quien puede agregar prioridades, y es el responsable del documento.

Luego se define el Sprint Backlog, documento que reúne las actividades que se deben realizar, además de los responsables de ejecutarlas.

El Sprint es el periodo de tiempo, en el que se realizan todas las tareas acordadas en el Sprint Backlog y está compuesto porentregas parciales que van probando el producto parcial hasta llegar al producto final.

El ciclo anterior se repetirá una y otra vez hasta que hayan sido entregado todos los elemento del Blacklog. No se recomienda la existencia de tiempos improductivos entre cada uno de los distintos Sprints.

Las reuniones son planificadas como parte del proceso, en el “Sprint Planning Meeting”, el “Product Owner” prioriza las tareas contenidas en el “Product Blog”.

Con la metodología Scrum, se fomenta al trabajo en equipo. ya que los esfuerzos se enfocan en alcanzar un objetivo común.

Los Stakeholders tienen un mayor control y transparencia sobre el proyecto, permitiendo una mejor organización.

Es en el Burn Down, donde se marca el estado y la evolución del control de las tareas y requerimientos pendientes de ser tratados.

 

Conclusiones

Como has podido apreciar a lo largo de nuestro artículo, a lo largo de la historia han surgido distintos tipos o métodos de programación, los cuales han ido evolucionando a través del tiempo.

Esta evolución ha surgido como respuesta a los avances de la tecnología (Internet, enlaces de redes mucho más rápidos, ordenadores con capacidades asombrosas de respuesta y procesamiento, discos duros con almacenamiento inimaginable hace algunos años) y a la necesidad de generar programas más robustos, estables y sobretodo donde los programadores puedan reducir el esfuerzo invertido, reutilizando código y aprovechando experiencias aprendidas en el pasado.

Te invitamos a que continúes formándote en este fascinante mundo de la programación informática, aprendiendo técnicas modernas de programación para equipos de personas y metodologías como SCRUM que permiten que grupos de programadores puedan optimizar el esfuerzo realizado en cada proyecto.

Otros categorías que te pueden interesar:

Si te ha gustado nuestro artículo, haznos un favor y compártelo en tus redes sociales favoritas, para que más gente se informe con nuestros posts.

Redes Sociales

 

HOSTING WEBEMPRESA
alojamiento wordpressCUPÓN DESCUENTO gracias20

 

Programación: Guía Completa
5 (100%) 1 voto