Successfully reported this slideshow.

Poo 03

572 views

Published on

  • Be the first to comment

  • Be the first to like this

Poo 03

  1. 1. Programación orientada a objetos Abdiel E. Cáceres GonzálezCentro de Investigación y de Estudios Avanzados - IPN México D.F., México. 2004
  2. 2. ¿Qué es la programación orientada a objetos?
  3. 3. ¿Qué es la programación orientada a objetos?Orientado a objetos ha sido la expresión de moda de los últimosaños. De repente, todo el mundo la utiliza, pero con un abanicode significados tan amplio que nadie parece saber exactamentelo que dicen los demás. Es difícil imaginar dos lenguajes deprogrmación tan diferentes como los son Smalltalk-80 y Ada, y,sin embargo, a veces se dice qde los dos que son orientados aobjetos. Otros piensan que los objetos son fundamentalmente unamanera de expresar la concurrencia, y aún hay quien dice queson una forma de organizar jerárquicamente unos hechoscomplejos.¿Cómo es posible que un mismo término esté relacionado concosas tan distintas como los lenguajes de programación, lasinterfaces de usuario, esquemas para representar elconocimiento de los expertos, sistemas operativosdistruibuidos, sistemas de conmutación para telefonía, y muchasmás? ¿Qué es lo que significa realmente orientado a objetos?
  4. 4. ¿Qué es la programación orientada a objetos?Más allá del entorno de las computadoras, la palabra objetosignifica algo que está bien determinado. Los lápices,colibríes, moléculas y galaxias son objetos, pero los océanos,la niebla, y el sarampión no son objetos.Aunque el concepto de espacio de direcciones de una computadorano define lo que son unos límites dien definidos, losprogramadores han decidido adoptar esta palabra. Sin definir enprimer lugar los términos clave, como es “límites”, no podemosesperar que sea posible entender el significado de una palabracomo “objeto”.Aquí vamos a examinar varios significados del término,describiendo la forma en que se utiliza la palabra en varioslenguajes de programación. El objetivo no es ofrecer unapanorámica exhaustiva de todo lo que se ha hecho o se ha dichocon el nombre de programación orientada a objetos, sinodescribir unos cuantos puntos de vista clave, de entre los quese han explorado en el espectro de posibilidades.
  5. 5. Smalltalk-80Smalltalk-80 es un lenguaje de programación y un entorno deprogramación integrados. Es el resultado de más de una décadade investigación del Software Concepts Group mantenido porXerox PARC (Palo Alto Research Center). Smalltalk es un sistemanotablemente influyente. No sólo ha afectado a otros productoscomerciales, como es sistema Star de ofimática y el sistemaInterlisp-D de Ingeniería del conocimiento. Xerox Star computer system introducida en Abril 1981Además, ha influido sobre muchos otros sistemas académicos ycomerciales
  6. 6. Smalltalk-80Su influencia sobre muchos otros sistemas Lisa y Macintosh deApple es algo ampliamente aceptado, por no mencionar su efectosobre toda una gama de productos menos conocidos de ofimática,autoedición y diseño asistido por computadora. Gran parte delentusiasmo actual por las estaciones gráficas de altaresolución, las interfaces por iconos de usuario, y lascomputadoras personales, tiene unas raíces que nos llevan a lademostración del valor y la realizabilidad de aquellas ideas. sistema Lisa (1984)
  7. 7. Smalltalk-80Antes, el valor de Smalltalk residía en probar conceptos queposteriormente se explotaban en otros sistemas, y no como unsistema de importancia comercial por derecho propio. Estocambió después, a medida que empezaron a estar disponiblesprogramas comerciales con una relación de costo razonable, y amedida que el mercado iba descubriendo la forma en queSmalltalk encajaba con el abanico tradicional de soluciones deprogramación.Desde un principio, los diseñadores de Smalltalk hicieronhincapié en un cierto número de ideas innovadoras ycontrovertidas sobre lo que debería ser la computación:
  8. 8. Smalltalk-801.- Computación personal: Las computadoras sonbaratas, y las personas son caraas. No se deben compartir lascomputadoras. Dar a cada persona su propia computadoramultiplicaría la potencia de cálculo disponible, y permitiríaque el rendimiento de la máquina fuera menos importante en eldiseño.
  9. 9. Smalltalk-802.- Interacción: El entorno de computación deberá hacercualquier cosa con tal de proporcionar una retroalimentacióninmediata para todas las acciones del usuario
  10. 10. Smalltalk-803.- Gráficos: Las personas tienen una facilidad máximapara el pensamiento visual. El texto debe ser sustituido porgráficos siempre que sea posible.
  11. 11. Smalltalk-804.- Programación orientada a objetos: Laspersonas trabajan mediante conceptos de ámbitos de problemas,mientras que el hardware funciona mediante conceptos distintos(operadores y operandos). Parte de la carga conceptual consisteen traducir desde el dominio del problema hasta el dominio dela computadora, haciendo que la máquina funcione en términos delos conceptos más conocidos del mundo habitual del usuario.
  12. 12. Smalltalk-80Smalltalk-80 es el nombre de varias capas de abstracción que,en conjunto, dan vida a estas afirmaciones. Desde un principio,los diseñadores de Smalltalk-80 se inspiraron en la visión delfuturo de Alan Kay, el Dynabook. Smalltalk-80 se diseñó paraque fuese el lenguaje de programación de sistemas en máquinasde esta potencia.
  13. 13. La máquina virtualEn Smalltalk-80, un objeto es algún dato privado, y unacolección de procedimientos que pueden acceder a esos datos.Los datos son propiedad privada del objeto, y no es posibleacceder a ellos sin ayuda de uno de los procedimientos de eseobjeto. Los procedimientos son públicos para todos losconsumidores, que acceden al objeto mediante expresiones quecontienen mensajes. Procedimiento Procedimiento Procedimiento Procedimiento Procedimiento Datos Procedimiento privados Procedimiento Procedimiento Procedimiento Procedimiento
  14. 14. La máquina virtualEl mensaje que contiene la expresión dice al objeto lo que debehacer. El objeto responde al mensaje seleccionando primero yejecutando después un procedimiento mediante el cual todos losobjetos de su clase ponen en práctica este mensaje. Esteprocedimiento se denomina método, y la orden que lleva elmensaje se llama selector. ObjetoMensaje: Objeto has esto Procedimiento Procedimiento Procedimiento Procedimiento Procedimiento Datos Procedimiento privados Procedimiento Procedimiento Procedimiento Procedimiento
  15. 15. La máquina virtualEl mensaje que contiene la expresión dice al objeto lo que debehacer. El objeto responde al mensaje seleccionando primero yejecutando después un procedimiento mediante el cual todos losobjetos de su clase ponen en práctica este mensaje. Esteprocedimiento se denomina método, y la orden que lleva elmensaje se llama selector. ObjetoMensaje: Objeto has esto Procedimiento Procedimiento Procedimiento Metodo Procedimiento Datos Procedimiento privados Procedimiento Procedimiento Procedimiento Procedimiento
  16. 16. La máquina virtualEl mensaje que contiene la expresión dice al objeto lo que debehacer. El objeto responde al mensaje seleccionando primero yejecutando después un procedimiento mediante el cual todos losobjetos de su clase ponen en práctica este mensaje. Esteprocedimiento se denomina método, y la orden que lleva elmensaje se llama selector. Objeto Procedimiento Procedimiento Procedimiento Metodo Procedimiento Datos Procedimiento privados Procedimiento Procedimiento Procedimiento Procedimiento
  17. 17. La máquina virtualEl mensaje que contiene la expresión dice al objeto lo que debehacer. El objeto responde al mensaje seleccionando primero yejecutando después un procedimiento mediante el cual todos losobjetos de su clase ponen en práctica este mensaje. Esteprocedimiento se denomina método, y la orden que lleva elmensaje se llama selector. Objeto Procedimiento Procedimiento Procedimiento Metodo Procedimiento Datos respuesta del objeto Procedimiento privados Procedimiento Procedimiento Procedimiento Procedimiento
  18. 18. La máquina virtualSmalltalk sigue exhaustivamente este principio. Absolutamentetodo son objetos: no sólo las entidades grandes y pocoutilizadas, como las ventanas, directorios y proyectos, sinotambién las entidades muy utilizadas, de bajo nivel, como losenteros y las zonas de pila. (Por supuesto, tanto en estoscasos como en otros, se lleva a cabo una potente optimización).La ventaja es la consecuencia que se aprecia a lo largo y anchode todo el sistema. Todo el sistema integrado está organizadoen virtud de un único principio, de tal modo que el usuariosólo necesita comprender este principio para explorar cualquierparte de Smalltalk-80. Una vez que ha aprendido a utilizar elinspector para examinar un objeto ya sabe todo lo que necesitapara inspeccionar y entender las zonas de pila, enteros,números de punto flotante y literalmente, cualquier cosa delsistema.
  19. 19. La máquina virtualEn este curso vamos a adoptar las definiciones de Smalltalk-80para todos los conceptos orientados a objetos, incluyendoobjetos, mensajes, clases y métodos, y herencia.La exepción principal es la forma en que se determina laduración de los objetos. Smalltalk-80 proporciona unarecolección automática de basura, lo cual significa que laduración de todos los objetos no está determinada por elprogramador, sino por el sistema. Cuando ya no se hacereferencia a un objeto, su memoria se libera automáticamentepara ser reutilizada.
  20. 20. La máquina virtualPara conseguir esta eficiencia,y también para permitir que elespacio libre se pueda reunirfácilmente cuando la memoria sefragmenta, Smalltalk asigna unsignificado al concepto deobjeto. Normalmente, los objetosse identifican directamentemediante sus direcciones dememoria. Pero en Smalltalk seidentifican a partir de unoffset, dentro de una tabla deobjetos, una de cuyas entradases la dirección en memoria delobjeto. Esto oculta la gestiónde memoria a los ojos delprogramador y hace que lagestión de direcciones seaasunto del sistema, y le permiteque traslade las cosas cuandosea necesaro.
  21. 21. La máquina virtualTodas las cosas son objetos, incluso las entidades de bajonivel, como los enteros cortos.Una realización típica representa a los identificadores deobjetos como enteros de 16 bits, de los cuales se emplean 15bits para identificar directamente a los enteros cortos (estoes, los enteros cortos no ocupan posiciones dentro de la tablade objetos). El otro bits se utiliza para indicar que esaidentificación no es la de un entero corto, sino un offsetdentro de la tabla de objetos. 1- Es un offset dentro de la tabla de objetos Número entero de 15 bits 0- No es un offset. Es un número solamente
  22. 22. La máquina virtualLos beneficios de la recolección automática de basura sonmuchos, porque eliminan toda una clase de errores realmentedesagradables. Se elimina el problema de los punteroscolgantes,
  23. 23. La máquina virtualLos beneficios de la recolección automática de basura sonmuchos, porque eliminan toda una clase de errores realmentedesagradables. Se elimina el problema de los punteroscolgantes, consistente en que los identificadores de objetosinexistentes (que se producen al liberar el objeto al queapuntan) pueden permanecer en un estado de animación suspendidadurante periodos arbitrarios de tiempo, y después causanproblemas difícilmente diagnosticables (errores del sistema)cuando, finalmente, se accede a ellos.
  24. 24. La máquina virtualY además se evita el problema, igualmente peligroso,consistente en que una aplicación que se ejecute durante muchotiempo pueda asfixiarse por falta de memoria, como consecuenciade no haberse liberado objetos que ya no se necesitan.
  25. 25. La máquina virtualPero también tiene sus inconvenientes. En combinación con elintenso uso de mensajería ligada dinámicamente por parte deSmalltalk, puede dar lugar a unos costos monumentales en lo quese refiere a los recursos de la máquina, impidiendo que seutilice Smalltalk-80 para algunas aplicaciones en que elrendimiento es imprescindible.Ciertamente, los recursos no se están desperdiciando, sino quehan sido invertidos deliberadamente, con objeto de trasladar untrabajo que normalmente realizan los programadores, que cadavez son más onerosos, a unas máquinas que cada vez son másbaratas.
  26. 26. El lenguaje de programaciónLa simplicidad de la máquina virtual de Smalltalk permite queel lenguaje de programación sea también de una sencillez pocohabitual. La compleja sintaxis que ofrece la mayoría de loslenguajes resulta completamente innecesaria, porque todo es deun único tipo, un objeto.Tampoco se necesitan estructuras de control, puesto que serealizan mediante mensajería.
  27. 27. El lenguaje de programaciónDe hecho, el lenguaje Smalltalk sólo define la sintaxis para: 1.- Declarar nombres de objetos, y asignarles valores. sintaxis para: 3.- Definir nuevas clases 2.- Enviar mensajes. y métodos.los dos últimos no necesitan una sintaxis especial, puesto quese realizan órdenes dadas con el ratón al browser, unaherramienta del entorno Smalltalk-80 para leer, modificar ycompilar métodos.
  28. 28. MensajesEl tipo más sencillo de mensajes son las expresiones quecontienen mensajes unarios. Un mensaje unario es un mensaje sinargumentos, así que consta de dos partes nada más: El nombre del objeto que debe recibir el El nombre del mensaje mensaje cantidad sqrt cadNombre size
  29. 29. Mensajesun segundo tipo de mensaje son los que contienen expresionescon palabras reservadas. Pueden tener argumentos, tantos comopartes tenga la palabra reservada. El selector de un mensajecon palabra reservada consta de una o más palabras reservadas,cada una de las cuales precede a un argumento. Una parte de unapalabra reservada es un identificador sencillo, seguido por dospuntos indice max:limite gastosCasa gastoCantidad:540.00 porRazon:RentaAmbos ejemplos envían un mensaje de una sola palabra reservada,aunque el selector del segundo ejemplo esté escrito en dospartes, separadas por el argumento 548.00.
  30. 30. Mensajes indice max:limite gastosCasa gastoCantidad:540.00 porRazon:RentaLa primera sentencia envía el mensajemax:, al objeto índice
  31. 31. Mensajes indice max:limite gastosCasa gastoCantidad:540.00 porRazon:RentaLa primera sentencia envía el mensajemax:, al objeto índiceY la segunda sentencia envía el mensaje gastoCantidad:porRazon: al objeto gastosCasa.
  32. 32. Mensajes indice max:limite gastosCasa gastoCantidad:540.00 porRazon:RentaLa primera sentencia envía el mensajemax:, al objeto índiceY la segunda sentencia envía el mensaje gastoCantidad:porRazon: al objeto gastosCasa.En ambos casos, los dos puntos forman parte inseparable delselector del mensaje, y se mantienen, incluso, enconversaciones orales. Por ejemplo, el mensaje de la segundalínea se enuncia “gastos-casa-dospuntos-por-razón-dospuntos”.Los dos puntos indican los lugares en que hay que suministrarun argumento. Tanto el receptor como los argumentos pueden sernombres de variables, constantes u otras expresiones.
  33. 33. MensajesLos mensajes binarios se comportan igual que los mensajes conpalabra reservada de un solo argumento. El selector de unmensaje binario es siempre uno o dos caracteres de unconjuntos de caracteres especiales designados al efecto. Losiguiente son ejemplos de expresiones con mensajes binarios:3+4total-1total<=maxPor último, se utiliza el operador de asignación paraalmacenar valores en las variables:suma:=3+4x:=theta sinComo las expresiones que contienen mensajes pueden estarfuertemente anidadas dentro de otras, se ofrecen reglas deprioridad, y se pueden utilizar los paréntesis para invalidarlas reglas de prioridad cuando sea necesario.
  34. 34. BloquesSmalltalk es un entorno interactivo, así que las expresiones,normalmente se evalúan de inmediato. Es posible almacenarexpresiones para su posterior ejecución, encerrándolas entrecorchetes. Esto crea una interesante estructura llamadabloque. Un bloque es un objeto (una instancia de la claseBlock) que representa una secuencia de instrucciones cuyaejecución debe retrasarse hasta el momento en que el bloquereciba el mensaje value. La mayoría de las estructuras decontrol de Smalltalk están realizadas como mensajes a objetosque admiten bloques como argumentos. Por ejemplo:indice<=limite ifTrue:[total:=total+(lista at:indice)]La expresión indice<=limite es un mensaje binario que enviamosal objeto indice, y que es una instancia de alguna clase denúmero.
  35. 35. Bloquesindice<=limite ifTrue:[total:=total+(lista at:indice)]El número crea una nueva instancia de la clase Boolean, y lalínea siguiente envía a esta variable lógica el mensajeifTrue: con una instancia de la clase Block como argumento.La variable lógica evalúa el bloque enviándole el mensajevalue si el estado de la variable lógica es TRUE.
  36. 36. Bloquesindice<=limite ifTrue:[total:=total+(lista at:indice)]La expresión indice<=limite es un mensaje binario que enviamosal objeto indice, y que es una instancia de alguna clase denúmero. ¿Eres menor que limite? indice<=limite indice es un Numero
  37. 37. Bloquesindice<=limite ifTrue:[total:=total+(lista at:indice)]El número crea una nueva instancia de la clase Boolean, y lalínea siguiente envía a esta variable lógica el mensajeifTrue: con una instancia de la clase Block como argumento.La variable lógica evalúa el bloque enviándole el mensajevalue si el estado de la variable lógica es TRUE. ¿Eres menor que limite? indice<=limite indice es un Numero es un Boolean ifTrue:
  38. 38. Bloquesindice<=limite ifTrue:[total:=total+(lista at:indice)]El número crea una nueva instancia de la clase Boolean, y lalínea siguiente envía a esta variable lógica el mensajeifTrue: con una instancia de la clase Block como argumento.La variable lógica evalúa el bloque enviándole el mensajevalue si el estado de la variable lógica es TRUE. ¿Eres menor que limite? indice<=limite indice es un Numero es un Boolean total:=total+(lista at:indice) ifTrue:
  39. 39. BloquesLos bloques tienen un aspecto engañosamente sencillo. Ocultaen el interior de la breve frase, una secuencia deinstrucciones cuya ejecución debe retrasarse, se encuentranalgunas posibilidades muy potentes. Por ejemplo, aunque unbloque se parece a una sentencia compuesta de C o a una parejaBEGIN...END de Pascal, y aunque se utilicen frecuentemente deesa manera, los bloques comparten pocas de las limitacionesque imponen estos lenguajes sobre el tiempo que puederetrasarse la ejecución.En la mayoría de los lenguajes, la ejecución no puederetrasarse más allá de la duración del entorno, unarestricción que se deriva de la suposición oculta consistenteen que el estado de ejecución de todo bloque de código estácontenido en una sencilla pila de hardware, que siempre creceo disminuye por un extremo.
  40. 40. BloquesLos bloques de Smalltalk-80 no poseen esta restricción, porquelas zonas de pila son objetos, y se reservan y liberan contoda la generalidad que se ofrece para cualquier otro tipo deobjeto. En particular, los bloques se reservan en el heap, yson eliminados por la colecta de basura, no cuando concluye elentorno que los creó.Cualquier bloque junto con el entorno en que fuera creadooriginalmente (su contexto) puede ser retenidoindefinidamente, y puede ser ejecutado mucho después de queretorne el mensaje que lo creó. Por ejemplo, lo que sigueproporciona a unConjunto instrucciones acerca de lo que tienenque hacer si falla la eliminación de unElemento; por ejemplo,porque el conjunto no contiene ese elemento:unConjunto remove:unElemento ifFail:[...]
  41. 41. BloquesunConjunto remove:unElemento ifFail:[...]Este bloque será ejecutado por unConjunto, y no por el quehizo la llamada, pero, sin embargo, tendrá acceso completo alcontexto del método que hiciera la llamada, incluyendo susvariables locales y sus argumentos. Al bloque se le da unareferencia del contexto del que hace la llamada cuando se creael bloque, y este contexto persiste mientras exista algunareferencia a él en alguna parte del sistema.Por ejemplo, está permitido almacenar referencias de bloquesen objetos de larga duración, como los menús, que sobrevivenal procedimiento que los ha creado.
  42. 42. BloquesEsta extraordinaria posibilidad se deriva directamente de ladecisión de no hacer excepciones a la regla consistente en quetodo debe beneficiarse de toda la potencia que el sistemaproporciona para cualquier objeto, incluyendo las entidades debajo nivel que la mayoría de los lenguajes gestiona de formaespecial, como las zonas de pila. Los beneficios soncuantiosos, porque este único concepto, el bloque, saca dellenguaje un cierto número de temas difíciles, y los pone adisposición de los usuarios. El precio también esconsiderable, porque incluso las operaciones más utilizadas,como la mensajería, no pueden beneficiarse del uso de rápidaspilas secuenciales especializadas, y además soportan el pesodel tratamiento de la recolección de basura.
  43. 43. El entorno de programaciónEl lenguaje de programación,las herramientascomplementarias (editores detexto, enlazadores,depuradores) y el sistemaoperativo en sí, son un todointegrado y fuertementeacoplado, y son corresidentesen un mismo espacio virtualde direcciones.
  44. 44. El entorno de programaciónEste entorno hace hincapié en la creatividad personal. Estoresulta especialmente evidente en su filosofía, que es hacerposible el acceso a todo el sistema, incluso a cosas que lamayoría de los programadores no osaría cambiar, como elsistema operativo, o la representación de los números de puntoflotante. Ninguna de esas cosas está protegida.
  45. 45. El entorno de programaciónTodo se puede modificar de manera igualmente sencilla;incluyendo aquellos cambios que no sean congruentes con elresto del sistema y puedan hacerlo caer, o cambios quepudieran hacer que el trabajo subsiguiente no fuera compatiblecon el que se esté desarrollando en sistemas vecinos. Demanera que hay que tener mucho cuidado para no tener seriosproblemas con el sistema.
  46. 46. El entorno de programaciónLa confusión que puede causar la piratería sin orden niconcierto era evidente para los diseñadores de Smalltalk-80, yle obligó a pensar creativamente acerca de las herramientasnecesarias para gestionar el cambio. El resultado fue unentorno maravillosamente diseñado, para enfrentarse al cambiode una forma cómoda y disciplinada. Los usuarios de Smalltalk-80 trabajan en pantallas de alta resolución, utilizando unaherramienta llamada browser.
  47. 47. El entorno de programaciónEl browser es como un editor de textos, porque puede mostrarel código fuente para leerlo o editarlo. También la formafundamental de utilizar el compilador, modificando por tantoel sistema en su lugar.El browser ofrece también una vía para que los miembros delequipo se comuniquen en lo que se refiere a su software. Elentorno personal de cada programador se construye integrandoperiódicamente el trabajo de todo el equipo. La personaresponsable de integrar el trabajo del equipo utiliza unaherramienta similar al browser. Va comprobando la congruenciade cada cambio, e identifica a los objetos sospechosos paraque se les preste especial atención. Esto produce una nuevaversión del sistema base, que se distribuirá a todos losmiembros del equipo.
  48. 48. El entorno de programaciónCada una de las nuevas versiones incluye todo el código fuentedel sistema, incluyendo los comentarios, de tal modo queintegración/publicación va dando a conocer periódicamente eltrabajo de cada individuo al resto del grupo. Los miembros delgrupo pueden utilizar el browser para conocer lascontribuciones de los demás, y el browser admite estasbúsquedas con ayudas que ofrecen referencias cruzadas.Esto equivale a un medio electrónico de publicar y estudiar eltipo de información que la mayoría de los programadoresgestiona de forma menos eficiente empleando el papel.
  49. 49. Está claro que Smalltalk es la solución, pero, ¿cuál es el problema?Desde un principio, el objetivo de los creadores de Smalltalkera la investigación. La utilidad de cualquier productoresultante, como el propio Smalltalk, era puramentesecundaria. En este aspecto tuvieron éxito porque los frutosde su trabajo han tenido una amplia difusión. Pero, ¿qué pasacon Smalltalk en sí? ¿Tiene su lugar más allá del entorno dela investigación junto a los lenguajes convencionales deprogramación como C, o incluso al lado de robustos dinosaurioscomo COBOL o FORTRAN?La aplicación evidente es la construcción de prototipos desistemas, que después volverán a codificarse en lenguajesconvencionales, y parece que a esto se reduce la mayor partede su utilización en la actualidad.
  50. 50. Está claro que Smalltalk es la solución, pero, ¿cuál es el problema?Estas gigantescas bases de datos existen porque los ejecutivosnecesitan una información precisa y actualizada, sobre la cualbasarán sus decisiones. Pero se quejan por los retrasos eincomodidades implícitos al acceder a los datos, separadoscomo están de ellos por varias capas de personal dedicado aprocesamiento de datos.
  51. 51. Está claro que Smalltalk es la solución, pero, ¿cuál es el problema?Smalltalk podría muy bien tener un papel, incluso en ese mundode traje y corbata. Un programador de Smalltalk podríadesarrollar clases que encapsulen el conocimiento necesariopara extraer datos del entorno, y estas clases se utilizaríanpara permitir que otros programadores menos experimentadosatendiesen directamente al ejecutivo.
  52. 52. Está claro que Smalltalk es la solución, pero, ¿cuál es el problema?Smalltalk podría muy bien tener un papel, incluso en ese mundode traje y corbata. Un programador de Smalltalk podríadesarrollar clases que encapsulen el conocimiento necesariopara extraer datos del entorno, y estas clases se utilizaríanpara permitir que otros programadores menos experimentadosatendiesen directamente al ejecutivo.
  53. 53. Está claro que Smalltalk es la solución, pero, ¿cuál es el problema?Smalltalk podría muy bien tener un papel, incluso en ese mundode traje y corbata. Un programador de Smalltalk podríadesarrollar clases que encapsulen el conocimiento necesariopara extraer datos del entorno, y estas clases se utilizaríanpara permitir que otros programadores menos experimentadosatendiesen directamente al ejecutivo.
  54. 54. Está claro que Smalltalk es la solución, pero, ¿cuál es el problema?Smalltalk podría muy bien tener un papel, incluso en ese mundode traje y corbata. Un programador de Smalltalk podríadesarrollar clases que encapsulen el conocimiento necesariopara extraer datos del entorno, y estas clases se utilizaríanpara permitir que otros programadores menos experimentadosatendiesen directamente al ejecutivo. El entorno de lacomputadora personal podría funcionar como acoplamiento deimpedancias entre las necesidades del ejecutivo y los límitesde la computación organizada.
  55. 55. Ada
  56. 56. AdaLa publicidad que rodea a este lenguaje es tan amplia queapenas es necesario mencionarlo de nuevo. Realizado por elMinisterio de Defensa de los Estados Unidos, Ada fue diseñadocomo sustituto de tecnología punta para la variada colecciónde lenguajes que se utilizaban para construir sistemasempotrados de computadoras. A lo largo de todo el proyecto setuvo la intención explícita de que Ada fuese obligatorio paratrabajar con sistemas empotrados, en los cuales la computadoraes un componente relativamente pequeño que forma parte de unsistema mucho más grande, y que implica superficies de controlde aeronaves, sistemas de armamento, ayudas para lanavegación, sistemas de comunicaciones y cosas parecidas.
  57. 57. AdaEl aspecto exacto en que lossistemas empotrados sediferencían de los normales, noha estado nunca claro. Esprobable que esta ambigüedad seaintencionada, porque elobjetivo, desde el principio, hasido el de reducir el número dedialectos de lenguajes.Ada siempre ha estado rodeado decontroversias. Sus diseñadoreshan sido acusados de padecer delsíndrome del cajón de sastre,porque Ada es un lenguajeamplio, lleno de posibilidades,y extremadamente complicado.
  58. 58. AdaHay características complejas y posiblemente mal comprendidas,como la multitarea y la gestión de excepciones, que se definencomo parte del lenguaje; es probable que estas capacidadesdebieran haber sido omitidas en el lenguaje, ofreciéndose enapéndices separables como bibliotecas de subrutinas o paquetesde Ada. Los argumentos de ambos lados son comprensibles, dadoel énfasis del Departamento de defensa para evitar unaproloferación de dialectos posiblemente incompatibles.
  59. 59. Características orientadas a objetos de AdaDe cualquier forma, aquí no vamos a hablar de Ada comolenguaje, sino del sentido en que se dice que Ada, y otroslenguajes como Ada, admiten una programación orientada aobjetos.Hasta ahora debería ser claro que el objetivo de Ada no esacrecentar el reino de las cosas que se pueden hacer con lascomputadoras, sino el de ofrecer una sola forma de hacer lascosas que hacen muchos lenguajes incompatibles pero parecidos.
  60. 60. Características orientadas a objetos de AdaLa complejidad de las capacidades de Ada suele obscurecer elhecho de que Ada es, básicamente, 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 lagestión de excepciones que se han pegado al lenguaje basemediante bibliotecas de subrutinas.Ada es un lenguaje con comprobación estricta de tipos quelleva a cabo todo el enlazado en el momento de la compilación.Los tipos de todos los datos se declaran explícitamente; es elcompilador el que toma todas las decisiones en el momento dela compilación, y no los objetos durante la ejecución.
  61. 61. Características orientadas a objetos de AdaSegún las definiciones de Smalltalk, un objeto son unos datosprivados más el grupo de procedimientos que pueden acceder aesos datos. Esta encapsulación de datos y procedimientos selogra haciendo que los mensajes sean la única forma en que sepuede acceder a cualquier objeto. Dado que la ligadura seretrasa hasta el momento en que se envía el mensaje, no haydificultad para trabajar con colecciones débilmente acopladasque contengan objetos de distintos tipos. Procedimiento Procedimiento Procedimiento objeto Datos privados
  62. 62. Características orientadas a objetos de AdaSegún las definiciones de Smalltalk, un objeto son unos datosprivados más el grupo de procedimientos que pueden acceder aesos datos. Esta encapsulación de datos y procedimientos selogra haciendo que los mensajes sean la única forma en que sepuede acceder a cualquier objeto. Dado que la ligadura seretrasa hasta el momento en que se envía el mensaje, no haydificultad para trabajar con colecciones débilmente acopladasque contengan objetos de distintos tipos. Procedimiento Procedimiento Procedimiento Datos privados
  63. 63. Características orientadas a objetos de AdaSegún las definiciones de Smalltalk, un objeto son unos datosprivados más el grupo de procedimientos que pueden acceder aesos datos. Esta encapsulación de datos y procedimientos selogra haciendo que los mensajes sean la única forma en que sepuede acceder a cualquier objeto. Dado que la ligadura seretrasa hasta el momento en que se envía el mensaje, no haydificultad para trabajar con colecciones débilmente acopladasque contengan objetos de distintos tipos. Mensaje Procedimiento Procedimiento Procedimiento Datos privados
  64. 64. Características orientadas a objetos de AdaEn Ada, el mecanismo de encapsulación lo proporciona en sutotalidad el compilador, y ha desaparecido antes de laejecución. Esta es la ventaja de Ada, y también suinconveniente. Es una ventaja para el propósito para el que sediseñó Ada: eliminar la necesidad de múltiples lenguajesconvencionales para construir aplicaciones convencionales.Es mejor para construir colecciones fuertemente acopladas enlas cuales el tipo de cada componente pueda ser conocido yespecificado por adelantado, porque el compilador puedecomprobar que cada uno de los componentes sea el tipoespecificado.
  65. 65. Características orientadas a objetos de AdaEs un inconveniente en problemas en que el cambio no se puedagestionar editando el fuente y el recompilando. El factorclave para la distinción es el grado hasta el cual se puedetratar el cambio al principio de diseño, antes de que elprograma llegue al compilador.En Ada, el proveedor de una nueva capacidad la ofrecedefiniendo un paquete. El paquete contiene algunas partes queserán propiedad privada del proveedor, y otras que deben serpublicadas para el código del consumidor. Típicamente, elcódigo y la distribución precisa de los campos dentro delobjeto son privados, pero esto no es necesario en modo alguno.El proveedor decide lo que ha de publicarse, y lo que no.
  66. 66. PaquetesPor ejemplo, el proveedor de un paquete de gráficos podríadefinir un nuevo tipo de datos, vector, para manejarcoordenadas 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;
  67. 67. PaquetesEste paquete define una interfaz entre el consumidor y elproveedor pero no la realización 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 iniciación end PaqueteGeometriaBiDimensional
  68. 68. PaquetesEl consumidor indica al compilador que utilice un paquetemediante una sentencia with, dando lugar a que las partespúblicas del paquete sean conocidas para el código delconsumidor. El consumidor puede utilizar los servicios delpaquete en cualquier forma que haya previsto el proveedor. Porejemplo: with PaqueteGeometriaBiDimensional; origen, extension, esquina: vector; esquina = origen + extension; a + b a - b Datos privados PaqueteGeometriaBiDimensional
  69. 69. PaquetesObsérvese que Ada permite la sobrecarga de operadores, de talmodo que los operadores de nombres convencionales, como +,pueden recibir significados especiales para tipos de datosdefinidos por el usuario. El compilador es capaz de apreciarque: esquina = origen + extension;No debe tratarse de la misma forma que: suma = 2 + 2Porque el compilador sabe que origen y extension son del tipovector, y que un paquete ha invalidado el significadoconvencional del símbolo + para este tipo. Aunque las ventajasde la sobrecarga de operadores son evidentes para los símbolosmatemáticos convencionales como +, también es aplicable anombres de funciones convencionales, como sqrt,calcCorreccionGisroscopio, o aceleraAMaximoImpulso
  70. 70. DiscusiónLa aproximación de Ada a la programación orientada a objetos,tiene sus ventajas y sus inconvenientes, y no es correctoafirmar con ademán categórico y aire ofendido que “Esto es unaventaja” o que “Eso es un inconveniente”, sin dejar claro“¿con respecto a qué alternativa?” o bien ¿Es el contexto dequé problema?”Una de las decisiones claves de Ada es que la semántica de unprograma dado debería quedar determinada estáticamente. Adalleva la ligadura estática más allá que los lenguajes deprogramación anteriores, como C. Pero para aquellos programasque no puedan ser especificados estáticamente, Ada sólo ofrecetipos de acceso. Los tipos de acceso son únicamente punteros;son trucos que permiten al programador realizar coleccionesdébilmente acopladas de la misma manera que se haría en C,realizando manualmente la ligadura dinámica con ligadura porparte del consumidor.
  71. 71. DiscusiónUna de las causas de desilución de Ada son las limitaciones ala hora de definir tipos nuevos reutilizando algún tipoexistente. Aunque Ada proporciona tipos y subtipos derivados,esto no es sino una forma de restringir tipos generales, comoel integer, para limitarlos a un cierto intervalo o propósitoespecífico, como diaDeLaSemana. Ninguno de ellos posibilita laextensión de un tipo preexistente añadiendo cambios yoperaciones adicionales.Esto es un problema serio, porque elimina la posibilidad,incluso, de tener tipos de herencia limitados, y obliga aldesarrollador de cada tipo nuevo a duplicar un código que estácontenido en tipos más generales.
  72. 72. DiscusiónEl concepto de paquete (package) es una verdadera mejora conrespecto a los lenguajes convencionales como C. Pero suimportancia es difícil de cuantificar. Su mejora es comparablea la mejora consistente en pasar de un lenguaje noestructurado como FORTRAN a un lenguaje estructurdo como C,pero de importancia menor que la obtenida al pasar dellenguaje ensamblador a FORTRAN. Otras partes de la filosofíade Ada, sobre todo la insistencia en que haya un únicolenguaje para todos los desarrollos de software, tienen mayorprobabilidad de proporcionar ventajas realmentesignificativas.
  73. 73. DiscusiónLa ligadura estática obtiene su eficiencia acoplando lasdecisiones realizadas por el proveedor con las del consumidoren el momento de la compilación, exactamente igual que sucedeen los lenguajes convencionales que el DOD había estadoutilizando por décadas. Ada ofrece posibilidades nuevas parahacer disminuir este acoplamiento, pero, ciertamente ofrece unexcelente apoyo para gestionar el acoplamiento fuerte de unamanera cómoda. Y quizás esto sea para bien, porque Ada ya esdemasiado grande y demasiadocomplicado para su propio bien.¿por qué vamos a lamentar el hecho de que sólo admita laligadura estática, cuando se puede añadir la ligaduradinámica?
  74. 74. C++C++ es una mejora evolutiva del lenguaje C desarrollado enBell Laboratories. C++ es particularmente interesante en vistadel énfasis que haremos en C objetivo, porque hace contrastarlo que se puede lograr redefiniendo el lenguaje deprogramación en sí, frente a lo que se consigue añadiendocapacidades orientadas a objetos a un lenguaje base inmutable.C-Objetivo añade objetos ligados dinámicamente, clases yherencia al lenguaje C estándar. Esto añade justamente lascapacidades sificientes para admitir la encapsulación y laherencia, lo suficiente para que se pueda aplicar latecnología de software integrado a problemas de construcciónde sistemas y nopara mejorar el lenguaje de programación ensí.
  75. 75. Laboratorios BellC++ fue evolucionando en los Laboratorios Bell para alcanzarlos objetivos siguientes:1.- Mantener la extremadamente alta eficiencia ytransportabilidad por las cuales es famoso C2.- Mantener la compatibilidad entre C++ y C3.- Corregir algunos fallos de largo tiempo soportados,concretamente la lasitud de C a efectos del tratamiento detipos. C ha sido criticado desde hace mucho tiempo por sudébil comprobación de tipos, incluso dentro de una funcióndada, y por no hacer comprobación de tipos entre funciones, nisiquiera dentro del mismo archivo.4.- Actualizar a C para adecuarlo a los modernos principios deocultación de información.
  76. 76. Laboratorios BellC++ es casi un superconjunto puro del lenguaje C, con unaspocas incompatibilidades de escasa importancia. Entre susmejoras se cuenta la posibilidad de definir nuevos tipos dedatos (clases), operaciones con esos tipos (operadores yfunciones), y un amplio conjunto de maneras de controlar lasoperaciones que se hagan con esos tipos, entre las que seincluye la sobrecarga de operadores, los constructores y losdestructores.
  77. 77. ClasesLos nuevos tipos de datos se definen mediante la sentenciaclass, que es una generalización de la vieja sentencia struct,a la cual sustituye, pero que se mantiene a efectos decompatibilidad hacia atrás (struct se trata como un casoespecial de class, en el cual todos los miembros sonpúblicos). Por ejemplo, lo que sigue es equivalente a ladeclaración de una struct: class ostream { public: FILE *file; int nextchar; char buff[128]; };
  78. 78. ClasesLos nuevos tipos de datos se definen mediante la sentencia class, que esuna generalización de la vieja sentencia struct, a la cual sustituye, peroque se mantiene a efectos de compatibilidad hacia atrás (struct se tratacomo un caso especial de class, en el cual todos los miembros sonpúblicos). Por ejemplo, lo que sigue es equivalente a la declaración de unastruct: class ostream { public: FILE *file; int nextchar; char buff[128]; };Así se declara una clase nueva, ostream, con tres miembros: file, nextchary buf. La palabra reservada public: hace que estos nombres sean públicos, yque pueda acceder a ellos cualquier programa que contenga esta declaración.La única diferencia entre una class y una struct es que los miembros de lastruct son públicos por omisión, mientras que los miembros de la class sonprivados (private) a no ser que se indique explícitamente lo contrario.Aunque las structs solo podían tener a datos como miembros, las clasestambién pueden tener miembros de procedimientos, o funciones. Estasfunciones pueden ser de dos tipos: funciones friend y funciones member.
  79. 79. Funciones friendLas funciones friend son funciones convencionales de C. No tienen relaciónespecial con la clase, salvo que se les permite hacer referencia acualquier miembro que sea un dato y haya sido declarado private (poraparecer 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*);}
  80. 80. Funciones friendLas funciones friend son funciones convencionales de C. No tienen relaciónespecial con la clase, salvo que se les permite hacer referencia acualquier miembro que sea un dato y haya sido declarado private (poraparecer delante del marcador public:)class fecha { Esto hace que la realizaciónint dia, mes, agno; de las fechas sea privadapublic: (private), y que sólo se friend void fijaFecha(fecha*, int, int, int); pueda acceder a ellas friend void siguienteFecha(fecha*); mediante las cuatro funciones friend void siguienteHoy(); friend. friend void imprimirFecha(fecha*);}
  81. 81. Funciones friendLas funciones friend son funciones convencionales de C. No tienen relaciónespecial con la clase, salvo que se les permite hacer referencia acualquier miembro que sea un dato y haya sido declarado private (poraparecer delante del marcador public:)class fecha { Esto hace que la realizaciónint dia, mes, agno; de las fechas sea privadapublic: (private), y que sólo se friend void fijaFecha(fecha*, int, int, int); pueda acceder a ellas friend void siguienteFecha(fecha*); mediante las cuatro funciones friend void siguienteHoy(); friend. friend void imprimirFecha(fecha*);} Los tipos de los argumentos que admiten estas funciones también se declaran; estos tipos no sólo son comprobados por el compilador, sino que, además, se utilizan también para guiar las decisiones de enlazado.
  82. 82. Funciones friend Las funciones friend son funciones convencionales de C. No tienen relación 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 { Esto hace que la realización int dia, mes, agno; de las fechas sea privada public: (private), y que sólo se friend void fijaFecha(fecha*, int, int, int); pueda acceder a ellas friend void siguienteFecha(fecha*); mediante las cuatro funciones friend void siguienteHoy(); friend. friend void imprimirFecha(fecha*); } Los tipos de los argumentos que admiten estas funciones también se declaran; estos tipos no sólo son comprobados por el compilador, sino que, además, se utilizan también para guiar las decisiones de enlazado.Esta clase podría utilizarse, por tanto, como sigue: fecha miCumpleagnos, hoy; fijarFecha(&miCumpleagnos,30,12,1980); fijarFecha(&hoy,12,11,2004); imprimirFecha(&hoy); siguienteFecha(&hoy);
  83. 83. Funciones miembroAunque las funciones friend son funciones convencionales, lasfunciones miembro, sin embargo, están asociadas a la clase enel mismo sentido en lo que lo están los miembros que sondatos. Las funciones miembro son las que dan a C++ su aromaorientado a objetos. Sirven para realizar operaciones en unainstancia de alguna clase, mientras que las funciones friendno son más que funciones estándar de C a las que se lespermite hacer referencia a los nombres de los miembrosprivados. Las funciones miembro se declaran mencionando sudeclaración dentro de la declaración de la clase, junto con ladeclaración 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(); };
  84. 84. Funciones miembroLas funciones miembro se invocan mediante una sintaxis querefleja su papel de operaciones realizadas por un ciertoobjeto, y sigue la pauta de la forma en que se accede a losmiembros de una estructura: miCumpleagnos.imprimir(); hoy.siguiente();Para definir una función miembro, es preciso proporcionartambién el nombre de su clase: void fecha.siguiente(){ dia=dia + 1; if(mes== FEB && dia > 28) ... }Tales funciones reciben siempre un argumento implícito, this,que identifica al objeto que lleva a cabo la acción. En esteejemplo, el campo dia se piede identificar tanto en la formadia como en la forma this->dia.
  85. 85. Clases derivadasC++ también proporciona la posibilidad de definir subclasescon herencia, describiendo la forma en que la clase nueva(derivada) difiere de alguna superclase anterior (a la quehereda). Esta técnica es distinta en ciertos detalles de laempleada por Objective-C, y pierde generalidad y espacio enmemoria para ganar una mayor comprobación de tipos en elmomento de la compilación y una cierta cantidad de eficiencia.Por ejemplo, una clase de formas se podría definir como sigue: class forma{ vector centro; int color; int color; forma *siguiente; public: void mover(vector); /* cambiar la posicion de una forma */ vector donde(); /* responde con la posicion de la forma*/ virtual void rotar(int); /* rotar una forma */ virtual void dibujar(); /* mostrar una forma */ }
  86. 86. Clases derivadasLas funciones virtuales son funciones que no se podríanrealizar sin conocer la forma concreta de que se trate, y quedeben 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 debenenlazarse dinámicamente, y fuerza al compilador a añadir unmiembro invisible a cada instancia que indica explícitamentesu clase en el momento de la ejecución.
  87. 87. Clases derivadasAhora es posible definir subclases que obedezcan a unprotocolo común, de tal modo que se puede dbujar cualquierforma mediante: cualquierInstancia.dibujar();C++ permite derivar una clase nueva a partir de múltiplessuperclases (herencia múltiple). Los conflictos que surgencomo consecuencia de que la clase nueva herede miembros conlos mismos nombres de más de una clase se resuelven según uncierto conjunto de reglas del lenguaje.
  88. 88. Clases derivadasPor ejemplo, para derivar una clase llamada plato a partir delas clases círculo y recipiente, que ya existían conanterioridad, se crearía la declaración siguiente: class plato: public circulo, recipiente { /* ... */ };
  89. 89. Clases derivadasAdemás de mostrar que plato debe realizarse copiando lasvariables y métodos de círculo y recipiente, esta sentenciaindica también el tipo de acceso a los miembros de las clasesbase circulo y recipiente que tendrá un usuario de plato. Lapalabra reservada public que va delante de circulo indica quelos usuarios de plato comparten los mismos privilegios deacceso a los miembros protegidos y públicos de circulo queposee el propio plato.Por otra parte, la ausencia de una palabra reservada delantede recipiente lo identifica como privado. El acceso a losmiembros públicos y protegidos de circulo está limitadoúnicamente a plato; los usuarios de plato no pueden acceder enabsoluto a los miembros de recipiente. Este mecanismo permiteal diseñador de clases restringir de manera selectiva elacceso a sus superclases.
  90. 90. Datos protegidosCuando se deriva una clase nueva de una clase vieja, surge laduda: ¿a qué debería tener acceso la clase derivada? en C++ elacceso de la clase derivada a los miembros de la clase base esgestionado por el creador de la clase base. El creador puedeespecificar que los miembros de la clase sean de accesopúblico, privado o protegido. Supongamos que variamos ladefinición de la clase forma para que quede como sigue: class forma{ Las funciones miembro y las funciones private: forma *siguiente; friend de las clases derivadas podrían protected: acceder a los miembros “centro” y vector centro; “color” de la clase forma, puesto que se int color; ha indicado que son protected. Sin public: .... embargo, no podrían acceder al miembro } “siguiente”, puesto que ha sido marcado como private
  91. 91. Sobrecarga de operadoresLAs capacidades descritas para las funciones son aplicablestambién a otros operadores. Anteponiendo al símbolo de unoperador la palabra reservada operator, es posible ofrecer unanueva realización de ese operador. Por ejemplo, el último parde declaraciones que se ven a continuación definen la forma enque 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 */ ... }
  92. 92. Sobrecarga de operadoresLas capacidades descritas para las funciones son aplicablestambién a otros operadores. Anteponiendo al símbolo de unoperador la palabra reservada operator, es posible ofrecer unanueva realización de ese operador. Por ejemplo, el último parde declaraciones que se ven a continuación definen la forma enque 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 */ ... }
  93. 93. Sobrecarga de operadoresEsto define vectores en unplano bidimensional de coordenadasenteras. Las tres funciones llamadas vector son constructores.Los constructores definen la forma en que se construyen losnuevos vectores cuando aparecen en sentencias de iniciación ytambién cuando se construyen muevos vectores en la pila alllamar a una función.Dado que la declaración también contiene la realización deestos operadores, la realización se expandirá en línea, y nose incurrirá en un gasto adicional de tiempo para dar valoresiniciales a los vectores. Esa característica de expansión enlínea se aplica a cualquier tipo de operador que pueda serdeclarado en una clase, no sólo en los constructores
  94. 94. Sobrecarga de operadoresLos tres operadores restantes definen la forma en que funcionael operador + cuando los dos lados son vectores, o cuando ellado derecho es un entero. La declaración podría extenderse,para construir una clase de vectores completa, con productospor escalares, productos vectoriales, productos tensoriales,etc. vector este = (1), norte = (0, 1); vector norEste = norte + este;
  95. 95. Administración de la memoriaEn C++ es posible asignar dinámicamente nuevos objetos en elmontículo (heap), y después se accede a ellos mediante susdirecciones. También se pueden reservar objetos estáticamente,y se accede a ellos por su nombre, como en el caso de los tresvectores que se han mostrado en el ejemplo anterior. En elmomento de la ejecución, el espacio correspondiente a losobjetos conocidos por sus nombres debe recibir valoresiniciales siempre que su nombre quede dentro del ámbito. Porejemplo:
  96. 96. Administración de la memoria1.- Los objetos que se pasen como argumentos a funciones, ylos objetos que se declares como variables locales (auto),deben recibir valores iniciales cuando se llamen a esafunción.2.- Los objetos que porporcionan las funciones deben recibirvalores iniciales cuando retorne la función.3.- Los objetos que estén en la pila de llamada a la función(los argumentos y variables locales) deben ser destruidoscuando la función retorne y se retraiga la pila.
  97. 97. Administración de la memoriaC++ ofrece un camino para que el desarrollador de la claseespecifique lo que debería suceder en estos casos. El ejemplodel vector muestra cómo se especifican los operadores deconstrucción. La inversa es una operación destructor, cuyonombre será el nombre de la clase precedido por el símbolo“~”. Por ejemplo, una clase de cadenas podría 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); }
  98. 98. Administración de la memoriaEsto garantiza que todas las instancias de cadenas que secreen cuando las cadenas se pasen a funciones, y cuando éstaslas proporcionen, sean una sola copia. Pero no se gestionanlas referencias múltiples que se crean cuando se asignaexplícitamente una cadena a otra en una sentencia deasignación. Esto se puede lograr invalidando el operador deasignación.
  99. 99. Administración de la memoriaObsérvese que, aun cuando esto no sustituye a la recolecciónautomática de basura, puede, a veces, disminuir la necesidadde llevarla a cabo. La recolección automática de basura siguesiendo deseable cuando se hacen múltiples referencias a losobjetos a través de punteros. Copiando los objetos cada vezque se necesitan, no existen las referencias múltiples, a síque es posible liberar los objetos siempre que quedan fuera denuestro ámbito. Por ejemplo, la realización de cadenas que semuestra aquí implica la reserva e iniciación de una copia cadavez que se pasa la cadena a una función, y el tiempo adicionalrequerido podría fácilmente resultar inadmisible. C++ noofrece recolección automática de basura.
  100. 100. Compilación por separadoCada compilación se realiza de modo aislado, C++ no recuerdalas compilaciones anteriores, así que todas las declaracionesacerca de clases externas deben ser incorporadas manualmente acada archivo fuente. C++ no ofrece más ayuda para hacer estoque la habitual sentencia #include. No impone restricciones ala forma en que se haga esto, ni realiza ninguna comprobaciónpara asegurarse de que la información sea congruente entrecompilaciones.
  101. 101. Compilación por separadoEn la práctica, para cada clase se preparan dos archivos. Elprimero es un archivo de declaraciones, que debe ser incluídoen todos los archivos que utilicen esa clase. El segundo es unarchivo de definiciones, que se compila y se archiva, y que elenlazador combina para formar la imagen ejecutable. Todo elcontenido del primer archivo es, por tanto, informaciónpública, mientras que el segundo es verdaderamente privadosólo cuando se compila en forma binaria. Esto hace que lasdistinciones entre público y privado que ofrece la declaraciónde las clases induzcan a la confusión. El archivo se puedeleer desde fuera del lenguaje; se puede, incluso, copiar ymodificar para hacer que el código de un consumidor puedaacceder a la información privada.
  102. 102. ¿Qué significa “orientado a objetos”?Hemos empezado este capítulo preguntándonos ¿Qué significaorientado a objetos? Incluso después de estudiar varioslenguajes diferentes que son orientados a objetos, quedatodavía una incertidumbre considerable acerca de lo quesignifica este calificativo.Nadie se siente confuso cuando se emplean adjetivos como“pequeño” o “rápido”. Pero con respecto al desarrollo de SW esmuy fácil perder la orientación. Por tanto para entender elsignificado de cualquier calificativo, y especialmente“orientado a objetos”, debemos poner especialmente cuidadopara especificar el contexto en que se aplica.
  103. 103. ¿Qué significa “orientado a objetos”?Hemos empezado este capítulo preguntándonos ¿Qué significaorientado a objetos? Incluso después de estudiar varioslenguajes diferentes que son orientados a objetos, quedatodavía una incertidumbre considerable acerca de lo quesignifica este calificativo.Nadie se siente confuso cuando se emplean adjetivos como“pequeño” o “rápido”. Pero con respecto al desarrollo de SW esmuy fácil perder la orientación. Por tanto para entender elsignificado de cualquier calificativo, y especialmente“orientado a objetos”, debemos poner especialmente cuidadopara especificar el contexto en que se aplica.
  104. 104. Contacto:acaceres@computacion.cs.cinvestav.mx abdiel@mazatlan.udo.mx Abdiel E. Cáceres GonzálezCentro de Investigación y de Estudios Avanzados - IPN México D.F., México. 2004

×