sábado, 27 de abril de 2019

Introducción a C++ HolaMundo

Como en cualquier libro típico de programación en C++ siempre mencionan algo de historia sobre los orígenes del lenguaje de programación, en esta entrada no quiero hacer énfasis en repetir la misma historia, me voy a centrar en las características básicas del lenguaje, la estructura de un programa en C++ para su compilación y ejecución. Todo lo que escribo en las siguientes entradas en el transcurso del aprendizaje de C++ lo hago en una distribución tipo Linux basada en Debian como lo es Ubuntu.


El Main del programa

Ejemplo sencillo de un programa en C++ el típico Hola Mundo cuando uno aprende a programar. La función main() es la función principal en donde se inicia la ejecución del programa, todo programa debe tener una función main() para poder ser ejecutado.




Entendamos algunas cosas:

En la linea 1 del código fuente esta la directiva #include <iostream> la cual hace que el compilador añada los contenidos del archivo iostream al programa, este contiene las declaraciones del identificador cout, endl y el operador <<, el archivo de cabecera iostream debería ser incluido en todos los programas que utilicen instrucciones de entrada/salida.

En la linea 2 se usa la directiva using namespace para definir el ámbito de un identificador, en este caso std, si no se hace esto en cada linea de cout tendríamos que definir el espacio de nombres con el operador de ámbito :: así, std::cout << "Hola Mundo !!" << std::endl;

En la linea 5 define la función main() la cual tienen como valor de retorno un tipo de dato int en el caso de que la función se ejecute correctamente retorna 0 como se ve en la linea 17.

El objeto cout se usa para indicar en el programa un flujo de salida mediante el operador << a la salida estándar del sistema, en este caso un mensaje que se escribe en la terminal, se usa endl para indicar un salto de linea al final.

Es recomendado escribir comentarios en el código fuente para que a futuro podamos hacer cambios de forma mas fácil y hace parte de las buenas practicas de programación. Existen dos formas de comentar código, un comentario de una sola linea como se ve en la linea 7 o un comentario de bloque como se ve en las lineas 13 - 15.


Por ultimo debemos saber como compilar nuestro código fuente para que la maquina entienda las instrucciones de nuestro programa y luego proceder a ejecutar el programa.

Para compilar, desde una terminal de linux y asegurándonos que estamos sobre el directorio que contiene nuestro código fuente, ejecutamos la siguiente instrucción:

promt->$  g++ Main.cpp -o Main

Donde Main.cpp es el nombre del archivo que tiene el código fuente de nuestro programa y Main es el nombre que queremos dar al ejecutable del programa.

Para ejecutar el programa, desde una terminal linux ejecutamos la instrucción:

promt->$  ./Main

El resultado de compilar el código fuente y ejecutar el programa es el siguiente:



Introducción a Programación Orientada a Objetos POO

El paradigma de programación orientado a objetos tiene su origen a principios de los años 70 pero que se ha popularizado desde principios de los años 90. Básicamente un lenguaje de programación orientado a objetos está diseñado para crear una abstracción de hechos y objetos del mundo real de tal forma que pueda ser interpretado y ejecutado por las maquinas o computadoras.

Su origen se debe a un lenguaje de programación, Simula 67, diseñado para hacer simulaciones y donde surgieron los conceptos de clases, objetos, herencia, instancia, polimorfismo, etc.

Se popularizo a principios de los años 90 como consecuencia de la Crisis del Software en donde es necesario dar respuesta a las siguiente preguntas:

  • ¿Cómo representar entidades de problemas de la vida real en el diseño de sistemas?
  • ¿Cómo diseñar sistemas con interfaces abiertos?
  • ¿Cómo garantizar la reusabilidad y la extensibilidad de los módulos?
  • ¿Cómo desarrollar módulos que sean tolerantes a los cambios futuros?
  • ¿Cómo mejorar la productividad del software y disminuir el coste del software?
  • ¿Cómo mejorar la calidad del software?
  • ¿Cómo gestionar las planificaciones temporales?
  • ¿Cómo industrializar el proceso de desarrollo de software?

Aunque no voy a escribir en esta entrada sobre Calidad es importante mencionarlo, cuando se habla de la Calidad en los productos de Software hay que evaluar de forma crítica:

  • Correctitud
  • Mantenibilidad
  • Reusabilidad
  • Apertura e Interoperabilidad
  • Portabilidad
  • Seguridad
  • Integridad
  • Amabilidad con el usuario


Es importante tener algunos conceptos claros y que son usados ampliamente en programación orientada a objetos:


Clases
Es un conjunto completo de datos definidos por el usuario para representar un objeto de la vida real, por ejemplo, Carro, Casa, Persona, Estudiante, Motor, etc. Las Clases encapsulan todas las propiedades esenciales de los objetos que van a ser creados.


Objetos
Los objetos son una instancia de una Clase que ocupan espacio en memoria, son datos de tipo Clase que podemos manipular y a la vez pueden interactuar con otros objetos. La comunicación entre Objetos se hace por medio de funciones que proporcionan una interfaz de comunicación para acceder a los datos de los objetos, a estas funciones se les llama Métodos o Funciones Miembro.


Abstracción de datos y encapsulación
A la envoltura de datos y funciones en un solo conjunto llamada Clase, se conoce como encapsulación, esta es la característica mas llamativa de una clase. La abstracción se refiere al acto de representar las características esenciales de objetos o hechos del mundo real sin incluir los detalles de fondo o las explicaciones.


Herencia
El concepto de herencia suministra la idea de reusabilidad, esto significa que podemos añadir características a una Clase existente sin modificarla, esto es posible al derivar una nueva clase a partir de una clase ya existente, la nueva Clase tendrá las características combinadas de ambas clases.


Polimorfismo
Del vocablo griego, significa la posibilidad de tomar más de una forma. Al proceso de hacer que un operador tenga diferentes comportamientos en diferentes situaciones se le conoce como Sobrecarga del Operador, al uso de un solo nombre de función para realizar diferentes tareas se le conoce como Sobrecarga de la Función.


Paso de mensajes
Los Objetos se comunican entre sí enviando y recibiendo información de la misma manera que las personas se pasan mensajes entre ellas. Un mensaje para un objeto es una solicitud para la ejecución de un procedimiento y por tanto invocará a una función en el objeto receptor que genere el resultado deseado. El paso de mensajes implica la especificación del nombre del objeto, el nombre de la función y la información a enviar.



Ventajas de la POO

  • Por medio de la herencia podemos eliminar código redundante y extender el uso de clases existentes.
  • Podemos escribir programas a partir de módulos de trabajo estándar que se comunican entre si, en lugar de tener que empezar desde cero la escritura del código. Esto conduce a un ahorro en el tiempo de desarrollo ya una productividad mayor.
  • El principio de encapsulación de datos ayuda al programador a construir programas seguros que no pueden ser invadidos por código de otras partes del programa.
  • Es posible tener múltiples copias de un objeto que coexisten sin ninguna interferencia.
  • Es fácil dividir el trabajo de un proyecto basado en objetos.
  • El enfoque del diseño centrado en los datos nos permite capturar mas detalles de un modelo de forma que se puedan implementar.
  • Se pueden mejorar y actualizar fácilmente los sistemas orientados a objetos desde los pequeños hasta los grandes sistemas.
  • Las técnicas de pase de mensajes para la comunicación entre objetos simplifican mucho las descripciones de las interfaces con sistemas externos.
  • Se puede gestionar fácilmente la complejidad del software.