(Agosto-2011)
Contenido
INTRODUCCIN ....................................................................................................................................... - 1 PARADIGMA DE PROGRAMACIN ........................................................................................................... - 1 PROGRAMACIN ORIENTADA A OBJETOS ............................................................................................... - 3 ABSTRACCIN DE DATOS Y PROGRAMACIN ORIENTADA A OBJETOS ....................................................................... - 3 OBJETO .................................................................................................................................................. - 4 CLASE .................................................................................................................................................... - 4 ASIGNACIN DE MEMORIA EN PROGRAMACIN ORIENTADA A OBJETOS ................................................................... - 5 VISIBILIDAD ............................................................................................................................................. - 7 CONSTRUCTORES Y DESTRUCTORES ................................................................................................................ - 7 VALOR NULL ............................................................................................................................................ - 8 PSEUDOVARIABLE - THIS ............................................................................................................................. - 8 ELEMENTOS STATIC.................................................................................................................................... - 9 JERARQUA DE CLASES ................................................................................................................................ - 9 -
Introduccin
En esta publicacin voy a presentar la relacin entre Estructura de Datos y Programacin Orientada a Objetos; est dirigida a alumnos comienzan sus estudios en carreras vinculadas a la informtica, el enfoque es sobre Estructura de Datos sin embargo hay que comentar aspectos de otras reas de la Informtica lo que voy a intentar hacer de la manera ms simple que se pueda sin incursionar demasiado en dichas reas dado que no corresponden al estudio de Estructura de Datos y seguramente las estudiarn en profundidad en otras asignaturas o por su cuenta. El paradigma orientado a objetos naci en 1969 cuando Kristin Nygaard intentaba escribir un programa que describiera el movimiento de los barcos en las complicadas costas de Noruega; descubri que era muy difcil representar las mareas, el movimiento de los barcos y las formas de la costa con los mtodos de programacin existentes en ese momento. Tambin descubri que era ms fcil de representar y controlar las relaciones de los elementos del entorno (barcos, mareas y costa) y las acciones que podan ejecutar.
Paradigma de programacin
La palabra paradigma deriva del Griego y significa "patrn" o "ejemplo"; Thomas Kuhn en "La estructura de las revoluciones cientficas" asign a esta palabra el significado aceptado hoy en da en la comunidad cientfica. Kuhn adopt la palabra "paradigma" para referirse al conjunto de prcticas que definen a una disciplina cientfica durante un perodo de tiempo en particular; tambin identific el trmino "cambio paradigmtico" como el proceso y resultado de un cambio en las hiptesis establecidas por las teoras cientficas reinantes. Es decir, un "cambio paradigmtico" se origina cuando los cientficos encuentran anomalas que no pueden explicar con el paradigma aceptado en ese momento. Cuando ocurren algunas anomalas significativas la disciplina cientfica entra en crisis, es entonces cuando se prueban nuevas y viejas ideas. Eventualmente se forma un nuevo paradigma, que indudablemente entrar en conflicto con el actual enfrentando a los seguidores de cada corriente. Si se produce la transicin entre el antiguo paradigma y el nuevo se dice que ha sucedido un "cambio paradigmtico" o "revolucin cientfica".
Robert W. Floyd en "The Paradigms of Programming" en total acuerdo con la visin de Kuhn sobre las revoluciones cientficas, concluye que la probabilidad de que se produzca un avance continuo en la programacin requerir de una invencin continua adems de la elaboracin y colaboracin de nuevos paradigmas.
-1-
Estructura de Datos y Programacin Orientada a Objetos La Programacin Orientada a Objetos es el resultado de un proceso de "crisis" en el que se aplicaron nuevas y viejas ideas, en sntesis es el resultado de un cambio paradigmtico. El siguiente esquema muestra esta situacin.
Paradigma Imperativo
Programacin Modular Programacin Estructurada + Tipo de Dato Abstracto
(DAT-Data Abstract Type)
Es oportuno comentar que tanto la programacin modular como la programacin estructurada se presentan como paradigmas, ocurre que en su momento (cuando fueron enunciadas, todava no se hablaba de paradigmas), no es el objetivo de esta publicacin discutir sobre esto. Lo que si hay que comentar es que la programacin modular es aquella que considera mdulos o subprogramas, en los principios de la programacin todo se haca con programacin lineal salvo la instruccin de salto (goto o jmp) que permite saltar de un lugar del cdigo a otro y continuar la ejecucin a partir de ese punto. Cuando los desarrolladores observaron que haba porciones de cdigo que permanentemente hacan lo mismo, se les ocurri incorporar una instruccin o mecanismo con la capacidad de saltar a otro lugar del cdigo (gosub o call), ejecutar las instrucciones que all se encuentran y mediante otra instruccin o mecanismo regresar (return) al punto desde donde se haba saltado; con esto surgi la programacin modular pero en ese momento no haba estructuras de control de ejecucin de programas. Las primeras versiones del lenguaje de programacin Basic no tenan las sentencias mientras o segn ... que hoy se ensean en los cursos bsicos de programacin. Las estructuras de control de ejecucin de programas tan conocidas actualmente surgieron al evolucionar las tcnicas de programacin dando lugar a la programacin estructurada. Es importante tener en cuenta que hoy en da se realizan programas utilizando ambas "tcnicas", sera inaceptable hacerlo de otro modo, pero en realidad son independientes. Los conceptos de tipo de dato abstracto se incorporan a estas tcnicas y permiten, gracias a la evolucin de los lenguajes de programacin, el surgimiento de la programacin orientada a objetos; lo que se denomina paradigma orientado a objetos va ms all de la simple programacin orientada a objetos, seguramente los estudiantes de carreras informticas vern en otras asignaturas los conceptos que fundamente el anlisis, diseo y desarrollo de productos de software bajo este paradigma. Desde el campo de las estructuras de datos se construyen herramientas que van a ser utilizadas por los programas. Este campo est interesado en la construccin de artefactos concentrndose en la mecnica de los mismos, en sus herramientas y engranajes; que en la mayora de los casos no son visibles al desarrollador usuario del artefacto. El campo de las estructuras de datos investiga la operabilidad de estos artefactos y su mejora al modificar las estructuras de datos que se van a encontrar dentro de los mismos. Es indiscutible que el campo de las estructuras de datos tiene un mejor desempeo si se realiza en el modo orientado a objetos. Al incorporar las estructuras de datos en un artefacto y hacer pblico slo lo que es necesario para el uso apropiado del mismo, el campo de las estructuras de datos puede desarrollar los artefactos cuyo funcionamiento no se vea comprometido por una manipulacin innecesaria.
-2-
-3-
Objeto
En el mundo real, las personas identifican los objetos como cosas que pueden ser percibidas por los cinco sentidos. Los objetos tienen propiedades especficas, como posicin, tamao, color, forma, textura, entre otras; de manera todas ellas definen su estado. Los objetos tambin poseen cierto comportamiento que los hacen diferentes de otros objetos. Si imaginamos el motor de un vehculo, el estado del motor puede ser apagado o funcionando, entre sus propiedades se puede considerar su potencia, velocidad mxima, velocidad actual, temperatura, entre otras. El comportamiento puede incluir acciones para arrancar y parar el motor, obtener la temperatura, cambiar la velocidad. La identidad se basa en el hecho de que cada instancia de un motor es nica, tal vez haya un nmero de serie que las diferencie. En el diseo de un programa orientado a objetos se crea una abstraccin del motor basado en las propiedades y el comportamiento que son tiles para resolver el problema. Un mensaje es una instruccin que se enva a un objeto y cuando se recibe, el objeto ejecuta acciones predeterminadas. Un mensaje incluye un identificador que contiene la accin que ha de ejecutar el objeto junto con los datos que necesita el objeto para realizar su trabajo. En el caso del motor, cuando se desea aumentar la velocidad seguramente se utilizar un mensaje que diga algo como "acelerar al doble", donde acelerar es el mensaje y al doble es el dato que necesita el objeto para hacer su tarea. Un mtodo es la implementacin de un mensaje, en otras palabras es la porcin de programa necesaria para que cuando un objeto recibe un mensaje ejecute las acciones necesarias para cumplir o realizar el comportamiento esperado.
Clase
En trminos prcticos, una clase es un tipo definido por el desarrollador. Las clases son los bloques de construccin fundamentales de los programas orientados a objetos. Una clase contiene la especificacin de los datos que describen un objeto junto con la descripcin de las acciones que un objeto puede ejecutar. Estas acciones se conocen como servicios o mtodos. Una clase tambin incluye todos los datos necesarios para describir los objetos creados a partir de la clase. Estos datos se conocen como atributos, variables o variables instancia. El trmino atributo se utiliza en anlisis y diseo orientado a objetos y el trmino variable instancia o campo se suele utilizar en programacin orientada a objetos. Algunos lenguajes de programacin orientados objetos facilitan la implementacin de propiedades para acceder a las variables de instancia, esto contribuye al encapsulamiento. Antes que un programa pueda manipular objetos se debe definir la clase correspondiente, esto significa que se debe dar un nombre a la clase, nombrar los elementos que almacenan sus datos y describir los mtodos que realizan las acciones necesarias para representar el comportamiento. Mediante el operador "new" se crea un objeto y el sistema operativo devuelve una referencia al objeto creado, la que se asigna a una variable del tipo de la clase. Para poder hacer esto, todas las clases tienen al menos un mtodo denominado constructor, este mtodo se encarga de inicializar el objeto cuando es creado y en general los desarrolladores suelen implementar diferentes "versiones" del constructor. Un objeto permanece "vivo" siempre que al menos una variable dentro del programa lo est referenciando.
-4-
Con la incorporacin del tercer segmento de memoria, se produjo un avance realmente importante en las capacidades de los lenguajes de programacin, a la par se incorpora la posibilidad de solicitar memoria adicional al sistema operativo logrando de esta manera que los programas puedan utilizar la cantidad de memoria justa para lo que tienen que hacer; al conjunto de estas tcnicas se las conoca como programacin con memoria dinmica.
Segmento Extra n
...
Extra Segment ES
Para que un programa pueda gestionar la memoria de manera dinmica se utiliza un tipo de dato conocido como puntero o apuntador, cuyo contenido es una direccin de memoria. De esta -5-
Estructura de Datos y Programacin Orientada a Objetos manera el desarrollador puede declarar punteros y solicitar al sistema operativo una cantidad de memoria para hacer algo. En la medida que el desarrollador "cuide" esa direccin de memoria podr utilizar la memoria que se le ha asignado. Este mecanismo de programacin, el de utilizar punteros y solicitar memoria al sistema operativo, es muy eficiente pero tambin muy peligroso. Una programacin descuidada agota la memoria del sistema, dado que no "devuelve" las porciones de memoria que solicita y "pierde" las direcciones. El siguiente esquema muestra un caso tpico. Se trata de un programa, que tiene subprogramas y uno de estos subprogramas declara y utiliza una variable puntero donde guarda la direccin de memoria del bloque solicitado.
Segmento de Pila
Puntero
El problema se presenta cuando finaliza la ejecucin del subprograma y el desarrollador no tuvo la precaucin de "devolver" la memoria al sistema operativo o en todo caso de pasarla a una variable donde se la pueda seguir accediendo. Cuando el subprograma finaliza, las variables que se crearon en el segmento de pila "desaparecen" y se pierde la direccin del bloque de memoria sin poder acceder al mismo.
Segmento de Pila
Este inconveniente fue solucionado con una tcnica de asignacin de memoria que utiliza lo que se llama heap o montn que es un espacio de memoria donde se reserva y asigna las solicitudes de los programas. Para el ejemplo anterior, se presenta el bloque de memoria solicitado por el subprograma asignado dentro del heap, que seguramente se halla en un segmento extra.
Segmento de Pila
Puntero
memoria solicitada
Cuando el subprograma finaliza su ejecucin, la variable local que apuntaba o referenciaba al bloque de memoria desaparece porque as es como funcionan las variables en el stack. El bloque de memoria queda sin ninguna variable que haga referencia a esa direccin de memoria, aparentemente el problema persiste, solo que este modelo de asignacin de memoria se cuenta con un proceso que se llama Garbage Collector (recolector de basura) que inspecciona el heap buscando aquellos bloques de memoria que no son referenciados y libera la memoria.
-6-
Estructura de Datos y Programacin Orientada a Objetos Los lenguajes de programacin orientados a objetos ocultan la utilizacin de punteros, simplemente clasifican o caracterizan a los distintos tipos de datos como Data Type aquellos tipos de datos cuyas variables se almacenan en el stack (clsico modelo de asignacin de memoria) y los Reference Type aquellos tipos de datos que utilizan una variable en el stack (lo que en el modelo no orientado a objetos es el puntero) y una porcin de memoria en el heap (espacio necesario para los objetos de la aplicacin); por supuesto que todos estos lenguajes implementan el Garbage Collector, caso contrario se terminara agotando la memoria del equipo impidiendo la ejecucin del programa. Indudablemente la implementacin del Garbage Collector requiere de caractersticas especiales en el sistema operativo que se ejecuta en el equipo; debe permitir la ejecucin de varios procesos ya sea en paralelo o bajo algn mecanismo de paralelismo aparente.
Visibilidad
En programacin orientada a objetos se utiliza el trmino visibilidad para tratar con un principio fundamental de este paradigma que es conocido como "ocultacin de la informacin", lo que significa que a determinados elementos del interior de una clase no se puede acceder por mtodos externos a la clase. El mecanismo principal para ocultar datos o mtodos es ponerlos dentro de una clase y declararlos "privados", con lo que se est diciendo que a esos elementos solamente se los puede manipular o "ver" desde dentro de la misma clase. Lo contrario sera declararlos "pblicos" con lo cual cualquier mtodo de cualquier clase podra manipularlos. Existen otras posibilidades como por ejemplo declarar que un elemento esta "protegido", con lo cual se logra que desde fuera de la clase nadie pueda acceder al elemento pero se permite que las clases derivadas de esa clase puedan manipular dichos elementos (derivada es un concepto de C++, en Java y C# se utiliza el concepto de subclase, que no es otra cosa ms que un clase que hereda las propiedades de otra). Dependiendo de la plataforma en la que se desarrolle, las definiciones de clases suelen reunirse en libreras de clases que se conocen como paquetes (package) o ensamblados (assemblies), existen modificadores que permiten el acceso a las clases de la misma librera, esto lo podrn ver practicando con un lenguaje en particular.
Constructores y destructores
Un constructor es un mtodo que se ejecuta automticamente cuando se crea un objeto de una clase. El mtodo constructor tiene el mismo nombre que la clase, no se puede indicar un valor de retorno (al menos en los lenguajes orientados a objetos que conozco), tampoco devuelve algo. Pero si puede tomar cualquier nmero de argumentos, esto es mediante la sobrecarga de mtodos (la vemos ms adelante). Un constructor que no tiene parmetros se conoce como "constructor por defecto" y generalmente inicializa los elementos del objeto con valores por defecto (siempre que estos elementos tengan valores por defecto). Este constructor no hace falta escribirlo a menos que necesitemos hacer algo en particular, o inicializar los elementos del objeto con determinados valores. Hay que revisar la documentacin del lenguaje que utilizan porque en algunos lenguajes cuando se implementa un constructor distinto del constructor por defecto, ste ltimo ya no se genera automticamente y muchas veces es necesario el constructor por defecto Suponiendo que existe una definicin de una clase llamada "Persona", entonces para declarar y crear un objeto de esta clase se escribe la siguiente sentencia
Persona alguien = new Persona();
-7-
Estructura de Datos y Programacin Orientada a Objetos En este caso "alguien" es una variable cuyo tipo es "Persona" y se crea el objeto mediante el operador "new" invocando el constructor de la clase, en este caso el constructor por defecto. Supongamos que se ha implementado un constructor que permite asignar el nombre de la persona, entonces la sentencia podra ser:
Persona alguien = new Persona("Juan");
Ahora el constructor recibe un parmetro, consecuentemente no es el constructor por defecto (que no hace falta implementar). Cuidado en C# si se implementa algn constructor y luego se necesita el constructor por defecto tambin debe implementarse. Esta posibilidad que brindan ciertos los lenguajes (en general todos los lenguajes orientados a objetos), la de tener un mtodo que puede recibir distintos parmetros en cantidad y tipo, es lo que se denomina sobrecarga de mtodos. Es una facilidad que brindan los lenguajes para que bajo el mismo nombre (de mtodo) el desarrollador pueda implementar el mismo cdigo o semejante (se espera que haga lo mismo) para distintas posibilidades de acuerdo a la cantidad y tipo de parmetros. El destructor es un mtodo que en general no hace falta implementar, se supone que el recolector de basura busca las porciones de memoria en el "heap" que no estn referenciadas y las libera. Eventualmente puede ser necesario que un objeto realice ciertas acciones antes que se libere la memoria que se le haba asignado; tambin se considera la implementacin y uso de los destructores en programacin avanzada y para aplicaciones que requieran altos niveles de prestacin.
Valor null
Todos los desarrolladores sabemos que cuando se declara una variable por ejemplo de tipo numrico, esta variable tiene un valor por defecto (puede ser que distintos lenguajes pongan distintos valores); por ello es que una buena prctica de programacin es inicializar las variables antes de utilizarlas, esto es indiscutible cuando las variables se utilizarn como contadores o acumuladores. Las variables que corresponde a objetos tambin tiene un valor por defecto; este valor es "null" lo que significa nulo dado que el objeto no existe, no fue inicializado. Cualquier intento de enviar mensajes mediante una variable cuyo valor es "null" provocar una interrupcin o error en tiempo de ejecucin.
Pseudovariable - this
La palabra reservada "this" se utiliza como si fuese una variable, pero en realidad no lo es porque el desarrollador no la define ni crea; est palabra se utiliza para referirse al objeto que est ejecutando una porcin de cdigo. En programacin orientada a objetos, la ejecucin de un programa es en realidad el envo y recepcin de mensajes entre objetos de manera que cada uno de ellos realice el comportamiento que tienen. Consecuentemente, para que los objetos puedan enviarse mensajes entre ellos hace falta que se conozcan, no es posible enviarle un mensaje a un objeto desconocido (puede desconocerse el tipo de objeto, pero el objeto en s mismo debe ser conocido). Del mismo modo hace falta una forma de "conocer" al mismo objeto por eso es que existe esta pseudovariable.
-8-
Elementos static
Ya se coment que la ejecucin de un programa orientado a objetos es el resultado del envo de mensajes entre objetos, tambin se indic que estos objetos deben existir para que puedan enviar o recibir los mensajes que realizan su comportamiento, por esa razn es que existe un mtodo constructor, aquella porcin de cdigo que crea e inicializa un objeto. Sin embargo algunas aplicaciones necesitan que ciertos elementos existan desde el momento mismo en que la aplicacin comienza a ejecutarse, es como decir que ese elemento se crea automticamente y se puede utilizar. Para ello los lenguajes de programacin orientada a objetos facilitan la palabra reservada "static" que sirve para indicar que "un elemento se crea automticamente" y la aplicacin lo puede utilizar sin necesidad de crear un objeto. Lo que se debe tener en cuenta es que una aplicacin puede crear tantos objetos de un tipo en particular como la aplicacin lo necesite, pero no puede crear aquellos elementos u objetos que se clasificaron como "static". Tanto en C# como en Java, cuando se realiza una aplicacin de consola (aquella que se ejecuta en la consola del sistema operativo que tienen en la computadora) se puede ver que el mtodo "Main" (en C#) o "main" (en Java) estn clasificados como "static", lo que significa que no hace falta crear un objeto para invocar dicho mtodo, simplemente existe como parte de la definicin de la clase que lo contiene. Este tipo de elementos de las clases se conocen como variables de clase, a diferencia de los otros elementos conocidos como variables de instancia, porque para poder acceder a ellos primero se debe crear una instancia de la clase o sea un objeto.
Jerarqua de clases
En programacin orientada a objetos todo es un objeto, de esta manera es posible organizar una aplicacin como la interaccin entre objetos. Para lograr esto, los lenguajes orientados a objetos cuentan con lo que se llama una "jerarqua de clases" que es donde se encuentra cada objetoclase que el lenguaje facilita as como los que los desarrolladores implementan. La primer definicin (clase) de la jerarqua se conoce como "object", a partir de esta definicin se implementan todos los objetos de una aplicacin. Es importante leer la documentacin del lenguaje de programacin que utilicen para ver que particularidades tiene esta clase. En general tendr unos mtodos que son comunes a todo objeto como ser "Equals", "HashCode" y "ToString", para que sirven y cmo se utilizan se ver a medida que se desarrollen estructuras de datos con nfasis en la programacin orientada a objetos.
-9-