POO en JAVA

Curso de Java-WebObjects 10 mayo 2002 Introducción a Java y WebObjects Introducción a la Arquitectura Programación y T

Views 122 Downloads 0 File size 2MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Curso de Java-WebObjects 10 mayo 2002

Introducción a Java y WebObjects

Introducción a la Arquitectura Programación y Tecnología de Java y WebObjects

10 mayo 2002 © 2001. Ignire Software Empresarial, S.L.L.

PAGINA - 1

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

PAGINA - 2

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Introducción a Java-WebObjects INDICE Conceptos de Programación Orientada a Objetos (POO). 1. Introducción a la POO 1.1. Conceptos de POO 1.2. Qué es un Objeto 1.3. Qué es un Mensaje 1.4. Qué es una Clase 1.5. Qué es la Herencia 1.6. Qué es un Interface 1.7. Java e Internet 1.8. Análisis y diseño 1.9. Resumen 1.10. Cuestiones y Ejercicios 2. Introducción a Java 2.1. Variables 2.1.1. Tipo de datos 2.1.2. Nombre de variables 2.1.3. Alcance de las variables 2.1.4. Inicialización 2.1.5. Variables finales 2.1.6. Resumen 2.1.7. Cuestiones y Ejercicios 2.2. Operadores 2.2.1. Aritméticos 2.2.2. Relaciones y condicionales 2.2.3. Lógicos y de desplazamientos 2.2.4. De Asignación 2.2.5. Otros operadores 2.2.6. Resumen 2.2.7. Cuestiones y Ejercicios 2.3. Expresiones, estamentos y bloques 2.3.1. Cuestiones y Ejercicios PAGINA - 3

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

2.4. Estamentos de control de flujo 2.4.1. while, do-while 2.4.2. for 2.4.3. if/else 2.4.4. switch 2.4.5. Manejo de excepciones 2.4.6. Resumen 2.4.7. Cuestiones y Ejercicios 3. Introducción a los Objetos 3.1. Ciclo de vida de un Objeto 3.1.1. Creando un Objeto 3.1.2. Usando un Objeto 3.1.3. Eliminando y liberando un Objeto 3.1.4. Resumen 3.1.5. Cuestiones y Ejercicios 3.2. Caracteres y Cadenas de texto 3.2.1. La clase String 3.2.2. Creando Cadenas y bufers de cadenas (StringBuffers) 3.2.3. Métodos de acceso 3.2.3.1. Más métodos de acceso 3.2.4. Modificando StringBuffers 3.2.5. Convirtiendo Objetos en Cadenas 3.2.6. Convirtiendo Cadenas en Números 3.2.7. Cadenas y el compilador de Java 3.2.8. Resumen 3.2.9. Cuestiones y Ejercicios 3.3. Números 3.3.1. Formateando números 3.3.2. Usando formatos predefinidos 3.3.3. Creando formatos 3.3.4. Resumen 3.3.5. Cuestiones y Ejercicios 3.4. Arrays 3.4.1. Creando y usando arrays 3.4.2. Arrays de Objetos 3.4.3. Arrays de Arrays

PAGINA - 4

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

3.4.4. Copiando Arrays 3.4.5. Cuestiones y Ejercicios 4. Clases y Herencia 4.1. Creando Clases 4.1.1. EL cuerpo de una Clase 4.1.2. Constructores de una Clase 4.1.3. Declarando variables miembro 4.1.4. Implementando Métodos 4.1.4.1. Detalles de una declaración de un Método 4.1.4.2. Pasando información a un Método 4.1.4.3. El cuerpo de un Método 4.1.5. Controlando el acceso a los Métodos de una Clase 4.1.6. Entendiendo las Instancias y las Clases miembro 4.1.7. Resumen 4.1.8. Cuestiones y Ejercicios 4.2. Manejando la Herencia 4.2.1. Entendiendo la Herencia 4.2.1.1. Sobrecargar Métodos 4.2.2. Objetos descendientes 4.2.3. Escribiendo Clases Finales y métodos 4.2.4. Escribiendo Clases abstractas y métodos 4.2.5. Resumen 4.2.6. Cuestiones y Ejercicios 4.3. Implementando Clases anidadas 4.3.1. Clases internas 4.3.2. Resumen 4.3.3. Cuestiones y Ejercicios 5. Interfaces y Paquetes 5.1. Creando Interfaces 5.1.1. Qué es un Interface 5.1.2. Definiendo un Interface 5.1.3. Impementando un Interface 5.1.4. Usando un Interface como un Tipo 5.1.5. Resumen 5.1.6. Cuestiones y Ejercicios 5.2. Creando y usando Paquetes (Packages) PAGINA - 5

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

5.2.1. Creando un Package 5.2.2. Usando miembros de un Package 5.2.3. Manejando (gestionando) Fuentes y Ficheros Class 5.2.4. Resumen 5.2.5. Cuestiones y Ejercicios 6. Clases de utilidades 7. Excepciones 8. Entrada/Salida en Java 9. Multihilos (Threads) 10. Applets 11. AWT y Swing 12. Programación de red 13. JDBC. Programación para Bases de Datos 14. La máquina virtual de Java (JVM)

PAGINA - 6

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

APENDICES i. Convenciones 1. Introducción 2. Nombre de Archivos 3. Sufijos 4. Nombre común de los archivos 5. Organización de Archivos 6. Archivos fuente de Java a. Comentarios b. Paquetes y estamentos de importación c. Declaración de Clases e Interfaces 7. Identación 8. Longitud de la línea 9. Líneas envolventes 10. Comentarios 11. Implementación de Formatos a. Comentarios en bloques b. Comentarios de línea simple c. Comentarios grandes d. Comentarios de final de línea 12. Comentarios para la documentación 13. Declaraciones 14. Posición 15. Inicialización 16. Declaración de Clases e Interfaces 17. Estamentos 18. Estamentos simples 19. Estamentos compuestos 20. Estamentos de retorno 21. Estamentos if, if-else, if-else-if 22. Estamento for 23. Estamento while 24. Estamento do-while 25. Estamento switch 26. Estamento try-catch ii. Espacios en blanco

PAGINA - 7

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

iii. iv.

v.

vi.

vii.

1. Líneas en blanco 2. Espacios en blanco Convención de nombres Prácticas de programación 1. Proporcionar acceso a instancias y variables de Clase 2. Referenciar métodos y variables de una Clase 3. Constantes 4. Asignación de variables 5. Miscelánea 6. Paréntesis 7. Valores de retorno 8. Expresiones antes de la “?” en el Operador Condicional 9. Comentarios especiales 10. Ejemplos 11. Ejemplos de archivos fuente en Java Introducción a WebObjects 1. Qué es WebObjects 2. Enterprise Objects 3. Aplicaciones basadas en HTML 4. Aplicaciones “Direct to Web” 5. Aplicaciones Cliente Java 6. Aplicaciones “Direct to Java” 7. Seleccionando una aproximación Java para programadores de WebObjects 1. Usando Objetos 2. Creando Clases 3. Conceptos avanzados 4. Manejo de excepciones 5. Recursos adicionales WebObjects y EOF 1. Introducción a WebObjects: El primer proyecto 2. Desarrollando contenidos dinámicos 3. Manejando entradas de Usuario 4. Comunicación entre Componentes 5. Uso de la Sesión para gestionar estados 6. Introducción a las Bases de Datos 7. Introducción a EOF

PAGINA - 8

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

8. Trabajando con Contextos Editables (Editing Context) 9. Usando Objetos personalizados 10. Trabajando con Relaciones viii. Referencias ix. Recursos y Información complementaria x. Prácticas 1. Práctica 1 2. Práctica 2 3. Práctica 3 4. Práctica 4 5. Práctica 5 6. Práctica 6 7. Práctica 7 8. Práctica 8 9. Práctica 9 10. Práctica 10 11. Práctica 11 12. Práctica 12 13. Práctica 13 14. Práctica 14 15. Práctica 15 16. Práctica 16 17. Práctica 17 18. Práctica 18 19. Práctica 19 20. Práctica 20 21. Ejercicio completo 22. Práctica con WebObjects 1 23. Práctica con WebObjects 2 24. Práctica con WebObjects 3 25. Práctica con WebObjects 4 26. Práctica con WebObjects 5 27. Práctica con WebObjects 6 28. Práctica con WebObjects 7 29. Práctica con WebObjects 8 30. Práctica con WebObjects 9 31. Práctica con WebObjects 10

PAGINA - 9

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

32. Ejercicio completo xi. Solución de los ejercicios.

PAGINA - 10

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Revisión 0.95 10/5/02 18:09:50

PAGINA - 11

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

PAGINA - 12

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

PARTE 1. Java Introducción Desde 1990, la empresa Sun Microsystem disponía de un proyecto donde se estaba desarrollando un lenguaje para entornos de pequeño tamaño y destinados al gran público. Este proyecto se vio estimulado por la proliferación de microprocesadores en los aparatos de consumo y por la voluntad de disponer de un prototipo de máquina susceptible de controlarlos. A principios de 1992, el lenguaje desarrollado para llevar a cabo esta idea se llamaba OAK tras haberse descartado C++ porque se consideraba demasiado pesado para la implementación y falto de robustez. El año 1993 marca el inicio de la revolución de Internet mediante la utilización de la Web. Esta herramienta, desarrollada por el CERN estandarizó el acceso a la información, la navegación por hipertexto y la facilidad de desarrollo mediante el lenguaje HTML, lo que hizo crecer el número de usuarios de la red de forma exponencial. Como el proyecto para el que fue diseñado OAK no tuvo el éxito esperado, Sun rápidamente se dirigió al nuevo medio de comunicación. Las cualidades de transportabilidad y el tamaño compacto del lenguaje OAK lo hacía idóneo para su uso en Internet, conocido por su baja velocidad de acceso y la heterogeneidad de las máquinas conectadas. El proceso de adaptación duro cerca de dos años. En 1995, OAK pasa a llamarse Java. Java agrupa todas las características de un verdaderos lenguaje profesional pues es simple, flexible y potente. Sus características principales son: Orientado a objetos Con estas características Java está muy bien adaptado para soportar las múltiples exigencias de los desarrollos informáticos: § § § §

Un mejor control de la complejidad. Una reutilización más fácil. Un mantenimiento, correctivo y evolutivo, mejorado. Un carácter esencialmente distribuido y de red de las aplicaciones.

PAGINA - 13

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Multihilo Con esta característica se pueden desarrollar muy fácilmente flujos de ejecución concurrentes en una misma aplicación, lo que proporciona nuevas posibilidades a los usuarios, pero también permite que Java funcione en máquinas multiprocesador, sin grandes problemas de adaptación. Control estricto y estático del tipos El control estático de tipos consiste en la verificación de la concordancia de los tipos, utilizado en la compilación, no en la ejecución. Este control es muy estricto en Java y con él se reduce al mínimo el riesgo de errores en la ejecución. Enlace dinámico En Java no existe una fase de enlazado (link), proceso que interviene tras la compilación, y tiene por objetivo enlazar las bibliotecas externas con el programa. La verificación de la existencia de las bibliotecas se hace en el momento de la compilación, y la carga del código de estas bibliotecas se hace en la ejecución. La consecuencia de este proceso es la reducción del tamaño del ejecutable y optimiza la carga de las bibliotecas. Gestión de memoria Java dispone, de modo estándar, de un mecanismo de recogida de basura (garbage collector) que se ocupa de limpiar la memoria de todos los objetos que ya no se utilizan. Otro aspecto importante es la desaparición de la noción de puntero. Esto responde a un doble problema: § §

La utilización de punteros es fuente de numerosos errores en los programas. La utilización de punteros no permite desarrollar programas seguros.

Simplificado La sintaxis de Java es simple. La ausencia de punteros, la recogida de basura, la obligación de estructurar el código fuente, la ausencia de variables globales y la obligación de tratarlo todo bajo la forma de objetos confiere al lenguaje una gran legibilidad. Seguro El lenguaje aumenta la seguridad en la implementación del código ya que, el código no debe sobrepasar las protecciones impuestas por el lenguaje; no debe intentar construir punteros de acceso directo a memoria; no debe utilizar un objeto en lugar de otro, ni tampoco debe provocar desbordamiento de pila. Pero también realiza verificaciones de alto nivel como, por ejemplo, la verificación de que los programas no accedan a recursos prohibidos.

PAGINA - 14

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

PAGINA - 15

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Conceptos de Programación Orientada a Objetos Introducción La programación procedimental clásica (usada en COBOL, Fortran o C, entre otros) tiene dos componentes fundamentales: datos y código. Los datos representan aquello que el usuario necesita manipular mientras que el código lleva a cabo la manipulación. Para poder gestionar y mantener adecuadamente ambos conceptos, la programación procedimental los aglutina en procedimientos. Pero muchos de estos datos son globales y cualquier procedimiento puede modificar estas variables globales en cualquier lugar directamente. Con este enfoque una interacción en red entre procedimientos y datos aumenta considerablemente la complejidad cuando la aplicación crece e inevitablemente esta interacción hace muy difícil el mantenimiento (código-spaghetti). Un simple cambio en una estructura de datos puede afectar a muchos procedimientos y a muchas líneas de código. Además la programación procedimenal hace difícil la corrección de errores y la depuración cuando una función hace cambios inadvertidamente en datos que necesita otra función. Los objetos cambian esta perspectiva. Originalmente, la programación orientada a objetos se pensó para un sistema de simulación donde se quería modelar el comportamiento de objetos reales. Cada objetos del mundo real se representa con un objeto en el programa en ejecución. Como en el mundo real, los objetos en programación tienen una serie de características y un comportamiento. Estos objetos deben funcionar como auténticas cajas negras, es decir, no se sabe nada sobre su implementación pero sí sobre su comportamiento desde el exterior. A esta abstracción entre la visión externa e interna de un objeto se le denomina encapsulamiento. Un objeto de programación debe integrar en una única estructura las propiedades o atributos (datos, variables), el comportamiento (especificación de funciones) y el mecanismo (la implementación de las funciones). Un objeto es un unidad de programación autocontenida que combina datos y procedimientos que operan con esos datos. Los datos se denominan variables de instancia y los procedimientos o funciones que hacen uso de esos datos se conocen como métodos. Al igual que los objetos del mundo real, los objetos en un programa tienen características y comportamientos identificativos. Con frecuencia los objetos de programación están modelados desde el mundo real. Por ejemplo, un objeto botón que incluye datos y código que muestra una

PAGINA - 16

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

apariencia en la pantalla el cual simula un botón real y responde de manera familiar a las acciones de un usuario.

La encapsulación Compartir código y datos se denomina encapsulación de datos. Habitualmente, un objeto se observa como una caja negra de manera que ninguna parte del programa puede acceder directamente a las variables. En efecto, un programa sólo puede acceder a los datos de un objeto por medio de sus métodos. Los métodos envuelven los datos, no sólo como variables de instancia del objeto, sino también con métodos de acceso. Cada objeto encapsula un área particular de la funcionalidad que necesita el programa. Los métodos proporcionan el interfaz a esta funcionalidad. Usando esta modularidad, los programas orientados a objetos pueden dividirse en distintos objetos para datos específicos y para tareas específicas.

Los mensajes Para invocar a un método de un objeto se le debe enviar un mensaje. Un mensaje hace una petición a un objeto para que realice una funcionalidad específica o para devolver un valor. El valor devuelto debe recibirlo una variable del mismo tipo. La Programación Orientada a Objetos es algo más que otra forma de organizar datos y funciones. POO permite a los programadores de aplicaciones construir soluciones a programas complejos usando un modelo para que se asemeja –mucho mas que un programa tradicional- al mundo que lo rodea. El modelo de POO para estructurar programas simplifica la resolución de problemas clarificando roles y relaciones. Se puede pensar en un programa OO como en una red de objetos que definen correctamente comportamientos y características, objetos que interactúan mediante mensajes. Diferentes objetos en la red juegan diferentes roles. Algunos corresponden a elementos gráficos en el interfaz del usuario. En una aplicación cada ventana se representa como un objeto por separado, al igual que cada botón, ítem de un menú, o una cadena de texto. Las aplicaciones también asignan objetos que funcionalmente no tienen representación en el interface. Estos objetos pueden hacer tareas computacionales muy específicas como manejo de pantallas o transferencia de datos mediante la interacción entre objetos del interfaz del usuario y objetos computacionales. Una vez que se han definido los objetos, crear un programa es hacer una amalgama de esos objetos: crear la conexión de los objetos que se usarán para comunicarse unos con otros.

PAGINA - 17

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Polimorfismo y enlaces dinámicos El propósito de un mensaje es invocar un método, un mensaje no es lo mismo que una llamada a una función. Un objeto conoce sólo los métodos que están definidos para él y para los que los heredan. No se puede confundir estos métodos con otros métodos de objetos aún cuando los métodos tengan idénticos nombres. Cada objeto es una unidad autocontenida con su nombre de campo (un nombre de campo es un área del programa que está unívocamente reconocido por el nombre). Si dos clases distintas de objetos tienen el mismo nombre, entonces estos mensajes pueden recibir el mismo mensaje, pero cada uno de ellos puede responder de manera diferente. La habilidad de que un mensaje cause diferentes comportamientos recibe el nombre de polimorfismo. El polimorfismo ayuda a la flexibilidad en la programación a la vez que simplifica el mantenimiento de la codificación. Por ejemplo, muchos objetos del interface del usuario responden al mensaje display; se puede enviar un mensaje display a cualquiera de estos objetos y cada uno de ellos responderá dibujándose a sí mismo. Tal vez las ligaduras dinámicas sea la característica más útil del polimorfismo. El polimorfismo y las ligaduras dinámicas dependen de otras dos características: tipos dinámicos e introspección.

Clases Muchos de los objetos en red son de categorías diferentes y otros son de la misma. Los objetos que son de la misma categoría pertenecen a la misma clase. Una clase es un entidad de programación que crea instancias de sí misma –objetos. Una clase define una estructura, un interfaz de instancias y un comportamiento determinado. Cuando se necesita una nueva categoría de objetos se define una nueva clase. Se pueden definir muchos objetos a partir de una clase. En este sentido, se puede decir que una clase es una fábrica particular de objetos. En términos de líneas de código, un programa orientado a objetos consiste, principalmente, en hacer definición de clases. Los objetos se crean y trabajan dinámicamente en la ejecución de un programa usando la definición de la clase. No obstante, una clase es algo más que una fábrica de objetos. Una clase puede tener asignados métodos y recibir mensajes al igual que lo hace un objeto. De hecho, su nombre es clases Object. La herencia es uno de los aspectos mas potentes de la programación orientada a objetos. Las instancias de una clase heredan los atributos y comportamientos desde la clase ascendente. La clase que hereda los atributos y el comportamiento se llama subclase y la clase de la cual hereda

PAGINA - 18

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

se llama superclase. Cualquier método y atributo definidos –o heredados- en una superclase los hereda una subclase. Una subclase también puede alterar el comportamiento de la superclase sobrecargando el método heredado, reimplementándolo para describir el comportamiento deseado diferente a la implementación del método de la superclase. Las ventajas de la herencia permiten hacer un paquete que agrupa a un conjunto de clases en una simple definición de clase. Este empaquetado de funcionalidades simplifica la organización del código que se necesita para escribir una aplicación y facilita la definición de objetos. Cada subclase necesita implementar sólo aquellas partes en las que se diferencian de la superclase. Es más, el diseño jerarquizado asume una codificación más robusta. ya que la nueva codificación en una subclase está únicamente limitados a la implementación de un comportamiento, el cual es más fácil de depurar y testar. Cualquier clase puede ser clase de una nueva subclase. La herencia permite fácilmente la extensibiliad.

PAGINA - 19

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Modelo de objeto

Modelo en Red de objetos

PAGINA - 20

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

PAGINA - 21

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Definiciones y conceptos El enfoque Orientado a Objetos se caracteriza por una estructuración de los programas en clases de objetos. Este enfoque aporta una importante contribución, por su potencia de abstracción, de generalización y de interacción, y por la simplificación de los procesos de adaptación y de extensión de clases. El enfoque a objetos consiste en definir las características de los objetos que constituyen una aplicación para posteriormente implementar su interacción por medio del intercambio de mensajes.

Objetos Un objeto comporta un aspecto estático que representa su estado por medio de variables de instancias, llamadas también atributos. Este aspecto estático queda oculto por un aspecto dinámico que representa el comportamiento del objeto. Este último corresponde a las operaciones que se pueden realizar sobre un objeto. Los objetos similares están agrupados en un tipo abstracto. La Programación Orientada a Objetos (POO) se distingue de la programación clásica pos su visión de los objetos como entidades activas que ejecutan comportamientos en respuesta a mensajes. En lugar de estructurar por un lado las variables que contienen los datos y por otro las funciones que constituyen los procesos, se organizan los programas en entidades activas compuestas por estructuras de datos encapsuladas por medio de funciones. Un mismo nombre puede utilizarse para realizar acciones similares sobre objetos distintos, lo que permite construir un lenguaje abstracto que da lugar a actuar de manera similar con objetos a priori distintos. El receptor del mensaje determina el tratamiento adecuado; es decir, no es necesario efectuar bifurcaciones que permitan escoger la función según el tipo del objeto. De manera más general, en la POO un programa es un conjunto de objetos que intercambian mensajes que provocan operaciones, los cuales hacen evolucionar sus estados internos y devuelven parámetros. Intuitivamente, un objeto es una abstracción de un elemento del mundo real que posee información y se comporta según un conjunto de operaciones que se pueden aplicar. El enfoque orientado a objetos proporciona ventajas decisivas como la modelización de los objetos de la aplicación, la modularidad, la reutilización y la extendibilidad del código. Según el enfoque clásico un programa de aplicación consta de tres partes: la primera, contiene la estructura de datos (definición de los tipos y variables); la segunda, es la parte de las

PAGINA - 22

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

operaciones (definiciones de los procedimientos) y, la tercera, es la parte que llama o los procedimientos. Este enfoque se adapta bien al desarrollo de aplicaciones complejas y poco evolutivas. Pero llega a su límite cuando las estructuras de datos o los procedimientos deben ser compartidos por diferentes programas. Es este caso, una modificación de una estructura de datos debe repercutir en todos los programas que la manipulan. La POO responde a este problema por medio de la encapsulación de los datos y las operaciones que los manipula en el interior de objetos. La encapsulación aplica el principio de abstracción: un objeto sólo es accesible por sus operaciones visibles (su interfaz externa), y su implementación (las estructuras de datos asociadas) queda oculta. Una ventaja inmediata es que diferentes programas de aplicación pueden compartir los mismos objetos sin tener que conocerse. Los conceptos de objeto y clase son interdependientes. Un objeto pertenece a una clase (es una instancia de una clase) y una clase agrupa lógicamente los objetos de la misma estructura y con el mismo comportamiento. correspondiéndose con el modelo Entidad-Relación, un objeto sería un tupla y una clase una entidad. Un objeto es una abstracción de datos (TAD) que puede esquematizarse del siguiente modo: objeto = identidad + comportamiento + estado

La identidad de un objeto viene dada por su identificador OID, único e invariable, que permite referenciar al objeto independientemente de otros objetos. El comportamiento viene definido por un conjunto de operaciones, los métodos, aplicables al objeto y definidos en su clase de pertenencia. El estado es un valor que puede ser simple, o estructurado. Qué es un Objeto: Los objetos son la clave para entender la tecnología Orientada a Objetos. En el mundo real los objetos comparten dos características: Todos tienen un estado y un comportamiento. Por ejemplo, un perro tiene un estado (nombre, color, raza) y un comportamiento (ladrando, buscando, caminando). Una bicicleta tiene un estado (numero de engranajes, cadencia del pedal) y un comportamiento (acelerando, frenando, cambiando de marchas). Los objetos de software modelan objetos del mundo real para representar su estado y su comportamiento. Un objeto de software mantiene su estado en una o mas variables –una PAGINA - 23

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

variable es un ítem de datos identificado por un nombre. Un objeto de software implementa un comportamiento mediante métodos –un método es una función (subrutina) asociada a un objeto. Un objeto es un paquete de software compuesto de variables y métodos relacionados.

Se pueden representar objetos del mundo real usando objetos de software pero también se pueden modelar objetos abstractos, por ejemplo, un evento (suceso / acontecimiento) es un objeto común que se usa en las ventanas del sistema del interfaces de usuario para representar la acción de un usuario presionando el botón del ratón o la tecla del teclado. Todo lo que el objeto de software conoce (estado) y puede hacer (comportamiento) se expresa mediante las variables y los métodos que están dentro del propio objeto. Estas variables se conocen formalmente como variables de instancia –ya que contienen el estado para un objeto en particular y en terminología orientada a objetos, un objeto de software. Los métodos se conocen formalmente como métodos de instancia. Los diagramas de objetos muestran sus variables en el centro, o núcleo, del propio objeto. Los métodos envuelven y esconden el núcleo de otros objetos. El empaquetado de las variables del objetos mediante la protección de sus métodos se llama encapsulación –este gráfico conceptual donde las variables en el núcleo del objeto, protegido por una membrana de métodos es un diseño ideal. Por razones prácticas, a veces, un objeto puede exponer algunas de sus variables y esconder algunos de sus métodos. En Java, un objeto puede especificar uno de cuatro niveles de acceso (de paquete, público, protegido y privado) por cada variable o método. El nivel de acceso determina qué objetos y clases pueden acceder a las variables y métodos de un objeto en particular. La encapsulación proporciona dos importantes ventajas en el desarrollo de software: §

Modularidad: El código fuente para cada objeto puede ser escrito y mantenido independientemente del código fuente de otros objetos. También, un objeto puede ser pasado a otro sistema fácilmente.

§

Ocultación de la información: Un objeto tiene una interfaz pública que otros objetos usan para comunicarse entre ellos. El objeto puede tener información privada y métodos que pueden cambiarse en cualquier momento sin afectar para nada a otros

PAGINA - 24

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

objetos que dependan de él. Objeto: abstracción de una ocurrencia de entidad caracterizada por un identificador único e invariable, una clase de pertenencia y un estado representado por un valor simple o estructurado. La identidad y la igualdad de dos objetos son nociones distintas. Dos objetos o1 y o2 son idénticos si sus OID son iguales. Dos objetos o1 y o2 son iguales si sus estados son iguales. Dadas dos referencias a objetos o1 y o2, se dice que o1 = o2 si o1 y o2 son idénticos; se dice que o1 =(1)o2 si los estados de o1 y o2 (caracterizados por valores y referencias a objetos) son iguales. En caso que o1 y o2 contengan referencias a otros objetos, es posible recorrer estas referencias y comprobar la igualdad de los estados referenciados. De manera más general, se dirá que o1 = (n)o2 si los valores y los estados obtenidos después de n recorridos por las referencias son iguales. La igualdad profunda de dos referencias de notación o1 = (*)o2 se verifica si los valores obtenidos después de recorrer todas las referencias son iguales. Se cumple que: o1 = (i)o2 => o1 = (i + 1)o2

Asociaciones Gracias a la identidad de objeto, las asociaciones pueden representarse directamente, en particular la asociación 1-1 y la 1-N. La asociación 1-1 se obtiene por medio de un atributo del objeto cuyo valor es una referencia de objeto. La asociación 1-N e obtiene por medio de un atributo del objeto cuyo valor es un conjunto de referencias de objetos. Expresión de camino: secuencia de la forma o.A1, A2, …, An, donde o es un identificador de objeto y cada Ai es un atributo del objeto designado por o.A1, …, Ai-1. En general, el atributo An es un valor atómico. A fin de respetar la encapsulación, hay que acceder a los atributos por medio de llamadas a los métodos correspondientes (expresión de método).

PAGINA - 25

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Clases Qué es una Clase: En el mundo real existen muchos objetos de la misma categoría y en el software orientado a objetos también es posible tener muchos objetos de la misma categoría compartiendo características comunes. Una clase es un anteproyecto o un prototipo, que define las variables y los métodos comunes a todos los objetos de una determinada categoría.

Las clases pueden declarar y proporcionar implementaciones para métodos instanciados. Cuando se crea una instancia de una clase el sistema asigna memoria para alojar al objeto y a todas sus variables de instancia. Cada instancia obtiene una copia de todas las variables de instancia definidas en la clase. Además de las variables de instancia, las clases definen variables de clase –una variable de clase contiene información que comparten todas las instancias de la clase. Si un objeto cambia este tipo de variable todos los objetos del mismo tipo la cambian. Una clase también define métodos de clase –Se puede invocar un método de una clase directamente desde la clase considerando que se debe invocar métodos de instancia en una instancia particular. Se puede observar que, a primera vista, los objetos y las clases parecen similares. De hecho, la diferencia entre objetos y clases puede ser fuente de confusión. En el mundo real es obvio que las clases no son los descriptores de los objetos: Un prototipo de una bicicleta no es una bicicleta. Sin embargo, es algo más difícil diferenciar clases y objetos en software. Esto se debe a que los objetos de software son modelos electrónicos de objetos del mundo real o abstracciones conceptuales. Pero también es debido a que el término objeto se usa a veces para referirse tanto a clases como a instancias. Una clase fabrica la estructura y el comportamiento comunes a una colección de objetos (sus instancias) Clase: atributos + métodos + instanciación

Una clase es un tipo abstracto de datos que define el tipo y el comportamiento comunes a objetos (las instancias de la clase). Los atributos, llamados variables de instancia, tienen un nombre y un tipo que es, o bien un tipo de base (simple o compuesto), o bien una clase.

PAGINA - 26

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Los métodos son las operaciones aplicables a un objeto de la clase. Un método devuelve o modifica la totalidad o parte del estado de un objeto (sin impacto en el OID). La clase proporciona un mecanismo de instanciación que permite crear un objeto, es decir, asignar un nuevo OID y una estructura de objeto correspondiente. Se llaman propiedades de la clase a sus atributos y a sus métodos. Clase: abstracción de un tipo de dato caracterizado por propiedades (atributos y métodos) comunes a los objetos, que permiten crear objetos que posean dichas propiedades. Los métodos pueden considerarse funciones cuya firma define el tipo de los argumentos de entrada y de salida. El principio de encapsulación requiere que los atributos de la clase no sean accesibles desde el exterior más que por medio de la llamada al método de lectura correspondiente. La encapsulación permite aislar los programas de una clase de las modificaciones de la implementación de los atributos. Se accede a los objetos mediante llamadas a los procedimientos (métodos), como en un lenguaje de programación clásico.

PAGINA - 27

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Mensajes Qué es un Mensaje: Un objeto aislado, generalmente, no sirve para nada. En cambio, un objeto aparece habitualmente como componente de un programa o una aplicación que contiene muchos otros objetos. Mediante la interacción entre objetos, un programa alcanzará una mayor funcionalidad y un comportamiento cada vez mas complejo. Los objetos de software interactúan y se comunican unos con otros enviándose mensajes. Cuando un objeto A necesita una funcionalidad del objeto B, el objeto A envía un mensaje al objeto B. A veces, el receptor del mensaje necesita más información para conocer exactamente qué tiene que hacer. Esta información se pasa en el mensaje a través de parámetros. Los mensajes aportan las siguientes ventajas: §

El comportamiento de un objeto se expresa mediante sus métodos, por lo tanto, los mensajes soportan el paso de todas las posibles interacciones entre objetos.

§

Los objetos no necesitan del mismo proceso en la misma máquina para enviar o recibir mensajes entre ellos.

Envío de mensajes a los objetos: protocolo de comunicación entre objetos por invocación de método público representado por el identificador del objeto receptor, el nombre del método y los argumentos. Grafos de clases: Una clase realiza varias funciones; por un lado es un tipo abstracto de datos y por otro es un generador de instancias. Como tipos abstractos, las clases pueden ser organizadas según la relación de generalización o relación es-un. Se habla entonces de un grafo de clases o grafo de herencia. La generalización es útil para clasificar los objetos en función de sus puntos comunes (generales)y de su especifidad por un mismo grafo. Generalización: función que hace corresponder a una clase su origen, llamada subclase, una clase más general, llamada superclase. La función inversa de la generalización, que hace corresponder a una clase todas las subclases de las cuales es superclase, se llama especialización. Esta función permite añadir propiedades específicas (especializadas) a una subclase. La representación gráfica hace corresponder, por medio de un arco orientado, la subclase situada bajo la superclase. La generalización se

PAGINA - 28

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

representa de modo natural por un O lógico. Esta relación es transitiva: una superclase de una clase es también superclase de sus subclases. Instanciación: relación entre objetos y su clase de pertenencia que ha permitido crearlo. Metaclase: clase generadora de clases (sus instancias), que agrupa en particular los métodos aplicables a las clases y las estructuras de datos comunes a todas ellas. Los métodos aplicables a las clases son la creación y la destrucción de instancias, y las operaciones de evolución de las estructuras como añadir o suprimir un atributo. Para evitar una regresión al infinito en el momento de crear la metaclase, ésta se admite como su propia instancia. Entonces es fácil generalizar las nociones de clase y metaclase mediante una clase única, la clase Object, que se convierte entonces en la raíz del grafo de clases. La clase Object proporciona las propiedades comunes a todos los objetos (OID, método new, etc.) Las asociaciones y conexiones entre objetos pueden ser descritas a nivel de clases por grafos de agregación, que es el equivalente de la asociación (1-1, 1-N) entre entidades. Agregación: relación entre dos clases que especifica qué objetos de una clase (clase anfitrión) son los componentes de la otra clase (clase fuente). El grafo de agregación, o grafo de composición, permite capturar estas relaciones y así modelizar directamente los objetos complejos.

PAGINA - 29

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Colecciones Cuando un atributo es multivalor, su valor es una colección. Colección: construcción que permite agrupar a un conjunto o conjuntos de elementos en una estructura manipulada por medio de métodos característicos, obtenida a menudo mediante la utilización de una clase parametrizada. Es posible especializar una clase genérica llamada Colección en subclases tales como conjunto, matriz o lista, de modo que éstas tengan cada una sus propios métodos de acceso a sus elementos.

Interfaces Qué es un Interface: Un interface es un mecanismo o un sistema que conecta entidades para interactuar. De acuerdo con esta definición, un control remoto es un interface entre el usuario y el televisor. En java un interface es un dispositivo que conecta objetos entre sí. Un interface es probablemente algo análogo a un protocolo (un convenio en un comportamiento). De hecho, otros lenguajes de programación denominan protocolos a la funcionalidad de las interfaces. Se usa una interface para definir un protocolo de comportamiento que puede ser implementado por cualquier clase en cualquier clase de la jerarquía. Las interfaces son útiles en lo siguiente: § § §

Capturar similitudes entre clases inconexas sin artificialidad forzando una relación entre clases. Declarar métodos que una o más clases esperan implementar. Revelar la interface de programación de un objeto sin revelar la clase.

PAGINA - 30

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

La herencia Qué es la Herencia: En general, los objetos se definen en términos de clases. Se puede conocer perfectamente un objeto conociendo su clase. Los sistemas orientados a objetos toman esto para permitir clases que definan otras clases. La clase Object es la clase raíz de la jerarquía de clases, y cada clase desciende de ella directa o indirectamente. Una variable de tipo Object puede ser soportada como una referencia de cualquier objeto, como una instancia de una clase o un array. Object proporciona los mecanismos necesarios para que todos los objetos funcionen en la Máquina Virtual Java (JVM). La herencia es la aportación especial de los lenguajes orientados a objetos. Puede ser simple o múltiple y permite soportar el polimorfismo de los métodos. La organización de las clases según la relación de generalización permite agrupar las propiedades comunes en el interior de una misma clase sin duplicación en otras clases. El mecanismo de herencia permite a una subclase heredar propiedades de todas sus superclases. Herencia: mecanismo de paso de propiedades de una clase a una subclase. Si la clase C2 hereda de la clase C1 (C2 subclase de C1), C2 posee todas las propiedades de C1. Desde el punto de vista de instancia, una instancia de C2 es también una instancia de C1. Una instancia de C2 puede poseer también propiedades propias que reflejen su especifidad. La herencia permite definir una relación de orden entre las clases que será útil para verificar la seguridad del tipado de los métodos. Esta relación de orden indica por medio de C2≤C1 el hecho de que C2 posee propiedades de C1. Es decir: C2 es subclase de C1 o C2 = C1. La clase de pertenencia de un objeto es el que permite crearlo. Esta clase puede ser una subclase; el objeto hereda las propiedades de sus superclases.

PAGINA - 31

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

La herencia ofrece las siguientes ventajas: §

Las subclases proporcionan comportamientos especializados desde los elementos comunes básicos proporcionados por la superclase. Mediante la herencia se puede reutilizar el código en la superclase muchas veces.

§

Se pueden implementar superclases denominadas clases abstractas –esto se define como comportamiento genérico. Las superclases abstractas definen y pueden parcialmente implementar el comportamiento, pero muchas de las clases están sin definir y sin implementar.

PAGINA - 32

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Polimorfismo. A menudo es necesario redefinir un método heredado para poder darle una implementación diferente (un código diferente), que tenga en cuenta propiedades locales (no heredadas) de la clase. El método redefinido tiene la misma firma que el método heredado, con la única diferencia del argumento que designa el objeto sobre el que se aplica el método. La redefinición del método m sería la siguiente: m(C1, T1, …, Tn):Tr

En el método m de C2 debe considerarse como: m(C2, T1, …, Tn):Tr

donde Ti es un tipo de atributo. Se dice que el método m de C2 sobrecarga el método m de C1. Sobrecarga: redefinición de un método heredado con un código distinto. Un método redefinido, por lo tanto, puede tomar diferentes formas o implementaciones, en función del tipo de objeto al que se aplica. El método es llamado en este caso polimórfico. Polimorfismo: facultad de un método de poder aplicarse a objetos de clases diferentes. Gracias al enlace dinámico, el sistema puede realizar la selección del cuerpo del método en tiempo de ejecución en función de la clase a la que pertenece el objeto receptor. El mecanismo de enlace dinámico se activa en el momento del envío del mensaje: el tratamiento del mensaje consiste en seleccionar el código del método a ejecutar. En esencia, facilita el mantenimiento de programas. El enlace dinámico permite escoger el código correspondiente a la clase T del objeto en tiempo de ejecución, incluso aunque el objeto sea referenciado por una variable cuyo tipo sea una superclase de T. La ventaja es que toda definición ulterior del método no tiene ningún impacto en el programan en los demás programas que utilicen éste método.

PAGINA - 33

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Seguridad de tipos El tipado seguro de un programa garantiza en tiempo de compilación que no se producirán errores de tipo en tiempo de ejecución. El principio de covariación permite definir la conformidad de los tipos de las firmas de métodos como sigue. Covariación: relación entre un método y un método sobrecargado en el cual el tipo de cada argumento del método sobrecargado puede ser más especializado que el tipo correspondiente del método heredado. Dadas dos firmas: m(C1, T1, …, Tn):Tr M(C2, T1, …, Tn):T´r

los métodos m de C1 y m de C2 covarían si tenemos: C2 ≤ C1, Vi; T´i ≤ Ti y T´r ≤ Tr La ventaja de la covariación es la flexibilidad. Sin embargo puede introducir errores de tipado en la ejecución del programa. Contravariación: relación entre un método y un método sobrecargado, en el cual el tipo de cada argumento del método heredado puede ser más general que el tipo correspondiente del método sobrecargado. Dadas dos firmas: m(C1, T1, …, Tn):Tr M(C2, T1, …, Tn):T´r

los métodos m de C1 y m de C2 contravarían si tenemos: C2 ≤ C1, Vi; Ti ≤ T´i y T´r ≤ Tr la contravariación permite el tipado seguro a expensas de la flexibilidad. El problema de la flexibilidad de la contravariación resulta de la necesidad de seleccionar el método en función del tipo del objeto receptor únicamente. El método se llama monoanfitrión. Para salvar estas limitaciones, la búsqueda se orienta hacia los métodos multianfitrión, los cuales permiten la selección de métodos en función de varios argumentos asegurando la integridad del tipado.

PAGINA - 34

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Java e Internet Si Java es, de hecho, otro lenguaje de programación, la pregunta que más le interesa a la comunidad de programadores es qué aporta Java a la industria. La respuesta no es obvia desde una perspectiva tradicional, ya que Java resuelve problemas clásicos mediante aplicaciones. Lo que sí es más importante es que resuelve problemas de programación para la Red (World Wide Web). La Red (WWW o Web) La Red no es más que un sistema cliente-servidor, un término de computación algo confuso. Un sistema cliente-servidor es un sistema donde existe un repositorio de información –algún tipo de dato, alojados en una base de datos- que se pueden distribuir por demanda a personas o máquinas. Un concepto fundamental de un sistema cliente-servidor es que el repositorio de información está centralizado de tal modo que los cambios realizados en la información se propagan a todos los consumidores de información. La información en el repositorio, el software que distribuye la información y las máquinas donde residen el software y la información se denomina servidor. El software que reside en una máquina remota y que está comunicada con el servidor, realiza consultas, las procesa y las muestra se denomina cliente. El concepto básico de la tecnología cliente-servidor no es complicado. El problema aparece cuando un equipo servidor intenta servir a varios clientes a la vez. Generalmente, un gestor de base de datos está involucrado en la arquitectura, distribuyendo los datos en tablas para un uso óptimo. Además, el sistema ofrece la posibilidad de añadir o de actualizar nueva información desde el cliente al servidor. Por este motivo, se debe asegurar que los nuevos datos aportados por un sistema cliente no sobrescriban datos de otro sistema cliente, o que los datos se pierdan en el proceso de inserción o actualización en la base de datos (a éstos se les denomina procesos de transacción). Si el software del cliente cambia, se debe compilar, depurar e instalar en cada uno de los clientes, lo cual suele ser muy complicado y caro. La problemática se hace especialmente difícil cuando existen diferentes ordenadores y sistemas operativos. Por último, la siempre importante cuestión del rendimiento. Cuando un cliente hace una petición al servidor, éste debe responder en un pequeño y crucial intervalo de tiempo. Para minimizar la latencia, los programadores trabajan intensivamente para descargar al servidor de procesos, cargándolos en el cliente o poniendo otras máquinas intermedias entre el servidor y el cliente, llamadas mediadores (middlewares, usados también para mejorar el mantenimiento del sistema).

PAGINA - 35

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

La Red es realmente un gran sistema cliente-servidor, aunque es algo diferente ya que todos los servidores y los clientes coexisten a la vez en una única red. No se necesita saber ni conocer quién se conecta con quién o qué servidores interactúan con los clientes. El navegador Web es un gran adelanto: el concepto de que una pieza de información pueda ser mostrada en cualquier tipo de ordenador sin cambios. La programación en la parte cliente: Inicialmente los navegadores Web se usaban para mostrar contenido interactivo, pero inmediatamente ha aumentado la complejidad proporcionada por el servidor. El servidor produce páginas estáticas hacia el navegador del cliente, el cual simplemente la interpreta y la muestra. Los elementos básicos del lenguaje de marcas HTML son mecanismos como campos de texto, cajas de selección, listas, y menús emergentes así como botones que sólo se pueden programar para borrar de un formulario o enviar datos al servidor. Estos procesos se realizan a través de un Common Gateway Interface (CGI), alojados en el servidor. Estas acciones son habitualmente programas que están en un directorio del servidor llamado “cgi-bin”. Estos programas se pueden escribir en diferentes lenguajes. Por ejemplo Perl, un lenguaje interpretado, es una elección frecuente que está diseñado para manipular texto y que se puede instalar en cualquier sistema operativo y procesador. Muchos sitios Web está hechos estrictamente en CGI. El problema es el tiempo de respuesta. El tiempo de respuesta de un programa CGI depende de cómo envía los datos el servidor y de cómo se cargan tanto el servidor como Internet (en un caso extremo, la carga de un programa CGI tiende a ser lenta). La programación en el lado del cliente resuelve ciertos problemas. Muchos equipos que ejecutan navegadores Web son máquinas muy potentes capaces de realizar trabajos de computación muy pesados. La programación en la parte cliente permite que el navegador Web haga el mayor número de tareas posibles, dando como resultado mayor velocidad y mayor interactividad del sitio Web. Para realizar este trabajo o tareas la programación en la parte cliente usa diferentes aproximaciones: Plug-ins, lenguajes de guiones (scripts), Java, ActiveX, etc. Programación en la parte servidora: Las peticiones mas complicadas a un servidor son generalmente accesos a bases de datos que, habitualmente, intervienen transacciones. Un escenario común es la petición al servidor de búsquedas complejas en una base de datos, el cual devuelve el resultado, en formato HTML, a una página para mostrarlo en el navegador Web del cliente. De todas maneras, si el cliente maneja Java o un lenguaje de guiones, el servidor podría

PAGINA - 36

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

enviar los datos y el cliente formatearlos en el equipo, lo que sería más rápido y descargaría de trabajo al servidor. Las peticiones a la base de datos deben procesarse mediante algún tipo de código situado en el servidor. Tradicionalmente, la programación en la parte servidora se hace mediante Perl o guiones CGI, pero están apareciendo sistemas más sofisticados, los cuales incluyen servidores basados en Java, que permiten todas las funcionalidades necesarias en el servidor mediante programas escritos en Java también llamados Servlets.

PAGINA - 37

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Programación clásica frente a la orientada a objetos El paradigma orientado a objetos es una nueva y diferente manera de pensar en programación. Gracias a la industria del software durante la pasada década, se ha superado el paradigma de la POO, trayendo consigo adelantos en la productividad, la reutilización y el mantenimiento del software. Se considera la POO como la mejor elección en el desarrollo general de proyectos. En la mayoría de los lenguajes de programación, los datos se almacenan en variables, que pertenecen a un tipo específico de datos. Y muchos de esos lenguajes de programación permiten definir tipos de datos particulares, formados por varios tipos simples u otros definidos. Por ejemplo, una estructura de datos Avion es un nuevo tipo de datos construido a partir de datos simples: struct Avion { int altitud; int velocidad; flota longitud; flota latitud; }

La estructura de datos Avion es un nuevo tipo de dato a través de tipos internos de C. La propia estructura no almacena información, es solamente un esquema para la creación de una nueva variable de tipo Avion. Para declarar una variable de tipo Avion llamada boeing se podría utilizar es siguiente código: struct Avion boeing;

Y para acceder a los miembros de la estructura se podría escribir el siguiente código: boeing.altitud = 300; boeing.velocidad = 800;

En la programación no orientada a objetos, el código que accede a las variables miembro está separado y es específico de cada tipo de datos. Para modificar el valor de un miembro de una clase se podría escribir el código en forma de subrutina de la siguiente forma:

PAGINA - 38

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

void establecerVelocidad(Avion &unAvion, int unaVelocidad) { if (unaVelociad > 0) { unAvion.velocidad = unaVelocidad; } else { unAvion.velocidad = 0; } }

Ahora se podría hacer otra estructura derivada de Avion llamada AvionComercial del siguiente modo: struct AvionComercial { int pasajeros; int carga: int altitud; int velocidad; flota longitud; flota latitud; }

Para crear una variable de tipo AvionComercial se haría: struct AvionComercia otroBoeing;

Sin embargo la rutina general de asignación de velocidad no funcionaría, es decir, una llamada de la forma establecerVelocidad(otroBoeing, 600) daría un error de compilación. Por lo tanto, se tendría que duplicar el código para crear otra rutina llamada por ejemplo: establecerVelocidadComercial(AvionComercial &av; int velocidad);

Sin embargo, la duplicación del código crea problemas de mantenimiento. Si por cualquier razón se necesitase hacer cambios para diez estructuras diferentes, deberán modificarse las diez rutinas asociadas. Además de ser difícil de conseguir, puede también introducir defectos adicionales en el código.

PAGINA - 39

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

El mantenimiento es uno de los muchos problemas de las estructuras no orientadas a objetos, además de que estas estructuras son difíciles de utilizar más de una vez. Las estructuras y sus rutinas asociadas se vuelven complejas con rapidez, haciendo difícil la extracción de partes del código para su utilización en un nuevo programa. En la programación orientada a objetos, las rutinas para una estructura de datos y la propia estructura de datos se combinan (están encapsuladas) en una entidad simple llamada clase. Por ejemplo: class Avion { int altitud; int velocidad; flota longitud; flota latitud; void establecerVelocidad(int unaVelocidad) { if (unaVelociad > 0) { unAvion.velocidad = unaVelocidad; } else { unAvion.velocidad = 0; } } }

La rutina establecerVelocidad es ahora una función miembro de la clase, es decir, forma parte de la propia estructura. Al igual que la definición de la estructura, esta definición de clase es tan sólo un esquema para las variables que se crearán en el tipo de datos Avion. Los tipo de datos de la clase Avion son objetos Avion. En otras palabras, un objeto es un almacén de variables que a su vez es un elemento de una clase. Las clases definen las variables y las rutinas que son miembros de un objeto de dicha clase. A las rutinas o funciones miembro se les suele llamar métodos. Se podrá crear un objeto Avion (a este proceso se le denomina instanciación) basándose en su clase. Una variable objeto es una referencia a un objeto; la creación de una referencia a un objeto y crear el objeto propiamente dicho son dos procesos independientes.

PAGINA - 40

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Para crear una variable objeto: Avion unBoeing;

Y para crear el objeto se usa el operador new de la forma: unBoeing = new Avion();

Ahora ya se puede acceder a las variables y los métodos miembros: unBoeing.altitud = 300; unBoeing.establecerVelocidad(400);

El encapsulamiento también permite el ocultamiento de datos para prevenir accesos directos a variables internas del objeto. Esto fuerza a utilizar métodos miembro para alterar las variables miembro de un objeto. Se ha separado la interfaz de la clase de su implementación, de tal forma que no es necesario conocer los detalles de la implementación de la clase para reutilizar el código. La herencia resuelve el problema de la duplicación del código. Por medio de las clases es posible heredar tanto los datos como los métodos cuando se crea una nueva clase. Por ejemplo: class AvionComercial extends Avion { int pasajeros; int carga; }

La clase AvionComercial, una subclase de la clase Avion, hereda automáticamente todas las variables y métodos de la clase Avion y se podría escribir el siguiente código: AvionComercial av; av = new AvionComercial(); av.altitud = 300; av.pasajeros = 50; av.establecerVelocidad(300);

PAGINA - 41

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Las funciones polimórficas son funciones que responden indistintamente a los diferentes tipos de datos que se les suministran. Java simplifica el código a través del polimorfismo de tres formas: § § §

Herencia: Las subclases heredan automáticamente los métodos miembro de la clase superior. Adicionalmente, cualquier función que acepte una clase particular como argumento aceptará también como argumento, cualquier subclase de dicha clase. Sobrecarga: Implementación de funciones miembro con idéntica firma pero diferentes argumentos dentro de la misma clase. Interconexión: Implementación de funciones miembro con idéntica firma e idénticos argumentos dentro de distintas clases.

Supóngase que ahora se necesita crear un informe que muestre tanto aeropuertos como vuelos entrantes y salientes (aparentemente estas dos clases no provienen de una clase superior y por lo tanto, no comparten herencia). Se podría implementar un método en cada clase para realizar esta tarea. Por ejemplo: class Aeropuerto { String nombre; void imprimirInforme() { println(“Aeropuesto “ + nombre); } } class Avion { int int flota flota

altitud; velocidad; longitud; latitud;

void establecerVelocidad(int unaVelocidad) { if (unaVelociad > 0) { unAvion.velocidad = unaVelocidad; } else { unAvion.velocidad = 0; }

PAGINA - 42

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

void imnprimirInforme() { println(“Velocidad de vuelo “ + velocidad); } }

Ahora se pueden llamar a estas funciones del siguiente modo: aeropuerto1.imprimirInforme(); avion1.imprimirInforme();

Informalmente, ambas clases tienen una interface común a la hora de mostrar el informe. Java permite formalizar la interfaz de tal forma que pueda garantizarse que una clase funcionará con todos los métodos que conforman una interfaz. Usando una interfaz formal, puede escribirse una función que aceptará un argumento de cualquier clase que implemente una interfaz en particular. Para definir usa interfaz se usa la siguiente sintaxis: interface Imprimible { void imprimirInforme(); }

La interface Imprimible no es una clase y, por consiguiente, no puede ser instanciada. Las funciones miembro que se declaran en una interfaz son abstractas. Para implementar la interfaz en las clases Avion y Aeropuerto se debe declarar cada una de ellas del siguiente modo: class Aeropuerto implements Imprimible { … } class Avion implements Imprimible{ … }

PAGINA - 43

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Y ahora se pude crear una clase GeneradorDeInformes que genere informes de cualquier objeto que implemente la interfaz Imprimible: class GeneradorDeInformes { void crearInforme(Imprimible unObjeto) { unObjeto.imprimirInforme(); } }

La función crearInforme aceptará cualquier clase que implemente la interfaz Imprimible.

PAGINA - 44

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Curso de Java-WebObjects 10 mayo 2002

Ejercicios y cuestiones • • • • • •

¿Cómo se puede acceder a los datos contenidos en un objeto? ¿Cómo es la arquitectura de un programa Orientado a Objetos? ¿Cuál es la función de la clase Object? Diferencias entre programación clásica y orientada a objetos ¿En que se diferencia la programación en cliente y la programación en servidor? Tipos de polimorfismos

PAGINA - 45

© IGNIRE SOFTWARE EMPRESARIAL, S.L.L. Internet: www.ignire.com | teléfono (902) 157 779 | email: [email protected] INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE