05 agosto 2008

Paradigmas de Programación y muchos objetos en C++

En este mensaje, voy a comenzar a hablar un poco acerca de la programación orientada a objetos y voy a ejemplificar lo que voy describiendo con el lenguaje C++.  Espero que encuentren esto de utilidad y si hay alguna duda, queja sugerencia o lo que sea, déjenme un comentario e intentaré responer en cuanto pueda.
Paradigmas de programación
Antes que nada, vamos familiarizándonos con diferentes paradigmas de programación (palabra dominguera para decir que son diferentes maneras de representar y manipular datos).

Existen varios paradigmas y todos tienen una manera diferente de resolver problemas.  Aquí pongo unos cuantos con un resumen de su filosofía:
  • El paradigma imperativo es considerado el más común y está representado, por ejemplo, por el C o por BASIC.  Aquí los programas se ejecutan de manera lineal, una instrucción a la vez, línea por línea, siempre en el mismo orden.
  • El paradigma funcional está representado por la familia de lenguajes LISP.  Aquí todos los programas son un montón de funciones anidadas.
  • El paradigma lógico, un ejemplo es PROLOG.
  • El paradigma orientado a objetos. Un lenguaje completamente orientado a objetos es Smalltalk.  Aquí todo el programa de compone de objetos, los cuales contienen procedimientos y datos.
También hay algunos lenguajes que mezclan paradigmas.  Por ejemplo, C++, Java y Visual Basic combinan el paradigma imperativo y el orientado a objetos.

Vista Preeliminar de OOP
Ya que hemos hablado tantito acerca de los diferentes paradigmas de programación, es hora de ver que onda con la Programación Orientada a Objetos (abreviado como POO [por sus siglas en español] o OOP [por sus siglas en inglés: Object Oriented Programming]) enfocada a C++.

¿Y qué "¡#¿$!? es un objeto?
De una manera chipocluda, podemos decir que un objeto es un principio de alto nivel, un concepto que nos permite organizar software.  Precisamente de aquí sacamos la palabrita de "programación orientada a objetos".

De una manera más real, podemos decir que un objeto es una región de almacenamiento dentro de un programa ejecutable que obedece un conjunto de reglas definidas por el usuario, o sea que es una estructura que guarda datos y contiene funciones para manipular esos datos.  Tomemos como ejemplo un arreglo.  En teoría, el programador tuvo que pensar en qué características serían necesarias en ese objeto arreglo; y a cada arreglo declarado en un programa ejecutable se le llama objeto.  También se conoce a un objeto en memoria como una "instancia".

Esto sonó muy bonito, pero son un par de conceptos que en la práctica no nos sirven de nada.  Hasta ahora he descrito a los objetos como regiones de memoria.  Es claro que conozcamos objetos (un vaso, una ventana, un carro, etc.), pero todavía no se entiende muy bien que característica de un lenguaje de programación nos permite especificar y crear objetos.  Para esto hacemos una "clase", que en la mayoría de lenguajes de programación OO incluyendo al C++, es un tipo de dato definido por el usuario para crear objetos.  Clases son como los planos de una casa: especifican exactamente como debe de construirse el objeto y como se va a comportar.

¿Y cómo uso las clases?
La definición de una clase especifica los datos y funciones miembros de esa clase.  Por ejemplo, consideremos una clase llamado VerArch que tiene un dato miembro llamado fin.  Si tenemos un objeto VerArch llamado oVA, podemos accesar al dato miembro fin usando la notación normal de C++:

if (oVA.fin == NULL)
   ...

Ya estuvo bueno de datos pero, ¿y si necesito funciones?  Supongamos que la clase VerArch usada anteriormente tiene una función llamada AddLine() (luego llego a la parte de como declarar/hacer la función miembro).  Para el objeto VerArch llamado oVA podemos llamar a la función AddLine() así:

oVA.AddLine();

oVA es el nombre del objeto, el punto significa "miembro de", AddLine es el nombre de la función miembro y los paréntesis son indicadores estándares de C++ y Java.

Lo mejorcito de los objetos...

Los 3 conceptos más importantes en programación OO son la abstracción (también conocido como encapsulamiento), la herencia y el polimorfismo.  Yo casi diría que en estos 3 conceptos radica la ventaja de los lenguajes OO.  Luego vemos de que trata cada uno, pero antes un poco de rollo...

En la programación OO (desde ahora la voy a abreviar como OOP), diseñamos software usando partes componentes, a los que llamamos "objetos".  Los objetos se conforman de datos miembro y un conjunto de rutinas para manipular los datos, a los que llamamos funciones miembro.  Pero el tener a las funciones "pegadas" a los datos es solo una ventaja.  Como diría Raúl Velasco, aún hay más...

Por ejemplo, los objetos físicos (como tu teclado o un carro) tienen una interfase externa que esconden su complejidad interna (por ejemplo: no tienes que saber exactamente como funciona un motor de combustión interna para poder manejar un carro).  El esconder información se llama abstracción o encapsulación.  Esto facilita las cosas: imagínate que un arquitecto tenga que dibujar como va a funcionar el sistema de agua caliente a una casa.  Le sería complicado.  Mejor solo dibuja en los planos lo que es necesario para poner el boiler, tubería, etc. sin preocuparse como funciona.  Sabe que funciona y con eso basta.

Otro aspecto de objetos físicos que se extienden a la OOP es la forma en que algunos objetos pueden ser adaptados para crear nuevos objetos.  En OOP a esto lo llaman herencia y decimos que un objeto se deriva de otro.  Volvamos a nuestro arquitecto frustrado: puede modificar los planos de una casa para incluir una cochera para 2 autos y un desayunador.  Estas cosas que se agregan requieren un ajuste a los planos de piso y de ventanas, pero el diseño básico de la casa queda igual.

Y una tercera característica de objetos físicos que agarramos es que diferentes objetos muchas veces operan en la misma manera.  En OOP eso se llama polimorfismo.  Piensa en vehículos con motores de combustión interna, desde el volcho (Volkswagen Sedan) hasta tráileres grandes.  Todos se operan con un pedal para la gasolina, otro para el freno y un volante.  En este rango de vehículos se usan mecanismos muy diferentes para algunas cosas como son frenos o cambios de velocidades.  Pero en todos los casos el pedal del freno es una interfase uniforme para el mecanismo interno.

Usando Clases
Después de esto, como diría el dermatólogo, vámonos directo al grano.  Vamos a usar las clases y crear objetos.

La sintaxis básica de una clase en C++ sería así (sé que hay muchos otros tiliches que se le pueden poner, pero eso lo hablaremos más adelante):

class Nombre_Clase
{
   public:
      // declaración de los miembros públicos
   private:
      // declaración de los miembros privados
}

Al ver esto, probablemente tu primera pregunta es ¿qué es un miembro público?  Y el segundo probablemente sería ¿y qué es un miembro privado?  La onda está así, en la sección public se define las partes (funciones y variables) de la clase que son accesibles a todos y se declaran las funciones miembro que pertenecen a esta clase.  En la sección private se especifican los datos miembros de la clase.  Los usuarios no tienen acceso a esta parte.

Hagan de cuenta que las clases son como el edificio del restaurante con dos puertas.  Todo el mundo puede entrar por la puerta principal (sección public) y solo los empleados pueden entrar por una puerta pequeña que está en la parte posterior del edificio.  Esta sería una puerta que solo pueden acceder los empleados (miembros) del restaurante.

Este sería un ejemplo de una clase que guarda datos acerca de un video:

// video.h
class Video
{
   public:
      Video();
      void establecer(char *,char *,int);
      char* obtener_nombre();
      char* obtener_productor();
      int obtener_cantidad();
   private:
      char nombre[40]
      char productor[40];
      int cantidad;
}

Esta clase se llama Video (class Video) y tiene 3 datos privados (lo que está después de la línea private): nombre, productor y cantidad.  No conforme con esto, también contiene 5 funciones públicas (todo lo que viene después de public: y antes de private:), es decir, Video, establecer, obtener_nombre, obtener_productor y obtener_cantidad.

Referencias
Bibliografía (libros que tienen material interesante)
  • Desarrollo de proyectos con programación orientada a objetos con C++, de Jo Ann Smith, Editorial Thompson, ISBN: 970-686-091-6
  • Borland C++ Techniques & Utilities, de Kaare Christian, Editorial ZD Press, ISBN: 1-56276-054-8
Webografía (es medio contradictorio decir “bibliografía en la web”)
Si te interesan estos libros, aquí hay unas ligas donde los puedes conseguir:


¡Hasta la próxima!
Publicar un comentario
Related Posts Plugin for WordPress, Blogger...