Vous êtes sur la page 1sur 104

Programacin orientada a objetos

Abdiel E. Cceres Gonzlez Centro de Investigacin y de Estudios Avanzados - IPN Mxico D.F., Mxico. 2004

Qu es la programacin orientada a objetos?

Qu es la programacin orientada a objetos?

Orientado a objetos ha sido la expresin de moda de los ltimos aos. De repente, todo el mundo la utiliza, pero con un abanico de significados tan amplio que nadie parece saber exactamente lo que dicen los dems. Es difcil imaginar dos lenguajes de progrmacin tan diferentes como los son Smalltalk-80 y Ada, y, sin embargo, a veces se dice qde los dos que son orientados a objetos. Otros piensan que los objetos son fundamentalmente una manera de expresar la concurrencia, y an hay quien dice que son una forma de organizar jerrquicamente unos hechos complejos. Cmo es posible que un mismo trmino est relacionado con cosas tan distintas como los lenguajes de programacin, las interfaces de usuario, esquemas para representar el conocimiento de los expertos, sistemas operativos distruibuidos, sistemas de conmutacin para telefona, y muchas ms? Qu es lo que significa realmente orientado a objetos?

Qu es la programacin orientada a objetos?

Ms all del entorno de las computadoras, la palabra objeto significa algo que est bien determinado. Los lpices, colibres, molculas y galaxias son objetos, pero los ocanos, la niebla, y el sarampin no son objetos. Aunque el concepto de espacio de direcciones de una computadora no define lo que son unos lmites dien definidos, los programadores han decidido adoptar esta palabra. Sin definir en primer lugar los trminos clave, como es lmites, no podemos esperar que sea posible entender el significado de una palabra como objeto. Aqu vamos a examinar varios significados del trmino, describiendo la forma en que se utiliza la palabra en varios lenguajes de programacin. El objetivo no es ofrecer una panormica exhaustiva de todo lo que se ha hecho o se ha dicho con el nombre de programacin orientada a objetos, sino describir unos cuantos puntos de vista clave, de entre los que se han explorado en el espectro de posibilidades.

Smalltalk-80

Smalltalk-80 es un lenguaje de programacin y un entorno de programacin integrados. Es el resultado de ms de una dcada de investigacin del Software Concepts Group mantenido por Xerox PARC (Palo Alto Research Center). Smalltalk es un sistema notablemente influyente. No slo ha afectado a otros productos comerciales, como es sistema Star de ofimtica y el sistema Interlisp-D de Ingeniera del conocimiento.

Xerox Star computer system introducida en Abril 1981

Adems, ha influido sobre muchos otros sistemas acadmicos y comerciales

Smalltalk-80

Su influencia sobre muchos otros sistemas Lisa y Macintosh de Apple es algo ampliamente aceptado, por no mencionar su efecto sobre toda una gama de productos menos conocidos de ofimtica, autoedicin y diseo asistido por computadora. Gran parte del entusiasmo actual por las estaciones grficas de alta resolucin, las interfaces por iconos de usuario, y las computadoras personales, tiene unas races que nos llevan a la demostracin del valor y la realizabilidad de aquellas ideas.

sistema Lisa (1984)

Smalltalk-80

Antes, el valor de Smalltalk resida en probar conceptos que posteriormente se explotaban en otros sistemas, y no como un sistema de importancia comercial por derecho propio. Esto cambi despus, a medida que empezaron a estar disponibles programas comerciales con una relacin de costo razonable, y a medida que el mercado iba descubriendo la forma en que Smalltalk encajaba con el abanico tradicional de soluciones de programacin. Desde un principio, los diseadores de Smalltalk hicieron hincapi en un cierto nmero de ideas innovadoras y controvertidas sobre lo que debera ser la computacin:

Smalltalk-80

1.- Computacin personal:

Las computadoras son baratas, y las personas son caraas. No se deben compartir las computadoras. Dar a cada persona su propia computadora multiplicara la potencia de clculo disponible, y permitira que el rendimiento de la mquina fuera menos importante en el diseo.

Smalltalk-80

2.- Interaccin:

El entorno de computacin deber hacer cualquier cosa con tal de proporcionar una retroalimentacin inmediata para todas las acciones del usuario

Smalltalk-80

3.- Grficos:

Las personas tienen una facilidad mxima para el pensamiento visual. El texto debe ser sustituido por grficos siempre que sea posible.

Smalltalk-80

4.- Programacin orientada a objetos:

Las personas trabajan mediante conceptos de mbitos de problemas, mientras que el hardware funciona mediante conceptos distintos (operadores y operandos). Parte de la carga conceptual consiste en traducir desde el dominio del problema hasta el dominio de la computadora, haciendo que la mquina funcione en trminos de los conceptos ms conocidos del mundo habitual del usuario.

Smalltalk-80

Smalltalk-80 es el nombre de varias capas de abstraccin que, en conjunto, dan vida a estas afirmaciones. Desde un principio, los diseadores de Smalltalk-80 se inspiraron en la visin del futuro de Alan Kay, el Dynabook. Smalltalk-80 se dise para que fuese el lenguaje de programacin de sistemas en mquinas de esta potencia.

La mquina virtual

En Smalltalk-80, un objeto es algn dato privado, y una coleccin de procedimientos que pueden acceder a esos datos. Los datos son propiedad privada del objeto, y no es posible acceder a ellos sin ayuda de uno de los procedimientos de ese objeto. Los procedimientos son pblicos para todos los consumidores, que acceden al objeto mediante expresiones que contienen mensajes.

Procedimiento Procedimiento Procedimiento Procedimiento Procedimiento

Datos privados

Procedimiento Procedimiento

Procedimiento Procedimiento Procedimiento

La mquina virtual

El mensaje que contiene la expresin dice al objeto lo que debe hacer. El objeto responde al mensaje seleccionando primero y ejecutando despus un procedimiento mediante el cual todos los objetos de su clase ponen en prctica este mensaje. Este procedimiento se denomina mtodo, y la orden que lleva el mensaje se llama selector.

Objeto Mensaje: Objeto has esto


Procedimiento Procedimiento Procedimiento Procedimiento Procedimiento

Datos privados

Procedimiento Procedimiento

Procedimiento Procedimiento Procedimiento

La mquina virtual

El mensaje que contiene la expresin dice al objeto lo que debe hacer. El objeto responde al mensaje seleccionando primero y ejecutando despus un procedimiento mediante el cual todos los objetos de su clase ponen en prctica este mensaje. Este procedimiento se denomina mtodo, y la orden que lleva el mensaje se llama selector.

Objeto Mensaje: Objeto has esto


Procedimiento Procedimiento Procedimiento Metodo Procedimiento

Datos privados

Procedimiento Procedimiento

Procedimiento Procedimiento Procedimiento

La mquina virtual

El mensaje que contiene la expresin dice al objeto lo que debe hacer. El objeto responde al mensaje seleccionando primero y ejecutando despus un procedimiento mediante el cual todos los objetos de su clase ponen en prctica este mensaje. Este procedimiento se denomina mtodo, y la orden que lleva el mensaje se llama selector.

Objeto
Procedimiento Procedimiento Procedimiento Metodo Procedimiento

Datos privados

Procedimiento Procedimiento

Procedimiento Procedimiento Procedimiento

La mquina virtual

El mensaje que contiene la expresin dice al objeto lo que debe hacer. El objeto responde al mensaje seleccionando primero y ejecutando despus un procedimiento mediante el cual todos los objetos de su clase ponen en prctica este mensaje. Este procedimiento se denomina mtodo, y la orden que lleva el mensaje se llama selector.

Objeto
Procedimiento Procedimiento Procedimiento Metodo Procedimiento

respuesta del objeto

Datos privados

Procedimiento Procedimiento

Procedimiento Procedimiento Procedimiento

La mquina virtual

Smalltalk sigue exhaustivamente este principio. Absolutamente todo son objetos: no slo las entidades grandes y poco utilizadas, como las ventanas, directorios y proyectos, sino tambin las entidades muy utilizadas, de bajo nivel, como los enteros y las zonas de pila. (Por supuesto, tanto en estos casos como en otros, se lleva a cabo una potente optimizacin). La ventaja es la consecuencia que se aprecia a lo largo y ancho de todo el sistema. Todo el sistema integrado est organizado en virtud de un nico principio, de tal modo que el usuario slo necesita comprender este principio para explorar cualquier parte de Smalltalk-80. Una vez que ha aprendido a utilizar el inspector para examinar un objeto ya sabe todo lo que necesita para inspeccionar y entender las zonas de pila, enteros, nmeros de punto flotante y literalmente, cualquier cosa del sistema.

La mquina virtual

En este curso vamos a adoptar las definiciones de Smalltalk-80 para todos los conceptos orientados a objetos, incluyendo objetos, mensajes, clases y mtodos, y herencia. La exepcin principal es la forma en que se determina la duracin de los objetos. Smalltalk-80 proporciona una recoleccin automtica de basura, lo cual significa que la duracin de todos los objetos no est determinada por el programador, sino por el sistema. Cuando ya no se hace referencia a un objeto, su memoria se libera automticamente para ser reutilizada.

La mquina virtual

Para conseguir esta eficiencia, y tambin para permitir que el espacio libre se pueda reunir fcilmente cuando la memoria se fragmenta, Smalltalk asigna un significado al concepto de objeto. Normalmente, los objetos se identifican directamente mediante sus direcciones de memoria. Pero en Smalltalk se identifican a partir de un offset, dentro de una tabla de objetos, una de cuyas entradas es la direccin en memoria del objeto. Esto oculta la gestin de memoria a los ojos del programador y hace que la gestin de direcciones sea asunto del sistema, y le permite que traslade las cosas cuando sea necesaro.

La mquina virtual

Todas las cosas son objetos, incluso las entidades de bajo nivel, como los enteros cortos. Una realizacin tpica representa a los identificadores de objetos como enteros de 16 bits, de los cuales se emplean 15 bits para identificar directamente a los enteros cortos (esto es, los enteros cortos no ocupan posiciones dentro de la tabla de objetos). El otro bits se utiliza para indicar que esa identificacin no es la de un entero corto, sino un offset dentro de la tabla de objetos.
1- Es un offset dentro de la tabla de objetos

Nmero entero de 15 bits 0- No es un offset. Es un nmero solamente

La mquina virtual

Los beneficios de la recoleccin automtica de basura son muchos, porque eliminan toda una clase de errores realmente desagradables. Se elimina el problema de los punteros colgantes,

La mquina virtual

Los beneficios de la recoleccin automtica de basura son muchos, porque eliminan toda una clase de errores realmente desagradables. Se elimina el problema de los punteros colgantes, consistente en que los identificadores de objetos inexistentes (que se producen al liberar el objeto al que apuntan) pueden permanecer en un estado de animacin suspendida durante periodos arbitrarios de tiempo, y despus causan problemas difcilmente diagnosticables (errores del sistema) cuando, finalmente, se accede a ellos.

La mquina virtual

Y adems se evita el problema, igualmente peligroso, consistente en que una aplicacin que se ejecute durante mucho tiempo pueda asfixiarse por falta de memoria, como consecuencia de no haberse liberado objetos que ya no se necesitan.

La mquina virtual

Pero tambin tiene sus inconvenientes. En combinacin con el intenso uso de mensajera ligada dinmicamente por parte de Smalltalk, puede dar lugar a unos costos monumentales en lo que se refiere a los recursos de la mquina, impidiendo que se utilice Smalltalk-80 para algunas aplicaciones en que el rendimiento es imprescindible. Ciertamente, los recursos no se estn desperdiciando, sino que han sido invertidos deliberadamente, con objeto de trasladar un trabajo que normalmente realizan los programadores, que cada vez son ms onerosos, a unas mquinas que cada vez son ms baratas.

El lenguaje de programacin

La simplicidad de la mquina virtual de Smalltalk permite que el lenguaje de programacin sea tambin de una sencillez poco habitual. La compleja sintaxis que ofrece la mayora de los lenguajes resulta completamente innecesaria, porque todo es de un nico tipo, un objeto. Tampoco se necesitan estructuras de control, puesto que se realizan mediante mensajera.

El lenguaje de programacin

De hecho, el lenguaje Smalltalk slo define la sintaxis para:


1.- Declarar nombres de objetos, y asignarles valores.

sintaxis para:

2.- Enviar mensajes.

3.- Definir nuevas clases y mtodos.

los dos ltimos no necesitan una sintaxis especial, puesto que se realizan rdenes dadas con el ratn al browser, una herramienta del entorno Smalltalk-80 para leer, modificar y compilar mtodos.

Mensajes

El tipo ms sencillo de mensajes son las expresiones que contienen mensajes unarios. Un mensaje unario es un mensaje sin argumentos, as que consta de dos partes nada ms:

El nombre del objeto que debe recibir el mensaje

El nombre del mensaje

cantidad sqrt cadNombre size

Mensajes

un segundo tipo de mensaje son los que contienen expresiones con palabras reservadas. Pueden tener argumentos, tantos como partes tenga la palabra reservada. El selector de un mensaje con palabra reservada consta de una o ms palabras reservadas, cada una de las cuales precede a un argumento. Una parte de una palabra reservada es un identificador sencillo, seguido por dos puntos

indice max:limite gastosCasa gastoCantidad:540.00 porRazon:Renta

Ambos ejemplos envan un mensaje de una sola palabra reservada, aunque el selector del segundo ejemplo est escrito en dos partes, separadas por el argumento 548.00.

Mensajes

indice max:limite gastosCasa gastoCantidad:540.00 porRazon:Renta

La primera sentencia enva el mensaje max:, al objeto ndice

Mensajes

indice max:limite gastosCasa gastoCantidad:540.00 porRazon:Renta

La primera sentencia enva el mensaje max:, al objeto ndice Y la segunda sentencia enva el mensaje gastoCantidad: porRazon: al objeto gastosCasa.

Mensajes

indice max:limite gastosCasa gastoCantidad:540.00 porRazon:Renta

La primera sentencia enva el mensaje max:, al objeto ndice Y la segunda sentencia enva el mensaje gastoCantidad: porRazon: al objeto gastosCasa. En ambos casos, los dos puntos forman parte inseparable del selector del mensaje, y se mantienen, incluso, en conversaciones orales. Por ejemplo, el mensaje de la segunda lnea se enuncia gastos-casa-dospuntos-por-razn-dospuntos. Los dos puntos indican los lugares en que hay que suministrar un argumento. Tanto el receptor como los argumentos pueden ser nombres de variables, constantes u otras expresiones.

Mensajes

Los mensajes binarios se comportan igual que los mensajes con palabra reservada de un solo argumento. El selector de un mensaje binario es siempre uno o dos caracteres de un conjuntos de caracteres especiales designados al efecto. Lo siguiente son ejemplos de expresiones con mensajes binarios: 3+4 total-1 total<=max Por ltimo, se utiliza el operador de asignacin para almacenar valores en las variables: suma:=3+4 x:=theta sin Como las expresiones que contienen mensajes pueden estar fuertemente anidadas dentro de otras, se ofrecen reglas de prioridad, y se pueden utilizar los parntesis para invalidar las reglas de prioridad cuando sea necesario.

Bloques

Smalltalk es un entorno interactivo, as que las expresiones, normalmente se evalan de inmediato. Es posible almacenar expresiones para su posterior ejecucin, encerrndolas entre corchetes. Esto crea una interesante estructura llamada bloque. Un bloque es un objeto (una instancia de la clase Block) que representa una secuencia de instrucciones cuya ejecucin debe retrasarse hasta el momento en que el bloque reciba el mensaje value. La mayora de las estructuras de control de Smalltalk estn realizadas como mensajes a objetos que admiten bloques como argumentos. Por ejemplo: indice<=limite ifTrue:[total:=total+(lista at:indice)] La expresin indice<=limite es un mensaje binario que enviamos al objeto indice, y que es una instancia de alguna clase de nmero.

Bloques

indice<=limite ifTrue:[total:=total+(lista at:indice)] El nmero crea una nueva instancia de la clase Boolean, y la lnea siguiente enva a esta variable lgica el mensaje ifTrue: con una instancia de la clase Block como argumento. La variable lgica evala el bloque envindole el mensaje value si el estado de la variable lgica es TRUE.

Bloques

indice<=limite ifTrue:[total:=total+(lista at:indice)] La expresin indice<=limite es un mensaje binario que enviamos al objeto indice, y que es una instancia de alguna clase de nmero.

Eres menor que limite? indice<=limite

indice es un Numero

Bloques

indice<=limite ifTrue:[total:=total+(lista at:indice)] El nmero crea una nueva instancia de la clase Boolean, y la lnea siguiente enva a esta variable lgica el mensaje ifTrue: con una instancia de la clase Block como argumento. La variable lgica evala el bloque envindole el mensaje value si el estado de la variable lgica es TRUE.
Eres menor que limite? indice<=limite

indice es un Numero

es un Boolean

ifTrue:

Bloques

indice<=limite ifTrue:[total:=total+(lista at:indice)] El nmero crea una nueva instancia de la clase Boolean, y la lnea siguiente enva a esta variable lgica el mensaje ifTrue: con una instancia de la clase Block como argumento. La variable lgica evala el bloque envindole el mensaje value si el estado de la variable lgica es TRUE.
Eres menor que limite? indice<=limite

indice es un Numero

es un Boolean

total:=total+(lista at:indice)

ifTrue:

Bloques

Los bloques tienen un aspecto engaosamente sencillo. Oculta en el interior de la breve frase, una secuencia de instrucciones cuya ejecucin debe retrasarse, se encuentran algunas posibilidades muy potentes. Por ejemplo, aunque un bloque se parece a una sentencia compuesta de C o a una pareja BEGIN...END de Pascal, y aunque se utilicen frecuentemente de esa manera, los bloques comparten pocas de las limitaciones que imponen estos lenguajes sobre el tiempo que puede retrasarse la ejecucin. En la mayora de los lenguajes, la ejecucin no puede retrasarse ms all de la duracin del entorno, una restriccin que se deriva de la suposicin oculta consistente en que el estado de ejecucin de todo bloque de cdigo est contenido en una sencilla pila de hardware, que siempre crece o disminuye por un extremo.

Bloques

Los bloques de Smalltalk-80 no poseen esta restriccin, porque las zonas de pila son objetos, y se reservan y liberan con toda la generalidad que se ofrece para cualquier otro tipo de objeto. En particular, los bloques se reservan en el heap, y son eliminados por la colecta de basura, no cuando concluye el entorno que los cre. Cualquier bloque junto con el entorno en que fuera creado originalmente (su contexto) puede ser retenido indefinidamente, y puede ser ejecutado mucho despus de que retorne el mensaje que lo cre. Por ejemplo, lo que sigue proporciona a unConjunto instrucciones acerca de lo que tienen que hacer si falla la eliminacin de unElemento; por ejemplo, porque el conjunto no contiene ese elemento: unConjunto remove:unElemento ifFail:[...]

Bloques

unConjunto remove:unElemento ifFail:[...] Este bloque ser ejecutado por unConjunto, y no por el que hizo la llamada, pero, sin embargo, tendr acceso completo al contexto del mtodo que hiciera la llamada, incluyendo sus variables locales y sus argumentos. Al bloque se le da una referencia del contexto del que hace la llamada cuando se crea el bloque, y este contexto persiste mientras exista alguna referencia a l en alguna parte del sistema. Por ejemplo, est permitido almacenar referencias de bloques en objetos de larga duracin, como los mens, que sobreviven al procedimiento que los ha creado.

Bloques

Esta extraordinaria posibilidad se deriva directamente de la decisin de no hacer excepciones a la regla consistente en que todo debe beneficiarse de toda la potencia que el sistema proporciona para cualquier objeto, incluyendo las entidades de bajo nivel que la mayora de los lenguajes gestiona de forma especial, como las zonas de pila. Los beneficios son cuantiosos, porque este nico concepto, el bloque, saca del lenguaje un cierto nmero de temas difciles, y los pone a disposicin de los usuarios. El precio tambin es considerable, porque incluso las operaciones ms utilizadas, como la mensajera, no pueden beneficiarse del uso de rpidas pilas secuenciales especializadas, y adems soportan el peso del tratamiento de la recoleccin de basura.

El entorno de programacin

El lenguaje de programacin, las herramientas complementarias (editores de texto, enlazadores, depuradores) y el sistema operativo en s, son un todo integrado y fuertemente acoplado, y son corresidentes en un mismo espacio virtual de direcciones.

El entorno de programacin

Este entorno hace hincapi en la creatividad personal. Esto resulta especialmente evidente en su filosofa, que es hacer posible el acceso a todo el sistema, incluso a cosas que la mayora de los programadores no osara cambiar, como el sistema operativo, o la representacin de los nmeros de punto flotante. Ninguna de esas cosas est protegida.

El entorno de programacin

Todo se puede modificar de manera igualmente sencilla; incluyendo aquellos cambios que no sean congruentes con el resto del sistema y puedan hacerlo caer, o cambios que pudieran hacer que el trabajo subsiguiente no fuera compatible con el que se est desarrollando en sistemas vecinos. De manera que hay que tener mucho cuidado para no tener serios problemas con el sistema.

El entorno de programacin

La confusin que puede causar la piratera sin orden ni concierto era evidente para los diseadores de Smalltalk-80, y le oblig a pensar creativamente acerca de las herramientas necesarias para gestionar el cambio. El resultado fue un entorno maravillosamente diseado, para enfrentarse al cambio de una forma cmoda y disciplinada. Los usuarios de Smalltalk -80 trabajan en pantallas de alta resolucin, utilizando una herramienta llamada browser.

El entorno de programacin

El browser es como un editor de textos, porque puede mostrar el cdigo fuente para leerlo o editarlo. Tambin la forma fundamental de utilizar el compilador, modificando por tanto el sistema en su lugar. El browser ofrece tambin una va para que los miembros del equipo se comuniquen en lo que se refiere a su software. El entorno personal de cada programador se construye integrando peridicamente el trabajo de todo el equipo. La persona responsable de integrar el trabajo del equipo utiliza una herramienta similar al browser. Va comprobando la congruencia de cada cambio, e identifica a los objetos sospechosos para que se les preste especial atencin. Esto produce una nueva versin del sistema base, que se distribuir a todos los miembros del equipo.

El entorno de programacin

Cada una de las nuevas versiones incluye todo el cdigo fuente del sistema, incluyendo los comentarios, de tal modo que integracin/publicacin va dando a conocer peridicamente el trabajo de cada individuo al resto del grupo. Los miembros del grupo pueden utilizar el browser para conocer las contribuciones de los dems, y el browser admite estas bsquedas con ayudas que ofrecen referencias cruzadas. Esto equivale a un medio electrnico de publicar y estudiar el tipo de informacin que la mayora de los programadores gestiona de forma menos eficiente empleando el papel.

Est claro que Smalltalk es la solucin, pero, cul es el problema?

Desde un principio, el objetivo de los creadores de Smalltalk era la investigacin. La utilidad de cualquier producto resultante, como el propio Smalltalk, era puramente secundaria. En este aspecto tuvieron xito porque los frutos de su trabajo han tenido una amplia difusin. Pero, qu pasa con Smalltalk en s? Tiene su lugar ms all del entorno de la investigacin junto a los lenguajes convencionales de programacin como C, o incluso al lado de robustos dinosaurios como COBOL o FORTRAN? La aplicacin evidente es la construccin de prototipos de sistemas, que despus volvern a codificarse en lenguajes convencionales, y parece que a esto se reduce la mayor parte de su utilizacin en la actualidad.

Est claro que Smalltalk es la solucin, pero, cul es el problema?

Estas gigantescas bases de datos existen porque los ejecutivos necesitan una informacin precisa y actualizada, sobre la cual basarn sus decisiones. Pero se quejan por los retrasos e incomodidades implcitos al acceder a los datos, separados como estn de ellos por varias capas de personal dedicado a procesamiento de datos.

Est claro que Smalltalk es la solucin, pero, cul es el problema?

Smalltalk podra muy bien tener un papel, incluso en ese mundo de traje y corbata. Un programador de Smalltalk podra desarrollar clases que encapsulen el conocimiento necesario para extraer datos del entorno, y estas clases se utilizaran para permitir que otros programadores menos experimentados atendiesen directamente al ejecutivo.

Est claro que Smalltalk es la solucin, pero, cul es el problema?

Smalltalk podra muy bien tener un papel, incluso en ese mundo de traje y corbata. Un programador de Smalltalk podra desarrollar clases que encapsulen el conocimiento necesario para extraer datos del entorno, y estas clases se utilizaran para permitir que otros programadores menos experimentados atendiesen directamente al ejecutivo.

Est claro que Smalltalk es la solucin, pero, cul es el problema?

Smalltalk podra muy bien tener un papel, incluso en ese mundo de traje y corbata. Un programador de Smalltalk podra desarrollar clases que encapsulen el conocimiento necesario para extraer datos del entorno, y estas clases se utilizaran para permitir que otros programadores menos experimentados atendiesen directamente al ejecutivo.

Est claro que Smalltalk es la solucin, pero, cul es el problema?

Smalltalk podra muy bien tener un papel, incluso en ese mundo de traje y corbata. Un programador de Smalltalk podra desarrollar clases que encapsulen el conocimiento necesario para extraer datos del entorno, y estas clases se utilizaran para permitir que otros programadores menos experimentados atendiesen directamente al ejecutivo. El entorno de la computadora personal podra funcionar como acoplamiento de impedancias entre las necesidades del ejecutivo y los lmites de la computacin organizada.

Ada

Ada

La publicidad que rodea a este lenguaje es tan amplia que apenas es necesario mencionarlo de nuevo. Realizado por el Ministerio de Defensa de los Estados Unidos, Ada fue diseado como sustituto de tecnologa punta para la variada coleccin de lenguajes que se utilizaban para construir sistemas empotrados de computadoras. A lo largo de todo el proyecto se tuvo la intencin explcita de que Ada fuese obligatorio para trabajar con sistemas empotrados, en los cuales la computadora es un componente relativamente pequeo que forma parte de un sistema mucho ms grande, y que implica superficies de control de aeronaves, sistemas de armamento, ayudas para la navegacin, sistemas de comunicaciones y cosas parecidas.

Ada

El aspecto exacto en que los sistemas empotrados se diferencan de los normales, no ha estado nunca claro. Es probable que esta ambigedad sea intencionada, porque el objetivo, desde el principio, ha sido el de reducir el nmero de dialectos de lenguajes. Ada siempre ha estado rodeado de controversias. Sus diseadores han sido acusados de padecer del sndrome del cajn de sastre, porque Ada es un lenguaje amplio, lleno de posibilidades, y extremadamente complicado.

Ada

Hay caractersticas complejas y posiblemente mal comprendidas, como la multitarea y la gestin de excepciones, que se definen como parte del lenguaje; es probable que estas capacidades debieran haber sido omitidas en el lenguaje, ofrecindose en apndices separables como bibliotecas de subrutinas o paquetes de Ada. Los argumentos de ambos lados son comprensibles, dado el nfasis del Departamento de defensa para evitar una proloferacin de dialectos posiblemente incompatibles.

Caractersticas orientadas a objetos de Ada

De cualquier forma, aqu no vamos a hablar de Ada como lenguaje, sino del sentido en que se dice que Ada, y otros lenguajes como Ada, admiten una programacin orientada a objetos. Hasta ahora debera ser claro que el objetivo de Ada no es acrecentar el reino de las cosas que se pueden hacer con las computadoras, sino el de ofrecer una sola forma de hacer las cosas que hacen muchos lenguajes incompatibles pero parecidos.

Caractersticas orientadas a objetos de Ada

La complejidad de las capacidades de Ada suele obscurecer el hecho de que Ada es, bsicamente, un lenguaje convencional. Ada no tiene nada que pueda sorprender a un usuario de C, Pascal o FORTRAN que est acostumbrado a la multitarea y a la gestin de excepciones que se han pegado al lenguaje base mediante bibliotecas de subrutinas. Ada es un lenguaje con comprobacin estricta de tipos que lleva a cabo todo el enlazado en el momento de la compilacin. Los tipos de todos los datos se declaran explcitamente; es el compilador el que toma todas las decisiones en el momento de la compilacin, y no los objetos durante la ejecucin.

Caractersticas orientadas a objetos de Ada

Segn las definiciones de Smalltalk, un objeto son unos datos privados ms el grupo de procedimientos que pueden acceder a esos datos. Esta encapsulacin de datos y procedimientos se logra haciendo que los mensajes sean la nica forma en que se puede acceder a cualquier objeto. Dado que la ligadura se retrasa hasta el momento en que se enva el mensaje, no hay dificultad para trabajar con colecciones dbilmente acopladas que contengan objetos de distintos tipos.

Procedimiento

Procedimiento

Procedimiento

objeto Datos privados

Caractersticas orientadas a objetos de Ada

Segn las definiciones de Smalltalk, un objeto son unos datos privados ms el grupo de procedimientos que pueden acceder a esos datos. Esta encapsulacin de datos y procedimientos se logra haciendo que los mensajes sean la nica forma en que se puede acceder a cualquier objeto. Dado que la ligadura se retrasa hasta el momento en que se enva el mensaje, no hay dificultad para trabajar con colecciones dbilmente acopladas que contengan objetos de distintos tipos.

Procedimiento

Procedimiento

Procedimiento

Datos privados

Caractersticas orientadas a objetos de Ada

Segn las definiciones de Smalltalk, un objeto son unos datos privados ms el grupo de procedimientos que pueden acceder a esos datos. Esta encapsulacin de datos y procedimientos se logra haciendo que los mensajes sean la nica forma en que se puede acceder a cualquier objeto. Dado que la ligadura se retrasa hasta el momento en que se enva el mensaje, no hay dificultad para trabajar con colecciones dbilmente acopladas que contengan objetos de distintos tipos. Mensaje
Procedimiento Procedimiento Procedimiento

Datos privados

Caractersticas orientadas a objetos de Ada

En Ada, el mecanismo de encapsulacin lo proporciona en su totalidad el compilador, y ha desaparecido antes de la ejecucin. Esta es la ventaja de Ada, y tambin su inconveniente. Es una ventaja para el propsito para el que se dise Ada: eliminar la necesidad de mltiples lenguajes convencionales para construir aplicaciones convencionales. Es mejor para construir colecciones fuertemente acopladas en las cuales el tipo de cada componente pueda ser conocido y especificado por adelantado, porque el compilador puede comprobar que cada uno de los componentes sea el tipo especificado.

Caractersticas orientadas a objetos de Ada

Es un inconveniente en problemas en que el cambio no se pueda gestionar editando el fuente y el recompilando. El factor clave para la distincin es el grado hasta el cual se puede tratar el cambio al principio de diseo, antes de que el programa llegue al compilador. En Ada, el proveedor de una nueva capacidad la ofrece definiendo un paquete. El paquete contiene algunas partes que sern propiedad privada del proveedor, y otras que deben ser publicadas para el cdigo del consumidor. Tpicamente, el cdigo y la distribucin precisa de los campos dentro del objeto son privados, pero esto no es necesario en modo alguno. El proveedor decide lo que ha de publicarse, y lo que no.

Paquetes

Por ejemplo, el proveedor de un paquete de grficos podra definir un nuevo tipo de datos, vector, para manejar coordenadas bidimencionales.

package PaqueteGeometriaBiDimensional is type vector is record x : integer; y : integer; end record function + (a,b: in vector) return vector; function - (a,b: in vector) return vector; end PaqueteGeometriaBiDimensional;

Paquetes

Este paquete define una interfaz entre el consumidor y el proveedor pero no la realizacin que subyace a esta interfaz. Esto se describe por separado, en el cuerpo del paquete:

package body PaqueteGeometriaBiDimensional is function + (a,b : in vector) return vector is begin -- instrucciones end function - (a,b : in vector) begin -- instrucciones end begin -- instrucciones para la iniciacin end PaqueteGeometriaBiDimensional

Paquetes

El consumidor indica al compilador que utilice un paquete mediante una sentencia with, dando lugar a que las partes pblicas del paquete sean conocidas para el cdigo del consumidor. El consumidor puede utilizar los servicios del paquete en cualquier forma que haya previsto el proveedor. Por ejemplo:

with PaqueteGeometriaBiDimensional; origen, extension, esquina: vector; esquina = origen + extension;

a + b

a - b

Datos privados

PaqueteGeometriaBiDimensional

Paquetes

Obsrvese que Ada permite la sobrecarga de operadores, de tal modo que los operadores de nombres convencionales, como +, pueden recibir significados especiales para tipos de datos definidos por el usuario. El compilador es capaz de apreciar que:
esquina = origen + extension;

No debe tratarse de la misma forma que:


suma = 2 + 2

Porque el compilador sabe que origen y extension son del tipo vector, y que un paquete ha invalidado el significado convencional del smbolo + para este tipo. Aunque las ventajas de la sobrecarga de operadores son evidentes para los smbolos matemticos convencionales como +, tambin es aplicable a nombres de funciones convencionales, como sqrt, calcCorreccionGisroscopio, o aceleraAMaximoImpulso

Discusin

La aproximacin de Ada a la programacin orientada a objetos, tiene sus ventajas y sus inconvenientes, y no es correcto afirmar con ademn categrico y aire ofendido que Esto es una ventaja o que Eso es un inconveniente, sin dejar claro con respecto a qu alternativa? o bien Es el contexto de qu problema? Una de las decisiones claves de Ada es que la semntica de un programa dado debera quedar determinada estticamente. Ada lleva la ligadura esttica ms all que los lenguajes de programacin anteriores, como C. Pero para aquellos programas que no puedan ser especificados estticamente, Ada slo ofrece tipos de acceso. Los tipos de acceso son nicamente punteros; son trucos que permiten al programador realizar colecciones dbilmente acopladas de la misma manera que se hara en C, realizando manualmente la ligadura dinmica con ligadura por parte del consumidor.

Discusin

Una de las causas de desilucin de Ada son las limitaciones a la hora de definir tipos nuevos reutilizando algn tipo existente. Aunque Ada proporciona tipos y subtipos derivados, esto no es sino una forma de restringir tipos generales, como el integer, para limitarlos a un cierto intervalo o propsito especfico, como diaDeLaSemana. Ninguno de ellos posibilita la extensin de un tipo preexistente aadiendo cambios y operaciones adicionales. Esto es un problema serio, porque elimina la posibilidad, incluso, de tener tipos de herencia limitados, y obliga al desarrollador de cada tipo nuevo a duplicar un cdigo que est contenido en tipos ms generales.

Discusin

El concepto de paquete (package) es una verdadera mejora con respecto a los lenguajes convencionales como C. Pero su importancia es difcil de cuantificar. Su mejora es comparable a la mejora consistente en pasar de un lenguaje no estructurado como FORTRAN a un lenguaje estructurdo como C, pero de importancia menor que la obtenida al pasar del lenguaje ensamblador a FORTRAN. Otras partes de la filosofa de Ada, sobre todo la insistencia en que haya un nico lenguaje para todos los desarrollos de software, tienen mayor probabilidad de proporcionar ventajas realmente significativas.

Discusin

La ligadura esttica obtiene su eficiencia acoplando las decisiones realizadas por el proveedor con las del consumidor en el momento de la compilacin, exactamente igual que sucede en los lenguajes convencionales que el DOD haba estado utilizando por dcadas. Ada ofrece posibilidades nuevas para hacer disminuir este acoplamiento, pero, ciertamente ofrece un excelente apoyo para gestionar el acoplamiento fuerte de una manera cmoda. Y quizs esto sea para bien, porque Ada ya es demasiado grande y demasiadocomplicado para su propio bien. por qu vamos a lamentar el hecho de que slo admita la ligadura esttica, cuando se puede aadir la ligadura dinmica?

C++

C++ es una mejora evolutiva del lenguaje C desarrollado en Bell Laboratories. C++ es particularmente interesante en vista del nfasis que haremos en C objetivo, porque hace contrastar lo que se puede lograr redefiniendo el lenguaje de programacin en s, frente a lo que se consigue aadiendo capacidades orientadas a objetos a un lenguaje base inmutable. C-Objetivo aade objetos ligados dinmicamente, clases y herencia al lenguaje C estndar. Esto aade justamente las capacidades sificientes para admitir la encapsulacin y la herencia, lo suficiente para que se pueda aplicar la tecnologa de software integrado a problemas de construccin de sistemas y nopara mejorar el lenguaje de programacin en s.

Laboratorios Bell

C++ fue evolucionando en los Laboratorios Bell para alcanzar los objetivos siguientes: 1.- Mantener la extremadamente alta eficiencia y transportabilidad por las cuales es famoso C 2.- Mantener la compatibilidad entre C++ y C 3.- Corregir algunos fallos de largo tiempo soportados, concretamente la lasitud de C a efectos del tratamiento de tipos. C ha sido criticado desde hace mucho tiempo por su dbil comprobacin de tipos, incluso dentro de una funcin dada, y por no hacer comprobacin de tipos entre funciones, ni siquiera dentro del mismo archivo. 4.- Actualizar a C para adecuarlo a los modernos principios de ocultacin de informacin.

Laboratorios Bell

C++ es casi un superconjunto puro del lenguaje C, con unas pocas incompatibilidades de escasa importancia. Entre sus mejoras se cuenta la posibilidad de definir nuevos tipos de datos (clases), operaciones con esos tipos (operadores y funciones), y un amplio conjunto de maneras de controlar las operaciones que se hagan con esos tipos, entre las que se incluye la sobrecarga de operadores, los constructores y los destructores.

Clases

Los nuevos tipos de datos se definen mediante la sentencia class, que es una generalizacin de la vieja sentencia struct, a la cual sustituye, pero que se mantiene a efectos de compatibilidad hacia atrs (struct se trata como un caso especial de class, en el cual todos los miembros son pblicos). Por ejemplo, lo que sigue es equivalente a la declaracin de una struct:

class ostream { public: FILE *file; int nextchar; char buff[128]; };

Clases

Los nuevos tipos de datos se definen mediante la sentencia class, que es una generalizacin de la vieja sentencia struct, a la cual sustituye, pero que se mantiene a efectos de compatibilidad hacia atrs (struct se trata como un caso especial de class, en el cual todos los miembros son pblicos). Por ejemplo, lo que sigue es equivalente a la declaracin de una struct:
class ostream { public: FILE *file; int nextchar; char buff[128]; };

As se declara una clase nueva, ostream, con tres miembros: file, nextchar y buf. La palabra reservada public: hace que estos nombres sean pblicos, y que pueda acceder a ellos cualquier programa que contenga esta declaracin. La nica diferencia entre una class y una struct es que los miembros de la struct son pblicos por omisin, mientras que los miembros de la class son privados (private) a no ser que se indique explcitamente lo contrario. Aunque las structs solo podan tener a datos como miembros, las clases tambin pueden tener miembros de procedimientos, o funciones. Estas funciones pueden ser de dos tipos: funciones friend y funciones member.

Funciones friend

Las funciones friend son funciones convencionales de C. No tienen relacin especial con la clase, salvo que se les permite hacer referencia a cualquier miembro que sea un dato y haya sido declarado private (por aparecer delante del marcador public:)
class fecha { int dia, mes, agno; public: friend void fijaFecha(fecha*, int, int, int); friend void siguienteFecha(fecha*); friend void siguienteHoy(); friend void imprimirFecha(fecha*); }

Funciones friend

Las funciones friend son funciones convencionales de C. No tienen relacin especial con la clase, salvo que se les permite hacer referencia a cualquier miembro que sea un dato y haya sido declarado private (por aparecer delante del marcador public:)
class fecha { int dia, mes, agno; public: friend void fijaFecha(fecha*, int, int, int); friend void siguienteFecha(fecha*); friend void siguienteHoy(); friend void imprimirFecha(fecha*); }

Esto hace que la realizacin de las fechas sea privada (private), y que slo se pueda acceder a ellas mediante las cuatro funciones friend.

Funciones friend

Las funciones friend son funciones convencionales de C. No tienen relacin especial con la clase, salvo que se les permite hacer referencia a cualquier miembro que sea un dato y haya sido declarado private (por aparecer delante del marcador public:)
class fecha { int dia, mes, agno; public: friend void fijaFecha(fecha*, int, int, int); friend void siguienteFecha(fecha*); friend void siguienteHoy(); friend void imprimirFecha(fecha*); }

Esto hace que la realizacin de las fechas sea privada (private), y que slo se pueda acceder a ellas mediante las cuatro funciones friend.

Los tipos de los argumentos que admiten estas funciones tambin se declaran; estos tipos no slo son comprobados por el compilador, sino que, adems, se utilizan tambin para guiar las decisiones de enlazado.

Funciones friend

Las funciones friend son funciones convencionales de C. No tienen relacin especial con la clase, salvo que se les permite hacer referencia a cualquier miembro que sea un dato y haya sido declarado private (por aparecer delante del marcador public:)
class fecha { int dia, mes, agno; public: friend void fijaFecha(fecha*, int, int, int); friend void siguienteFecha(fecha*); friend void siguienteHoy(); friend void imprimirFecha(fecha*); }

Esto hace que la realizacin de las fechas sea privada (private), y que slo se pueda acceder a ellas mediante las cuatro funciones friend.

Los tipos de los argumentos que admiten estas funciones tambin se declaran; estos tipos no slo son comprobados por el compilador, sino que, adems, se utilizan tambin para guiar las decisiones de enlazado. Esta clase podra utilizarse, por tanto, como sigue:
fecha miCumpleagnos, hoy; fijarFecha(&miCumpleagnos,30,12,1980); fijarFecha(&hoy,12,11,2004); imprimirFecha(&hoy); siguienteFecha(&hoy);

Funciones miembro

Aunque las funciones friend son funciones convencionales, las funciones miembro, sin embargo, estn asociadas a la clase en el mismo sentido en lo que lo estn los miembros que son datos. Las funciones miembro son las que dan a C++ su aroma orientado a objetos. Sirven para realizar operaciones en una instancia de alguna clase, mientras que las funciones friend no son ms que funciones estndar de C a las que se les permite hacer referencia a los nombres de los miembros privados. Las funciones miembro se declaran mencionando su declaracin dentro de la declaracin de la clase, junto con la declaracin de las variables miembro:

class fecha { int dia, mes, agno; /* la realizacion de las fechas*/ public: void fijar(int int, int, int) /* la interfaz de las fechas*/ void siguiente(); void imprimir(); };

Funciones miembro

Las funciones miembro se invocan mediante una sintaxis que refleja su papel de operaciones realizadas por un cierto objeto, y sigue la pauta de la forma en que se accede a los miembros de una estructura:
miCumpleagnos.imprimir(); hoy.siguiente();

Para definir una funcin miembro, es preciso proporcionar tambin el nombre de su clase:
void fecha.siguiente(){ dia=dia + 1; if(mes== FEB && dia > 28) ... }

Tales funciones reciben siempre un argumento implcito, this, que identifica al objeto que lleva a cabo la accin. En este ejemplo, el campo dia se piede identificar tanto en la forma dia como en la forma this->dia.

Clases derivadas

C++ tambin proporciona la posibilidad de definir subclases con herencia, describiendo la forma en que la clase nueva (derivada) difiere de alguna superclase anterior (a la que hereda). Esta tcnica es distinta en ciertos detalles de la empleada por Objective-C, y pierde generalidad y espacio en memoria para ganar una mayor comprobacin de tipos en el momento de la compilacin y una cierta cantidad de eficiencia. Por ejemplo, una clase de formas se podra definir como sigue:
class forma{ vector centro; int color; int color; forma *siguiente; public: void mover(vector); vector donde(); virtual void rotar(int); virtual void dibujar(); }

/* /* /* /*

cambiar la posicion de una forma */ responde con la posicion de la forma*/ rotar una forma */ mostrar una forma */

Clases derivadas

Las funciones virtuales son funciones que no se podran realizar sin conocer la forma concreta de que se trate, y que deben ser invalidadas, por tanto en cada subclase:

class circulo{ float radio; public: void rotar(int){ ; } /* como se rota un circulo */ void dibujar(); /* como se dibuja un circulo */ ... };

La palabra reservada virtual indica que stas funciones deben enlazarse dinmicamente, y fuerza al compilador a aadir un miembro invisible a cada instancia que indica explcitamente su clase en el momento de la ejecucin.

Clases derivadas

Ahora es posible definir subclases que obedezcan a un protocolo comn, de tal modo que se puede dbujar cualquier forma mediante:
cualquierInstancia.dibujar();

C++ permite derivar una clase nueva a partir de mltiples superclases (herencia mltiple). Los conflictos que surgen como consecuencia de que la clase nueva herede miembros con los mismos nombres de ms de una clase se resuelven segn un cierto conjunto de reglas del lenguaje.

Clases derivadas

Por ejemplo, para derivar una clase llamada plato a partir de las clases crculo y recipiente, que ya existan con anterioridad, se creara la declaracin siguiente:

class plato: public circulo, recipiente { /* ... */ };

Clases derivadas

Adems de mostrar que plato debe realizarse copiando las variables y mtodos de crculo y recipiente, esta sentencia indica tambin el tipo de acceso a los miembros de las clases base circulo y recipiente que tendr un usuario de plato. La palabra reservada public que va delante de circulo indica que los usuarios de plato comparten los mismos privilegios de acceso a los miembros protegidos y pblicos de circulo que posee el propio plato. Por otra parte, la ausencia de una palabra reservada delante de recipiente lo identifica como privado. El acceso a los miembros pblicos y protegidos de circulo est limitado nicamente a plato; los usuarios de plato no pueden acceder en absoluto a los miembros de recipiente. Este mecanismo permite al diseador de clases restringir de manera selectiva el acceso a sus superclases.

Datos protegidos

Cuando se deriva una clase nueva de una clase vieja, surge la duda: a qu debera tener acceso la clase derivada? en C++ el acceso de la clase derivada a los miembros de la clase base es gestionado por el creador de la clase base. El creador puede especificar que los miembros de la clase sean de acceso pblico, privado o protegido. Supongamos que variamos la definicin de la clase forma para que quede como sigue:
class forma{ private: forma *siguiente; protected: vector centro; int color; public: .... }

Las funciones miembro y las funciones friend de las clases derivadas podran acceder a los miembros centro y color de la clase forma, puesto que se ha indicado que son protected. Sin embargo, no podran acceder al miembro siguiente, puesto que ha sido marcado como private

Sobrecarga de operadores

LAs capacidades descritas para las funciones son aplicables tambin a otros operadores. Anteponiendo al smbolo de un operador la palabra reservada operator, es posible ofrecer una nueva realizacin de ese operador. Por ejemplo, el ltimo par de declaraciones que se ven a continuacin definen la forma en que debe comportarse + para la clase vectores:
class vector{ int x,y; public vector(int xc, int yc){x= xc; y= yc;} /* constructor */ vector(int xc){ x= xc; y=0; } /* constructor */ vector(vector p){ x= p.x; y=p.y;} /* constructor */ friend vector operator+(vector, vector); /* sumar dos vectores */ friend vector operator+(vector, int); /* sumar un vector y un entero */ ... }

Sobrecarga de operadores

Las capacidades descritas para las funciones son aplicables tambin a otros operadores. Anteponiendo al smbolo de un operador la palabra reservada operator, es posible ofrecer una nueva realizacin de ese operador. Por ejemplo, el ltimo par de declaraciones que se ven a continuacin definen la forma en que debe comportarse + para la clase vectores:
class vector{ int x,y; public vector(int xc, int yc){x= xc; y= yc;} /* constructor */ vector(int xc){ x= xc; y=0; } /* constructor */ vector(vector p){ x= p.x; y=p.y;} /* constructor */ friend vector operator+(vector, vector); /* sumar dos vectores */ friend vector operator+(vector, int); /* sumar un vector y un entero */ ... }

Sobrecarga de operadores

Esto define vectores en unplano bidimensional de coordenadas enteras. Las tres funciones llamadas vector son constructores. Los constructores definen la forma en que se construyen los nuevos vectores cuando aparecen en sentencias de iniciacin y tambin cuando se construyen muevos vectores en la pila al llamar a una funcin. Dado que la declaracin tambin contiene la realizacin de estos operadores, la realizacin se expandir en lnea, y no se incurrir en un gasto adicional de tiempo para dar valores iniciales a los vectores. Esa caracterstica de expansin en lnea se aplica a cualquier tipo de operador que pueda ser declarado en una clase, no slo en los constructores

Sobrecarga de operadores

Los tres operadores restantes definen la forma en que funciona el operador + cuando los dos lados son vectores, o cuando el lado derecho es un entero. La declaracin podra extenderse, para construir una clase de vectores completa, con productos por escalares, productos vectoriales, productos tensoriales, etc.
vector este = (1), norte = (0, 1); vector norEste = norte + este;

Administracin de la memoria

En C++ es posible asignar dinmicamente nuevos objetos en el montculo (heap), y despus se accede a ellos mediante sus direcciones. Tambin se pueden reservar objetos estticamente, y se accede a ellos por su nombre, como en el caso de los tres vectores que se han mostrado en el ejemplo anterior. En el momento de la ejecucin, el espacio correspondiente a los objetos conocidos por sus nombres debe recibir valores iniciales siempre que su nombre quede dentro del mbito. Por ejemplo:

Administracin de la memoria

1.- Los objetos que se pasen como argumentos a funciones, y los objetos que se declares como variables locales (auto), deben recibir valores iniciales cuando se llamen a esa funcin. 2.- Los objetos que porporcionan las funciones deben recibir valores iniciales cuando retorne la funcin. 3.- Los objetos que estn en la pila de llamada a la funcin (los argumentos y variables locales) deben ser destruidos cuando la funcin retorne y se retraiga la pila.

Administracin de la memoria

C++ ofrece un camino para que el desarrollador de la clase especifique lo que debera suceder en estos casos. El ejemplo del vector muestra cmo se especifican los operadores de construccin. La inversa es una operacin destructor, cuyo nombre ser el nombre de la clase precedido por el smbolo ~. Por ejemplo, una clase de cadenas podra ser:
class cadena { int longitud; char *bytes; cadena(char *); /*constructor de cadenas */ ~cadena(){ delete bytes }; /* destructor de cadenas */ public: int longitud(){ return longitud } char *texto(){ return bytes } }; cadena.cadena(char *c){ longitud=strlen(c); bytes = new char[longitud +1]; strcpy(bytes, c); }

Administracin de la memoria

Esto garantiza que todas las instancias de cadenas que se creen cuando las cadenas se pasen a funciones, y cuando stas las proporcionen, sean una sola copia. Pero no se gestionan las referencias mltiples que se crean cuando se asigna explcitamente una cadena a otra en una sentencia de asignacin. Esto se puede lograr invalidando el operador de asignacin.

Administracin de la memoria

Obsrvese que, aun cuando esto no sustituye a la recoleccin automtica de basura, puede, a veces, disminuir la necesidad de llevarla a cabo. La recoleccin automtica de basura sigue siendo deseable cuando se hacen mltiples referencias a los objetos a travs de punteros. Copiando los objetos cada vez que se necesitan, no existen las referencias mltiples, a s que es posible liberar los objetos siempre que quedan fuera de nuestro mbito. Por ejemplo, la realizacin de cadenas que se muestra aqu implica la reserva e iniciacin de una copia cada vez que se pasa la cadena a una funcin, y el tiempo adicional requerido podra fcilmente resultar inadmisible. C++ no ofrece recoleccin automtica de basura.

Compilacin por separado

Cada compilacin se realiza de modo aislado, C++ no recuerda las compilaciones anteriores, as que todas las declaraciones acerca de clases externas deben ser incorporadas manualmente a cada archivo fuente. C++ no ofrece ms ayuda para hacer esto que la habitual sentencia #include. No impone restricciones a la forma en que se haga esto, ni realiza ninguna comprobacin para asegurarse de que la informacin sea congruente entre compilaciones.

Compilacin por separado

En la prctica, para cada clase se preparan dos archivos. El primero es un archivo de declaraciones, que debe ser includo en todos los archivos que utilicen esa clase. El segundo es un archivo de definiciones, que se compila y se archiva, y que el enlazador combina para formar la imagen ejecutable. Todo el contenido del primer archivo es, por tanto, informacin pblica, mientras que el segundo es verdaderamente privado slo cuando se compila en forma binaria. Esto hace que las distinciones entre pblico y privado que ofrece la declaracin de las clases induzcan a la confusin. El archivo se puede leer desde fuera del lenguaje; se puede, incluso, copiar y modificar para hacer que el cdigo de un consumidor pueda acceder a la informacin privada.

Qu significa orientado a objetos?

Hemos empezado este captulo preguntndonos Qu significa orientado a objetos? Incluso despus de estudiar varios lenguajes diferentes que son orientados a objetos, queda todava una incertidumbre considerable acerca de lo que significa este calificativo. Nadie se siente confuso cuando se emplean adjetivos como pequeo o rpido. Pero con respecto al desarrollo de SW es muy fcil perder la orientacin. Por tanto para entender el significado de cualquier calificativo, y especialmente orientado a objetos, debemos poner especialmente cuidado para especificar el contexto en que se aplica.

Qu significa orientado a objetos?

Hemos empezado este captulo preguntndonos Qu significa orientado a objetos? Incluso despus de estudiar varios lenguajes diferentes que son orientados a objetos, queda todava una incertidumbre considerable acerca de lo que significa este calificativo. Nadie se siente confuso cuando se emplean adjetivos como pequeo o rpido. Pero con respecto al desarrollo de SW es muy fcil perder la orientacin. Por tanto para entender el significado de cualquier calificativo, y especialmente orientado a objetos, debemos poner especialmente cuidado para especificar el contexto en que se aplica.

Contacto: acaceres@computacion.cs.cinvestav.mx abdiel@mazatlan.udo.mx


Abdiel E. Cceres Gonzlez Centro de Investigacin y de Estudios Avanzados - IPN Mxico D.F., Mxico. 2004

Vous aimerez peut-être aussi