Sie sind auf Seite 1von 45

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE


Curso de Java-WebObjects
10 mayo 2002

1. Líneas en blanco
2. Espacios en blanco
iii. Convención de nombres
iv. 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
v. 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
vi. Java para programadores de WebObjects
1. Usando Objetos
2. Creando Clases
3. Conceptos avanzados
4. Manejo de excepciones
5. Recursos adicionales
vii. 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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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 altitud;
int velocidad;
flota longitud;
flota 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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

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: info@ignire.com

INGENIERÍA, DESARROLLO Y DESPLIEGUE DE SOFTWARE

Das könnte Ihnen auch gefallen