Consideraciones adicionales (C++).

Respecto al envío de mensajes.
   La sintaxis general en C++ para el envío de mensajes a un objeto es la siguiente:
objeto.mensaje(lista_de_argumentos);
donde objeto es un objeto de una clase previamente definida, y mensaje es uno de los métodos públicos definidos para dicha clase. La lista_de_argumentos es una lista de argumentos separada por comas, en donde cada argumento puede ser un objeto o algún otro tipo de dato.

Respecto a la sobrecarga de operadores.
   En C++ es posible sobrecargar la mayoría de las operadores tradicionales, de tal forma que éstos puedan llevar a cabo operaciones particulares relacionadas con las clases que define el programador. Esta característica es de hecho una de las más poderosas del lenguaje.

   La sobrecarga de operadores se realiza a través de la definición de funciones de operador, que son las que definen el comportamiento que tendrá el operador asociado a ellas. Una función de operador se crea a través del uso de la palabra reservada "operator", y pueden ser tanto funciones miembro como no miembro de una clase, aunque lo más común es que sean funciones miembro (métodos).

   Una función de operador miembro tiene la siguiente estructura general:

    tipo_de_retorno   nombre_de_la_clase::operator#(parámetro){
        // definición del comportamiento
    }


donde:
  • tipo_de_retorno puede ser cualquier tipo válido en C++, aunque lo más común es que sea un objeto de la clase que define al método.
  • el símbolo de gato # debe substituirse por el operador correspondiente que se desee sobrecargar, por ejemplo: +, -, /, *, etc.
  • Cuando se sobrecarga un operador unario "parámetro" debe ser la lista vacía; si se sobrecarga un operador binario, "parámetro" será el segundo operando involucrado en la operación. En la sección correspondiente a los números racionales, se mostrará un ejemplo de sobrecarga de operadores.
    En la sección correspondiente a las consideraciones adicionales para las colas de espera, se proporcionan un par de ejemplos al respecto. Para comprenderlos se requiere tener claros los aspectos relacionados con la implementación de la herencia, el funcionamiento de las colas de espera, y su respectiva especialización en la forma de colas de prioridad.

Respecto al paradigma.
   El establecimiento de niveles de acceso como private para los atributos de una clase, así como el uso de métodos de tipo set y get están directamente relacionados con el principio de ocultación de información (information hiding).

   Ahora bien, es probable que el lector haya notado que en la descripción del Ejemplo Herencia, en distintas ocasiones se hizo referencia a los objetos "p" (persona) y "c" (científico) como si fueran en sí mismos personas o entidades existentes. Lo anterior se hizo de manera deliberada, ya que como se comentó en la entrada referente al paradigma orientado a objetos, esto eleva el nivel de abstracción y permite que se haga referencia a las entidades fundamentales del paradigma (los objetos) como elementos comunes de nuestro lenguaje natural, lo cual permite que los problemas se puedan expresar, al menos en principio, de una manera más natural e intuitiva.

   En este sentido, al dotar a los objetos de una personalidad propia con características y responsabilidades, en lugar de pensar en términos de datos, variables, y funciones o procedimientos que operen sobre dichos datos, se eleva el nivel de abstracción facilitando con ello el análisis y la comprensión, ya que el problema y su solución pueden ser expresados y analizados en términos de su propio dominio, y no en el del medio de expresión de la solución (lenguaje de programación). Ésta es una de las formas en la que los seres humanos abstraemos, procesamos y utilizamos la información.

   Es sumamente importante que el lector tenga presente que en el paradigma orientado a objetos no se piensa en términos de datos, sino en términos de entidades con características y responsabilidades específicas, por lo que, cuando defina una clase, puede resultar útil el plantearse al menos un par de preguntas que le permitan determinar si los objetos derivados de su clase tienen o no sentido. Adicionalmente, las preguntas pueden ayudar también a establecer o coadyuvar en la meta de mantener una alta cohesión como parte del proceso de diseño e implementación:
  1. ¿Los atributos representan características o propiedades, o definen un estado para los objetos que serán instanciados?
  2. ¿La clase representa en sus métodos servicios, comportamiento, acciones o responsabilidades inherentes a los objetos que deriven de ella?
   Cabe mencionar que las preguntas propuestas son sólo una guía y una sugerencia al lector, no pretenden ser de ninguna manera un referente completo y absoluto. Con estas dos sencillas preguntas, además de validar y verificar su diseño de clases, estará reforzando también el concepto de encapsulamiento.

Respecto al polimorfismo.
   El polimorfismo es la cualidad de objetos heterogéneos de responder de distinta manera a un mismo mensaje. El tipo de polimorfismo más común se da en la herencia, pero no es el único.

   El Ejemplo Heterogéneo es un conjunto de clases (Automóvil, Motocicleta, Perro, Planta, Plomero, Profesor) heterogéneas que contienen un método de servicios. La idea es que, al menos en principio, cada una de dichas entidades ofrecen servicios distintos en función de su constitución y comportamiento general.

   Por otro lado, el Ejemplo Composición contiene tres clases: Libro, Publicación y Revista, las cuales presentan un comportamiento de polimorfismo en la forma en que se auto describen (imprimen), a través del método to_string( ).

   En directa relación con el párrafo anterior, el tipo de polimorfismo más común se presenta en el Ejemplo Herencia, el cual contiene también las tres clases Libro, Publicación y Revista pero con un enfoque de polimorfismo basado en la herencia para la forma en que se auto describen (imprimen) a través del método to_string( ).

   Existe un concepto en programación denominado late binding, dynamic bindig o dynamic linkage, y se refiere a un mecanismo de programación en el cual el método que se será invocado es determinado en tiempo de ejecución (no en tiempo de compilación (early binding) como en los ejemplos de los párrafos anteriores). 
 
    Como un ejemplo adicional muy simple de esto, tómese el tiempo que considere necesario para comparar y analizar el Ejemplo Herencia (descrito en la entrada POO (Herencia)) y el Ejemplo Polimorfismo, en donde se muestra dicho concepto de programación; así mismo, es importante que el lector comprenda tanto las diferencias y similitudes de dichos ejemplos como su funcionamiento, ya que éstas son sutiles pero importantes. Asegúrese por favor de que así sea.

   Finalmente, considere también el conjunto de ejemplos empaquetados en Ejemplo de late binding, los cuales pretenden profundizar y contrastar el early binding vs late binding. Los ejemplos vienen con comentarios que podrían resultar útiles al lector. Al igual que antes, tómese su tiempo para comprenderlos antes de continuar.

No hay comentarios.:

Publicar un comentario