You are on page 1of 137

Programacin orientada a objetos

ndice

1. Introduccin
2. Tecnologa orientada a objetos
1. Una Perspectiva Histrica
2. Cules son las ventajas de un lenguaje orientado a objetos?
3. El modelo orientado a objetos
1. objetos
2. clases
3. Herencia
4. Envo de mensajes
4. Caractersticas asociadas a la POO
1. Abstraccin
2. Encapsulamiento
3. Ocultamiento
4. Modularidad
5. Polimorfismo
5. Lenguajes de programacin orientado a objetos
6. Anlisis y diseo orientado a objetos
7. Resumen

Introduccin

La programacin orientada a objetos (POO, u OOP segn sus siglas en ingls)


es un paradigma de programacin que usa objetos en sus interacciones, para
disear aplicaciones y programas informticos.
Est basada en varias tcnicas, incluyendo herencia, cohesin, abstraccin,
polimorfismo, acoplamiento y encapsulamiento. Su uso se populariz a principios
de la dcada de 1990. En la actualidad, existe una gran variedad de lenguajes de
programacin que soportan la orientacin a objetos.
Tecnologa orientada a objetos

Hoy en da la tecnologa orientada a objetos ya no se aplica solamente a los


lenguajes de programacin, adems se viene aplicando en el anlisis y diseo con
mucho xito, al igual que en las bases de datos. Es que para hacer una buena
programacin orientada a objetos hay que desarrollar todo el sistema aplicando
esta tecnologa, de ah la importancia del anlisis y el diseo orientado a objetos.

La programacin orientada a objetos es una de las formas ms populares de


programar y viene teniendo gran acogida en el desarrollo de proyectos de software
desde los ltimos aos. Esta acogida se debe a sus grandes capacidades y ventajas
frente a las antiguas formas de programar.

Una Perspectiva Histrica

Tradicionalmente, la programacin fue hecha en una manera secuencial o lineal,


es decir una serie de pasos consecutivos con estructuras consecutivas y
bifurcaciones.

Los lenguajes basados en esta forma de programacin ofrecan ventajas al


principio, pero el problema ocurre cuando los sistemas se vuelven complejos. Estos
programas escritos al estilo espaguetti no ofrecen flexibilidad y el mantener una
gran cantidad de lneas de cdigo en slo bloque se vuelve una tarea complicada.

Frente a esta dificultad aparecieron los lenguajes basados en la programacin


estructurada. La idea principal de esta forma de programacin es separar las partes
complejas del programa en mdulos o segmentos que sean ejecutados conforme
se requieran. De esta manera tenemos un diseo modular, compuesto por mdulos
independientes que puedan comunicarse entre s. Poco a poco este estilo de
programacin fue reemplazando al estilo espaguetti impuesto por la programacin
lineal.

Entonces, vemos que la evolucin que se fue dando en la programacin se


orientaba siempre a ir descomponiendo ms el programa. Este tipo de
descomposicin conduce directamente a la programacion orientada a objetos.

Pues la creciente tendencia de crear programas cada vez ms grandes y complejos


llev a los desarrolladores a crear una nueva forma de programar que les permita
crear sistemas de niveles empresariales y con reglas de negocios muy complejas.
Para estas necesidades ya no bastaba la programacin estructurada ni mucho
menos la programacin lineal. Es as como aparece la programacion orientada a
objetos (POO). La POO viene de la evolucin de la programacin estructurada;
bsicamente la POO simplifica la programacin con la nueva filosofa y nuevos
conceptos que tiene. La POO se basa en la dividir el programa en pequeas
unidades lgicas de cdigo. A estas pequeas unidades lgicas de cdigo se les
llama objetos. Los objetos son unidades independientes que se comunican entre
ellos mediante mensajes. Veamos con mayor detenimiento este tema.

Cules son las ventajas de un lenguaje orientado a objetos?

Fomenta la reutilizacin y extensin del cdigo.


Permite crear sistemas ms complejos.
Relacionar el sistema al mundo real.
Facilita la creacin de programas visuales.
Construccin de prototipos
Agiliza el desarrollo de software
Facilita el trabajo en equipo
Facilita el mantenimiento del software

Lo interesante de la POO (programacion orientada a objetos) es que proporciona


conceptos y herramientas con las cuales se modela y representa el mundo real tan
fielmente como sea posible.

El modelo Orientado a objetos

Para entender este modelo vamos a revisar 4 conceptos bsicos:

objetos
clases
Herencia
Envo de mensajes

1. Objetos

Entender que es un objeto es la clave para entender cualquier lenguaje orientado


a objetos.

Existen muchas definiciones que se le ha dado al objeto. Primero empecemos


entendiendo que es un objeto del mundo real. Un objeto del mundo real es
cualquier cosa que vemos a nuestro alrededor. Digamos que para leer este artculo
lo hacemos a travs del monitor y una computadora, ambos son objetos, al igual
que nuestro telfono celular, un rbol o un automvil.

Analicemos un poco ms a un objeto del mundo real, como la computadora. No


necesitamos ser expertos en hardware para saber que una computadora est
compuesta internamente por varios componentes: la tarjeta madre, el chip del
procesador, un disco duro, una tarjeta de video, y otras partes ms. El trabajo en
conjunto de todos estos componentes hace operar a una computadora.

Internamente, cada uno de estos componentes puede ser sumamente complicado


y puede ser fabricado por diversas compaas con diversos mtodos de diseo.
Pero nosotros no necesitamos saber cmo trabajan cada uno de estos
componentes, como saber que hace cada uno de los chips de la tarjeta madre, o
cmo funciona internamente el procesador. Cada componente es una unidad
autnoma, y todo lo que necesitamos saber de adentro es cmo interactan entre
s los componentes, saber por ejemplo si el procesador y las memorias son
compatibles con la tarjeta madre, o conocer donde se coloca la tarjeta de video.
Cuando conocemos como interaccionan los componentes entre s, podremos armar
fcilmente una computadora.

Que tiene que ver esto con la programacin? La programacion orientada a objetos
trabaja de esta manera. Todo el programa est construido en base a diferentes
componentes (objetos), cada uno tiene un rol especfico en el programa y todos
los componentes pueden comunicarse entre ellos de formas predefinidas.

Todo objeto del mundo real tiene 2 componentes: caractersticas y


comportamiento.

Por ejemplo, los automviles tienen caractersticas (marca, modelo, color, velocidad
mxima, etc.) y comportamiento (frenar, acelerar, retroceder, llenar combustible,
cambiar llantas, etc.).

Los objetos de Software, al igual que los objetos del mundo real, tambin tienen
caractersticas y comportamientos. Un objeto de software mantiene sus
caractersticas en una o ms "variables", e implementa su comportamiento con
"mtodos". Un mtodo es una funcin o subrutina asociada a un objeto.
Para redondear estas ideas, imaginemos que tenemos estacionado en nuestra
cochera un Ford Focus color azul que corre hasta 260 km/h. Si pasamos ese objeto
del mundo real al mundo del software, tendremos un objeto Automvil con sus
caractersticas predeterminadas:

Marca=Ford
Modelo=Focus
Color=Azul
Velocidad Mxima = 260 km/h

Cuando a las caractersticas del objeto le ponemos valores decimos que el objeto
tiene estados. Las variables almacenan los estados de un objeto en un
determinado momento.

Definicin terica: Un objeto es una unidad de cdigo compuesto de variables y


mtodos relacionados.

2. Las clases

En el mundo real, normalmente tenemos muchos objetos del mismo tipo. Por
ejemplo, nuestro telfono celular es slo uno de los miles que hay en el mundo. Si
hablamos en trminos de la programacin orientada a objetos, podemos decir
que nuestro objeto celular es una instancia de una clase conocida como "celular".
Los celulares tienen caractersticas (marca, modelo, sistema operativo, pantalla,
teclado, etc.) y comportamientos (hacer y recibir llamadas, enviar mensajes
multimedia, transmisin de datos, etc.).
Cuando se fabrican los celulares, los fabricantes aprovechan el hecho de que los
celulares comparten esas caractersticas comunes y construyen modelos o
plantillas comunes, para que a partir de esas se puedan crear muchos equipos
celulares del mismo modelo. A ese modelo o plantilla le llamamos clase, y a los
equipos que sacamos a partir de ella la llamamos objetos.

Esto mismo se aplica a los objetos de software, se puede tener muchos objetos del
mismo tipo y mismas caractersticas.

Definicin terica: La clase es un modelo o prototipo que define las variables y


mtodos comunes a todos los objetos de cierta clase. Tambin se puede decir que
una clase es una plantilla genrica para un conjunto de objetos de similares
caractersticas.

Por otro lado, una instancia de una clase es otra forma de llamar a un objeto. En
realidad, no existe diferencia entre un objeto y una instancia. Slo que el objeto es
un trmino ms general, pero los objetos y las instancias son ambas
representaciones de una clase.
Definicin Terica: Una instancia es un objeto de una clase en particular.

3. Herencia

La herencia es uno de los conceptos ms cruciales en la POO (programacin


orientada a objetos). La herencia bsicamente consiste en que una clase puede
heredar sus variables y mtodos a varias subclases (la clase que hereda es
llamada superclase o clase padre). Esto significa que una subclase, aparte de los
atributos y mtodos propios, tiene incorporados los atributos y mtodos heredados
de la superclase. De esta manera se crea una jerarqua de herencia.

Por ejemplo, imaginemos que estamos haciendo el anlisis de un Sistema para una
tienda que vende y repara equipos celulares.

En el grfico vemos 2 clases ms que posiblemente necesitemos para crear nuestro


Sistema. Esas 2 clases nuevas se construirn a partir de la clase Celular existente.
De esa forma utilizamos el comportamiento de la Superclase.

En general, podemos tener una gran jerarqua de clases tal y como vemos en el
siguiente grfico:
4. Envo de Mensajes

Un objeto es intil si est aislado. El medio empleado para que un objeto interacte
con otro son los mensajes. Hablando en trminos un poco ms tcnicos, los
mensajes son invocaciones a los mtodos de los objetos.

Caractersticas asociadas al POO

Abstraccin

La abstraccin consiste en captar las caractersticas esenciales de un objeto, as


como su comportamiento. Por ejemplo, volvamos al ejemplo de los automviles,
Qu caractersticas podemos abstraer de los automviles? O lo que es lo mismo
Qu caractersticas semejantes tienen todos los automviles? Todos tendrn una
marca, un modelo, nmero de chasis, peso, llantas, puertas, ventanas, etc. Y en
cuanto a su comportamiento todos los automviles podrn acelerar, frenar,
retroceder, etc.

En los lenguajes de programacin orientada a objetos, el concepto de clase es la


representacin y el mecanismo por el cual se gestionan las abstracciones.

Por ejemplo, en Java tenemos:

Public-class-Automovil{
//variables
//mtodos
}

Encapsulamiento

El encapsulamiento consiste en unir en la clase las caractersticas y


comportamientos, esto es, las variables y mtodos. Es tener todo esto es una sola
entidad. En los lenguajes estructurados esto era imposible. Es evidente que el
encapsulamiento se logra gracias a la abstraccin y el ocultamiento que veremos a
continuacin.

La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya


que tendremos a las clases como cajas negras donde slo se conoce el
comportamiento, pero no los detalles internos, y esto es conveniente porque nos
interesar ser conocer qu hace la clase pero no ser necesario saber cmo lo
hace.

Ocultamiento

Es la capacidad de ocultar los detalles internos del comportamiento de una clase


y exponer slo los detalles que sean necesarios para el resto del sistema.

El ocultamiento permite 2 cosas: restringir y controlar el uso de la clase. Restringir


porque habr cierto comportamiento privado de la clase que no podr ser accedido
por otras clases. Y controlar porque daremos ciertos mecanismos para modificar
el estado de nuestra clase y es en estos mecanismos dnde se validarn que
algunas condiciones se cumplan. En Java el ocultamiento se logra usando las
palabras reservadas: public, private y protected delante de las variables y
mtodos.

Modularidad

Es la propiedad que permite subdividir una aplicacin en partes ms pequeas


(llamadas mdulos), cada una de las cuales debe ser tan independiente como sea
posible de la aplicacin en s y de las restantes partes. Estos mdulos se pueden
compilar por separado, pero tienen conexiones con otros mdulos. Al igual que la
encapsulacin, los lenguajes soportan la modularidad de diversas formas.

Polimorfismo

Comportamientos diferentes, asociados a objetos distintos, pueden compartir el


mismo nombre; al llamarlos por ese nombre se utilizar el comportamiento
correspondiente al objeto que se est usando. O, dicho de otro modo, las
referencias y las colecciones de objetos pueden contener objetos de diferentes
tipos, y la invocacin de un comportamiento en una referencia producir el
comportamiento correcto para el tipo real del objeto referenciado. Cuando esto
ocurre en "tiempo de ejecucin", esta ltima caracterstica se llama asignacin
tarda o asignacin dinmica. Algunos lenguajes proporcionan medios ms
estticos (en "tiempo de compilacin") de polimorfismo, tales como las plantillas y
la sobrecarga de operadores de C++.

Lenguajes de Programacin Orientado a objetos

En 1985, E. Stroustrup extendi el lenguaje de programacin C a C++, es decir C


con conceptos de clases y objetos, tambin por esas fechas se creo desde sus
bases el lenguaje EIFFEL.

En 1995 apareci el ms reciente lenguaje OO, Java desarrollado por SUN, que
hereda conceptos de C++.

El lenguaje de desarrollo ms extendido para aplicaciones Web, el PHP 5, trae todas


las caractersticas necesarias para desarrollar software orientado a objetos.

Adems de otros lenguajes que fueron evolucionando, como el Pascal a Delphi.

Finalmente tambin otros lenguajes script como el ActionScript que si bien no es


totalmente orientado a objetos pero s posee las caractersticas.
Anlisis y diseo Orientado a objetos

Para el desarrollo de software orientado a objetos no basta usar un lenguaje


orientado a objetos. Tambin se necesitar realizar un anlisis y diseo orientado
a objetos.

El modelamiento visual es la clave para realizar el anlisis OO (orientado a objeto).


Desde los inicios del desarrollo de software OO han existido diferentes
metodologas para hacer esto del modelamiento, pero sin lugar a duda, el Lenguaje
de Modelamiento Unificado (UML) puso fin a la guerra de metodologas.

Segn los mismos diseadores del lenguaje UML, ste tiene como fin modelar
cualquier tipo de sistemas (no solamente de software) usando los conceptos de la
orientacin a objetos. Y adems, este lenguaje debe ser entendible para los
humanos y mquinas.

Actualmente en la industria del desarrollo de software tenemos al UML como un


estndar para el modelamiento de sistemas OO. Fue la empresa Racional que cre
estas definiciones y especificaciones del estndar UML, y lo abri al mercado. La
misma empresa cre uno de los programas ms conocidos hoy en da para este fin;
el Racional Rose, pero tambin existen otros programas como el Poseidon que
trae licencias del tipo community edition que permiten su uso libremente.

El UML consta de todos los elementos y diagramas que permiten modelar los
sistemas en base al paradigma orientado a objetos. Los modelos orientados a
objetos cuando se construyen en forma correcta, son fciles de comunicar, cambiar,
expandir, validar y verificar. Este modelamiento en UML es flexible al cambio y
permite crear componentes plenamente reutilizables.

Resumen

Por qu seguimos buscando nuevas tcnicas de desarrollo? Por el aumento


de la complejidad de los sistemas.
En un programa orientado a objetos tendremos a un conjunto de objetos
colaborando entre ellos.
La orientacin a objetos es paradigma de que est de moda para el
desarrollo de software.
Un objeto es una abstraccin conceptual del mundo real que se puede
traducir a un lenguaje de programacin orientado a objetos.
Un objeto del mundo real tiene caractersticas y comportamientos, y de la
misma manera, un objeto del mundo del software tiene variables y mtodos.
Una clase es una plantilla que define las variables y mtodos a ser incluidas
en un tipo de objeto especfico.
Los objetos tambin son llamados instancias de la clase. Los objetoss slo
almacenan su estado. Se dice que un objeto tiene estado cuando tiene
valores en sus variables.
Los objetos se comunican entre ellos usando los mensajes. Un mensaje es
la invocacin de un mtodo del objeto.
La orientacin a objetos requiere de una metodologa que integre el proceso
de desarrollo y un lenguaje de modelamiento con herramientas y tcnicas
adecuadas.

Historia de la Programacin

Gottfried Wilheml von Leibniz (1646-1716), quien aprendi matemticas de forma


autodidacta (mtodo no aconsejable en programacin) construy una mquina
similar a la de Pascal, aunque algo ms compleja, poda dividir, multiplicar y resolver
races cuadradas.

Pero quien realmente influy en el diseo de los primeros computadores fue


Charles Babbage (1793-1871). Con la colaboracin de la hija de Lord Byron, Lady
Ada Countess of Lovelace (1815-1852), a la que debe su nombre el lenguaje ADA
creado por el DoD (Departamento de defensa de Estados Unidos) en los aos 70.
Babbage dise y construy la "mquina diferencial" para el clculo de polinomios.
Ms tarde dise la "mquina analitica" de propsito general, capaz de resolver
cualquier operacin matemtica. Muri sin poder terminarla, debido al escepticismo
de sus patrocinadores y a que la tecnologa de la poca no era lo suficientemente
avanzada. Un equipo del Museo de las Ciencias de Londres, en 1991, consigui
construir la mquina analtica de Babbage, totalmente funcional, siguiendo sus
dibujos y especificaciones.

Un hito importante en la historia de la informtica fueron las tarjetas perforadas


como medio para "alimentar" los computadores. Lady Ada Lovelace propuso la
utilizacin de las tarjetas perforadas en la mquina de Babbage. Para que se
enteren todos esos machistas desaprensivos, el primer programador/a fue una
mujer. En 1880 el censo en Estados Unidos tard ms de 7 aos en realizarse. Es
obvio que los datos no eran muy actualizados. Un asistente de la oficina del censo
llamado Herman Hollerit (1860-1929) desarroll un sistema para automatizar la
pesada tarea del censo. Mediante tarjetas perforadas y un sistema de circuitos
elctricos, capaz de leer unas 60 tarjetas por minuto realiz el censo de 1890 en 3
aos ahorrando tiempo y dinero. Ms tarde fund la Tabulating Machine Company
y en 1924 tras alguna que otra fusin naci la Internacional Bussines Machines,
IBM. Os suena ?
Las computadoras de hoy en da se sustentan en la lgica matemtica basada en
un sistema binario. Dicho sistema se implementa sobre dispositivos electrnicos
que permiten, o no, pasar la corriente, con lo que se consiguen los 2 estados
binarios: 0 y 1. A mediados del siglo XX, cuando se empezaron a construir las
primeras computadoras digitales, se utilizaban tubos de vaco para implementar los
2 estados binarios, pero cmo aparecieron estos conceptos ? Alan Mathison
Turing (1912-1954) dise una calculadora universal para resolver cualquier
problema, la "mquina de Turing". Tuvo mucha influencia en el desarrollo de la
lgica matemtica. En 1937 hizo una de sus primeras contribuciones a la lgica
matemtica y en 1943 plasm sus ideas en una computadora que utilizaba tubos de
vaco. George Boole (1815-1864) tambin contribuy al algebra binaria y a los
sistemas de circuitos de computadora, de hecho, en su honor fue bautizada el
lgebra booleana.

La primera computadora digital electrnica patentada fue obra de John Vincent


Atanasoff (1903-1995). Conocedor de las inventos de Pascal y Babbage, y
ayudado por Clifford Berry (1918-1963), construy el Atanasoff Berry Computer
(ABC). El ABC se desarroll entre 1937 y 1942. Consista en una calculadora
electrnica que utilizaba tubos de vaco y estaba basada en el sistema binario
(sistema numrico en el que se combinan los valores verdadero y falso, o 0 y 1).

Entre 1939 y 1944, Howard Aiken (1900-1973) de la universidad de Harvard en


colaboracin con IBM desarroll el Mark 1. Era una computadora electromecnica
de 16 metros de largo y ms de dos de alto. Tena 700.000 elementos mviles y
varios centenares de kilmetros de cables. Poda realizar las cuatro operaciones
bsicas y trabajar con informacin almacenada en forma de tablas.

Por desgracia, los avances tecnolgicos suelen producirse gracias a los militares
que se aprovechan de la ciencia para perfeccionar sus armas. En la Moore School
de la Universidad de Pensilvania se estaba trabajando en un proyecto militar para
realizar unas tablas de tiro para armas balsticas. Los clculos eran enormes y se
tardaban semanas en realizarlos. Parece ser que John W. Mauchly (1907-1980),
quien diriga el departamento de fsica del Ursine College de Filadelfia vivi en casa
de Atanasoff durante cuatro das a partir del 13 de Junio de 1941, lo que
seguramente aprovech para conocer las ideas de Atanasoff.

Junto a John Presper Eckert (1919-1995), Mauchly desarroll una computadora


electrnica completamente operacional a gran escala, para acelerar los
complicados clculos del proyecto militar de la universidad Moore. Se termin en
1946 y se llam Electronic Numerical Integrator And Computer (ENIAC). El ENIAC
tena 18.000 tubos electrnicos integrados en un volumen de 84 metros cbicos.
Pesaba unas 30 toneladas y consuma alrededor de 100.000 vatios. Su capacidad
de clculo era de 5.000 operaciones por segundo, aunque tena que programarse
manualmente conectndola a 3 tableros que contenan ms de 6000 interruptores.
Cargar un programa poda ser una tarea de varios das. El calor dispado por
semejante monstruo deba ser importante, y se necesitaba una instalacin de aire
acondicionado. En definitiva, un ordenador porttil... ms o menos.

Puede que no os suene, pero quien conozca de "los entresijos de la informtica"


seguro que considera importante nombrar a Johann Ludwig Von Neumann (1903-
1957), genio de las matemticas, quien tuvo el honor de asistir a las clases de Albert
Einstein en la universidad de Berln. Autor de trabajos de lgica simblica,
matemtica pura y aplicada, fsica y tecnologa, public un artculo acerca del
almacenamiento de los programas, en 1945. Propona que los programas se
guardaran en memoria al igual que los datos, en forma binaria. Esto tuvo como
consecuencia el aumento de velocidad de los clculos y la ausencia de errores
producidos por fallos mecnicos al programar la mquina mediante cables.

En cuanto a la aparicin de los lenguajes de programacin, el archiconocido


COBOL, que tantos problemas caus con el "efecto 2000", fue el primer lenguaje
en el que no haba que programar directamente en cdigo binario, y fue Grace
Murray Hoper en 1952, una oficial de la Marina de Estados Unidos desarroll el
primer compilador, un programa que puede traducir enunciados parecidos al ingls
en un cdigo binario comprensible para la maquina llamado COBOL (COmmon
Business-Oriented Languaje).

A partir de ah, los avances han sido vertiginosos.

La utilizacin del transistor en las computadoras en 1958, sustituyendo los


tubos de vaco

La aparicin del circuito integrado de mano de Jack Kilby, tambin en 1958

La miniaturizacin de un circuito electrnico en un chip de silicio en 1961

El primer microprocesador, el 4004 de Intel, en 1971

Gary Kildall crea el sistema operativo CP/M en 1973

IBM comercializa el primer PC en 1980

Recordando a los primeros tiempos del ENIAC, con enormes computadores, en


1998 se termin el proyecto Blue Pacific. La "maquinita" tiene la nada despreciable
cantidad de 5856 procesadores que en conjunto tienen una velocidad de 3'9
teraflops, 2'6 Terabytes de memoria, ocupa 2400 metros cuadrados y tiene un peso
de 47 toneladas. Se utiliza para la simulacin de explosiones nucleares, y "ha salido"
por unos 13000 millones de pesetas... baratito.

Hay muchos ms personajes que intervienen en la historia y que han realizado


grandes aportaciones, pero no es cuestin de extenderse.
El Objeto

El objeto es la entidad en torno a la cual gira la POO. Un objeto es un ejemplar


concreto de una clase, como por ejemplo el curso de metodologa de la
programacin es un curso concreto dentro de todos los tipos de cursos que pueden
existir. Un objeto pertenece a una clase, por lo tanto dispondr de los atributos
(datos) y operaciones (mtodos) de la clase a la que pertenece. Un objeto responde
al comportamiento definido por las operaciones de la clase a la que pertenece. Es
decir, si la clase coche dispone del atributo color y del mtodo arrancar, un coche
concreto tendr un color, y podr arrancar, exclusivamente.

Un objeto se puede ver como una "cpsula" de datos y algoritmos que trabajan
sobre esos datos. Un objeto no puede acceder directamente a sus datos (atributos).
Los atributos son slo accesibles desde la implementacin de los mtodos de una
clase. Un objeto no puede "manipular" sus propios datos, para ello estn los
mtodos de la clase de dicho objeto: el comportamiento (mtodos) de un objeto
puede variar el valor (estado) de sus datos (atributos). Por ejemplo, nunca debemos
hacer lo siguiente: miCoche.color := 'rojo'. Para esto definiremos mtodos que
actualicen el valor de los atributos de un objeto, por ejemplo:
miCoche.ponerColor('rojo').

En la POO, un objeto no es algo "eterno", se instancian (crean) y se destruyen.


Una vez que se haya instanciado un objeto puede recibir mensajes. Los objetos
pueden instanciarse de forma esttica o de forma dinmica (recordar estos
conceptos de captulos anteriores). Un objeto esttico comienza su existencia una
vez es declarado (instanciacin de objetos estticos), sin embargo, un objeto
dinmico no comienza su existencia al ser declarado, sino al recibir un espacio de
memoria (instanciacin dinmica de objetos). Por ejemplo:

Los objetos "se declararn" como atributos de las clases, en las clasulas var de los
mtodos o en la lista de parmetros de los mtodos. El nico objeto que debe ser
"declarado" en el programa principal ser el de la clase raz de toda la jerarqua de
clases (por cuestiones del lenguaje Pascal orientado a objetos). Los objetos
estticos existen durante la ejecucin del programa. Los objetos dinmicos existen
mientras no sean destruidos (liberacin de la memoria del objeto), mediante la
sentencia dispose.

Tras ser instanciado, un objeto consta de los atributos de la clase a la que pertenece,
y puede recibir mensajes. Dicho objeto determinar a qu mtodo de su clase
corresponde dicho mensaje. Un objeto no podr recibir mensajes correspondientes
a mtodos de una clase a la qe no pertenezca. Por ejemplo:
La Clase

Una clase es una descripcin de datos y operaciones que describen el


comportamiento de cierto tipo de elementos. Por lo tanto, para que pueda haber
objetos, antes deben haberse definido las clases a las que pertenecern dichos
objetos. No tiene sentido un objeto sin una clase, ya que el objeto tiene los atributos
de la clase a la que pertenece, y recibe mensajes correspondientes a mtodos de
la clase a la que pertenece.

Una clase se divide en una parte pblica y en una parte privada. El nombre de la
clase debe ser nico. Antes de continuar, recordar cmo era una librera (UNIT) en
Pascal. Tiene una parte donde se declaran las cabeceras de los subprogramas
(ineterface) que prodrn usarse desde los ficheros que usen la librera, y otra parte
donde se implementan dichos subprogramas (implementation).

Parte pblica

Describe a qu operaciones responden los objetos de una clase (cmo se


comportan los objetos). En esta parte de la clase se declaran las cabeceras de los
mtodos de la clase que podrn ser "invocados" por los objetos. Es decir, si un
mtodo se declara en la parte pblica, podr ser "invocado" por un objeto de dicha
clase, de lo contrario no podr ser "invocado" por un objeto. Es la parte "visible" de
la clase, la interfaz de la clase.

Parte privada

Describe los datos de la clase y cmo las operaciones manipulan dichos datos. Esta
parte de la clase es donde se oculta (encapsula) la informacin de la clase: datos e
implementacin de mtodos declarados o no en la parte pblica de la clase. Es una
parte "no visible", cada objeto de una determinada clase tiene sus atributos (datos)
y sus mtodos.
Abstraccin

Podramos definir la abstraccin como la "accin de aislar mentalmente o considerar


por separado las cualidades de un objeto, considerar un objeto en su esencia".
Qu quiere decir esta definicin? A travs de la abstraccin conseguimos
extraer las cualidades principales sin detenernos en los detalles. Conseguimos
a partir de un tema determinado, generalizar y obtener una visin global del tema.
Cuando montamos un ordenador ensamblamos los componentes necesarios para
construir el ordenador. Utilizamos una placa base, un disco duro, memoria, etc.
Manejamos estos dispositivos a un nivel funcional. Es decir, abstraemos las
funciones de cada dispositivo para trabajar con ellos. En ningn momento nos
paramos a pensar cmo funcionan internamente o de cuntos condensadores y
transistores est compuesto.

La abstraccin es una herramienta muy potente en programacin, pues reduce


considerablemente el trabajo de implementacin y aumenta la portabilidad del
cdigo. La programacin orientada a objetos aporta elementos para abstraer el
problema en dos sentidos:

Por un lado nos permite referirnos a objetos para representar la realidad,


describiendo el problema en trminos del problema en lugar de en
trminos de la solucin. En un programa de gestin comercial, tendremos
el objeto cliente o el objeto factura, que no son ms que representaciones de
otros objetos en el espacio del problema.

La clave de la programacin orientada a objetos est en abstraer los mtodos


y los datos comunes a un conjunto de objetos y agruparlos en una clase.
Gracias a este nivel de abstraccin, aadir o eliminar un objeto nuevo
supondr muy poco esfuerzo.
Herencia

La herencia es un mecanismo exigido a cualquier lenguaje que pretenda ser


orientado a objetos. Consideraremos la herencia como la transmisin de los
mtodos y atributos de una clase a otra. Gracias a la herencia se pueden establecer
jerarquas entre clases. Establecer una jerarqua es un proceso subjetivo, que
depende del programador y de los matices de apreciacin de cada uno.

La herencia nos permite definir una jerarqua en la que existirn clases padre y
clases hijo, pudindo ser una clase padre de otra clase, e hijo de otra clase a la
vez. No deben definirse jerarquas de herencia en la que una clase sea padre e hijo
de la misma clase. Existen 2 tipos de herencia: La herencia simple y la herencia
mltiple. En la herencia simple una clase slo puede tener una clase padre, en la
herencia mltiple, una clase puede tener ms de una clase padre. Por ejemplo:

En la siguiente figura se muestra una jerarqua de clases, con herencia simple de 2


clases vertebrado e invertebrado, que heredan de la clase serVivo.

En la siguiente figura se muestra una jerarqua de clases, con herencia mltiple de


1 clase hispano-argentino, que hereda de las clases espaol y argentino.
Cuando una clase hereda de otra, la clase padre "transmite" todos sus atributos y
mtodos a la clase hija.

Clase abstracta

Al construir una jerarqua de herencia puede darse el caso de que ciertas


operaciones de la clase padre no pueden ser completadas por diferentes motivos,
o que dichas operaciones se hagan de una forma diferente en cada clase hija. Por
ejemplo, en una clase serVivo existir un mtodo comer, pero ese mtodo ser
diferente en una clase hija perro (los perros comen con la boca), y en una clase hija
pjaro, ya que los pjaros comen con el pico (salvo una mutacin extraa...). Por lo
tanto, una clase ser abstracta si tiene algn mtodo diferido, es decir, declarado
pero no definido. No podr instanciarse ningn objeto de una clase abstracta.

Redefinicin de mtodos

Una clase hija de una clase abstracta puede redefinir los mtodos diferidos de su
clase padre abstracta.

Nota: Una clase hija de una clase abstracta no tiene porqu redefinir los
mtodos diferidos de la clase padre, podra ser una clase nieta de la clase
abstracta la que hiciera la redefinicin. Lo que es obligatorio es redefinir un
mtodo diferido en alguna clase descendiente de una clase abstracta.

El mtodo debe redefinirse con los mismos parmetros que el mtodo diferido, de
lo contrario se estara definiendo otro mtodo (sobrecarga). Es aqu donde aparece
el concepto de super. Esta palabra reservada hace referencia a un mtodo
perteneciente a la clase padre de la clase del objeto en cuestin.

Polimorfismo

Concepto de polimorfismo

Esta caracterstica permite definir distintos comportamientos para un mtodo


dependiendo de la clase sobre la que se realize la implementacin. En todo
momento tenemos un nico medio de acceso, sin embargo se podr acceder a
mtodos distintos.

Veamos el siguiente ejemplo, en el que se define una clase forma de la que se


heredan las clases crculo y cuadrado.

La clase forma define los mtodos dibujar y borrar. En la definicin de estos mtodos
se implementar el cdigo comn a todos los objetos de la clase. Sin embargo
cuando definamos las clases hijas, crculo y cuadrado, ser necesario modificar
estos mtodos para adaptarlos a las nuevas subclases. El mtodo de la clase padre
implementa aquellas acciones comunes. Las clases hijas aaden las operaciones
particulares que necesiten. Cuando utilicemos los mtodos de la clase forma no
tendremos que hacer distincin entre cuadrados y crculos. Gracias al polimorfismo
se ejecutar el mtodo adecuado en funcin de la subclase a la que pertenezca el
objeto.
En la declaracin de una clase estamos definiendo el conjunto de mtodos y
campos que son accesibles desde fuera de una clase o lo que a menudo se
denomina contrato de la clase. Este contrato determina cual va a ser la
funcionalidad de la clase. Pero cuando extendemos una clase para crear otra
estamos ampliando este contrato aadiendo mas funcionalidades. Por tanto cuando
creamos esa nueva clase hacemos uso de dos mecanismos. Por un lado la
herencia para reutilizar las partes comunes de la super-clase. Y por otro el
polimorfismo, es decir el cambio en la forma en la que se implementa el contrato
de la superclase. Como vemos al escribir una subclase podemos sobreescribir el
contrato aadiendo nuevas funcionalidades, pero no cambiarlo.

A la hora de implementar el polimorfismo tendremos dos mecanismos de los que


echar mano para sobreescribir una clase: reemplazar la implementacin de un
mtodo o aadir funcionalidades a un mtodo.

Continuando con el ejemplo de Publicacion, habamos definido dos subclases Libro


y Revista, vamos a ver cmo se implementan estas subclases:

La superclase Publicacion implementaba un mtodo llamado toString() que devolva


una cadena compuesta en base al identificador, ttulo y autor de una publicacin. Al
sobreescribir el mtodo se utiliza el cdigo de la superclase y se aade a la cadena
el nmero de pginas.

Veamos ahora como afecta la sobrescritura a la subclase Revista:


En este caso vemos como se reemplaza completamente la implementacin dada
por la super-clase para el mtodo toString(). Normalmente las revistas no son
firmadas por un nico autor, por tanto es un campo que no vamos a utilizar. Es
necesario reescribir completamente el mtodo y aadirle la periodicidad de la
revista, campo que s es importante en este tipo de publicaciones.

Ventajas de la Programacin Orientada a Objetos

Vamos a ver las ventajas ms importantes de la programacin orientada a objetos:

Reusabilidad. Cuando hemos diseado adecuadamente las clases, se


pueden usar en distintas partes del programa y en numerosos proyectos.

Mantenibilidad. Debido a la sencillez para abstraer el problema, los


programas orientados a objetos son ms sencillos de leer y comprender,
pues nos permiten ocultar detalles de implementacin dejando visibles slo
aquellos detalles ms relevantes.

Modificabilidad. La facilidad de aadir, suprimir o modificar nuevos objetos


nos permite hacer modificaciones de una forma muy sencilla.

Fiabilidad. Al dividir el problema en partes ms pequeas podemos


probarlas de manera independiente y aislar mucho ms fcilmente los
posibles errores que puedan surgir.
La programacin orientada a objetos presenta tambin algunas desventajas como
pueden ser:

Cambio en la forma de pensar de la programacin tradicional a la orientada


a objetos.

La ejecucin de programas orientados a objetos es ms lenta.

La necesidad de utilizar bibliotecas de clases obliga a su aprendizaje y


entrenamiento.

Lenguajes Orientados a Objetos

Simula (1967) es aceptado como el primer lenguaje que posee las caractersticas
principales de un lenguaje orientado a objetos. Fue creado para hacer programas
de simulacin, en donde los "objetos" son la representacin de la informacin ms
importante. Smalltalk (1972 a 1980) es posiblemente el ejemplo cannico, y con el
que gran parte de la teora de la programacin orientada a objetos se ha
desarrollado.

Entre los lenguajes orientados a objetos se destacan los siguientes:

ABAP

ABL Lenguaje de programacin de OpenEdge de Progress Software

ActionScript

ActionScript 3

Ada

C++

C#

Clarion
Clipper (lenguaje de programacin) (Versin 5.x con librera de objetos
Class(y))

Object Pascal (Delphi)

Gambas

Harbour

Eiffel

Java

JavaScript (la herencia se realiza por medio de la programacin basada en


prototipos)

Lexico (en castellano)

Objective-C

Ocaml

Oz

Perl (soporta herencia mltiple. La resolucin se realiza en preorden, pero


puede modificarse al algoritmo linearization C3 por medio del
mdulo Class::C3 en CPAN)

PHP (a partir de su versin 5)

PowerBuilder

Python

Ruby

Smalltalk (Proyecto investigativo. Influenci a Java.)

Magik (SmallWorld)
Vala

VB.NET

Visual FoxPro (en su versin 6)

Visual Basic 6.0

Visual Objects

XBase++

Lenguaje DRP

Lenguaje de programacin Scala (lenguaje usado


por Twitter) http://www.scala-lang.org/page.jsp

Muchos de estos lenguajes de programacin no son puramente orientados a


objetos, sino que son hbridos que combinan la POO con otros paradigmas.

Al igual que C++ otros lenguajes,


como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados
aadiendo extensiones orientadas a objetos a un lenguaje de programacin clsico.

Un nuevo paso en la abstraccin de paradigmas de programacin es


la Programacin Orientada a Aspectos (POA). Aunque es todava una metodologa
en estado de maduracin, cada vez atrae a ms investigadores e incluso proyectos
comerciales en todo el mundo.
Lenguaje de Programacin Java

Introduccin a Java

Aunque los inicios de Java se remontan a 1991, fecha en la que los ingenieros de
Sun Microsystems trataban de disear un lenguaje de programacin para
electrodomsticos, Java se introduce como lenguaje de programacin a finales de
1995.

Java, segn lo describe Sun, es un lenguaje simple, orientado a objetos, distribuido,


interpretado, robusto, seguro, de arquitectura neutra, portable, de altas
prestaciones, multitarea y dinmica. Muchos de estos conceptos se irn explicando
en sucesivos captulos. La verdad es que java es un lenguaje muy completo y en el
que casi todo depende de todo. Es por eso por lo que su aprendizaje se orienta de
forma iterativa: a partir de una visin muy general se va refinando en sucesivas
iteraciones.

Existen distintos programas comerciales que permiten desarrollar cdigo en Java.


Nosotros prestaremos atencin a Sun Microsystems que distribuye gratuitamente
dos productos:

Java(tm) Development Kit (JDK): conjunto de programas y libreras que


permiten compilar y ejecutar programas escritos en Java. Incorpora adems
un depurador (Debugger) para ejecutar parcialmente un programa, revisar
los valores de variables, etc. con el objetivo de corregir errores de
codificacin.

Java Runtime Environment (JRE): se trata de una versin reducida del JDK
destinada nicamente a la ejecucin de cdigo Java.

Los programas en Java se construyen con clases. Instanciando estas clases se


podrn crear cualquier cantidad de objetos. Se puede pensar en una clase como
en una plantilla para construir objetos. Las clases estarn compuestas por dos tipos
de miembros: los campos, o datos de la clase, y los mtodos, o acciones que se
pueden realizar sobre los datos.

Ahora podemos comenzar a sumergirnos en Java. Veamos para ello un programa


muy sencillo, el clsico ejemplo del programa que imprime "Hola Mundo":

HolaMundo.java

Holamundo.java declara una clase llamada HolaMundo. Los miembros de la clase


aparecen entre llaves. Esta clase tendr un miembro, el mtodo denominando main
. Este mtodo se ejecuta cuando ejecutamos la clase como aplicacin.

El nico parmetro del mtodo main es un vector de objetos String que son los
argumentos con los que se invocar al programa desde la lnea de rdenes. void
indica que el mtodo main no devuelve ningn valor.

La nica sentencia que contiene el mtodo main invoca al mtodo println en el objeto
out de la clase System. Esta sentencia imprime una cadena con terminacin de salto
de lnea en el flujo de salida estndar.

Encapsulamiento en Java

Imaginemos que se crea una clase, una docena de programadores tienen acceso a
dicha clase y la utilizan a discrecin, posteriormente dicha clase comienza a
comportarse de una manera inesperada debido a que los valores que algunas
variables han tomado no fueron anticipados y todo comienza a desmoronarse. Para
corregir el problema se crea una versin ms nueva de dicha clase y listo.

Bueno, a esto le llamamos flexibilidad y capacidad de mantenimiento, ambas son


caractersticas y beneficios de la programacin Orientada a Objetos (OO) pero para
que una clase pueda cumplir dichas funciones los programadores debemos de
hacer algo. Imaginemos que creamos una clase con variables de instancia pblicas
a las cuales podemos acceder sin problemas desde fuera de la misma clase...

Analizando el cdigo anterior podemos darnos cuenta de que las variables enteras
tipo y clase son pblicas y pueden ser accedidas directamente a travs de una
instancia de la clase MiClase, esto compila sin ningn problema, digamos que es
'legal', sin embargo, qu pasa si ingresamos un valor que no se supone debe de
tener una variable (en este caso el -5 que le asignamos a tipo)?, simplemente no
hay nada que nos detenga para hacerlo. La nica manera de proteger el cdigo es
escribiendo un mtodo que nos permita regular los valores que cada variable puede
tener y escondiendo las variables para que no se pueda acceder a ellas de manera
directa, esto es el principio bsico de encapsulamiento.

Si se desea flexibilidad, buen mantenimiento y extensibilidad, nuestro diseo en el


cdigo debe de incluir encapsulamiento, para ello debemos de hacer lo siguiente:

1. Mantener las variables de instancia protegidas (puede ser con un modificador


de acceso, p.ej., private).

2. Hacer mtodos de acceso pblicos para forzar al acceso a las variables por
medio de dichos mtodos en lugar de acceder directamente.
3. Utilizar las convenciones de cdigo para los nombres de los mtodos, p. ej.,
set y get.

El ejemplo anterior modificado para un buen encapsulamiento quedara as:

Si nos fijamos un poquito, en el mtodo setTipo() no existen validaciones para


prevenir que un valor no vlido sea asignado a la variable, sin embargo, el proveer
de un mtodo de este tipo desde el diseo inicial de la aplicacin nos permite
posteriormente modificar el comportamiento de la misma sin afectar los mtodos
utilizados, tal vez en un futuro se desee que dicha variable solamente pueda tener
uno entre un rango de valores y se podrn aplicar posteriormente los cambios sin
que haya repercusiones negativas.
Mtodo main en Java

El mtodo main proporciona el mecanismo para controlar la aplicacin. Cuando se


ejecuta una clase Java el sistema localiza y ejecuta el mtodo main de esa clase.
Veamos un ejemplo

Los argumentos del array de cadenas son los "argumentos de la clase". El programa
imprimira por pantalla estos argumentos. As para realizar una posible ejecucin de
la aplicacin escribiramos en la lnea de comandos:

java imprime hola que tal estas

Obtenindose como resultado:

hola que tal estas

El mtodo main debe ser public, static y void(no devuelve nada)

Flujos de Control en Java

Un programa java est compuesto por una serie de sentencias. Las dos sentencias
bsicas en el lenguaje Java se reflejan en la siguiente tabla:

sentencias de que son las que hemos estudiado para declarar variables
declaracin y constantes.

Expresin de asignacin, a = b+c;


sentencias de
Formas prefijas o posfijas de ++ y --, contador++;
expresin
Llamadas a mtodos, Objeto1.mimetodo();
Expresiones de creacin de objetos

Sentencias de control

Estas ltimas son las que controlan el flujo de ejecucin del programa.
Normalmente el orden de ejecucin de sentencias es el mismo en el que estn
escritas. Sin embargo, las sentencias de control de flujo introducen bifurcaciones
en la ejecucin del programa. A continuacin estudiaremos en detalle cada uno de
los tipos de sentencias.

if-else

La sentencia if-else nos permite elegir entre dos alternativas de flujo diferentes. La
ejecucin del programa depender del resultado de evaluar la expresin booleana,

si el valor de expresion_booleana es true se ejecutar el bloque_de_sentencias1,


en caso contrario, si hay parte else, se ejecuta el bloque_de_sentencias2. La
clusula else es opcional.

Si queremos que un programa compruebe la edad de una determinada persona


para saber si es menor de edad o no, bastara con preguntar en una sentencia if-
else si la variable edad, que es donde tenemos almacenada la edad de la persona,
es menor que dieciocho. En caso afirmativo, aplicaremos un descuento del 5% y
en caso contrario del 15%.

Supongamos que adems de saber si alguien es mayor o menor de edad


queremos aplicar un nuevo descuento para jubilados. Podemos cambiar el
problema y anidar sentencias if-else.

switch
La sentencia switch selecciona entre un grupo de sentencias en funcin de la
evaluacin de una expresin. Su formato sera:

si se encuentra una etiqueta case cuyo valor_integral coincida con el de la


expresin selector se trasfiere el control a su correspondiente
bloque_de_sentencias. En caso de que ningn valor coincida se ejecuta el
bloque_de_sentencias correspondiente a la etiqueta default.

En la sentencia switch no es necesario escribir break al final de cada case. Si falta


la sentencia break el cdigo de la siguiente sentencia case se ejecutar hasta que
se encuentre un break. Tal es el caso del siguiente ejemplo, donde se traduce una
nota numrica a su correspondiente nota verbal.

Vemos como cuando la nota es un 7 al no tener un break contina la ejecucin


hasta el siguiente case, el 8, imprimiendo NOTABLE. Lo mismo sucede con el
SOBRESALIENTE.

Todas las etiquetas case deben ser expresiones constantes, es decir, literales o
identificadores declarados como static final e inicializados con un valor constante.
for

Esta sentencia se usa para realizar un bucle a lo largo de un rango de valores


desde el principio hasta el final,

Lo habitual es usar for cuando queremos recorrer todo un rango de valores de una
variable. De esta forma, expresion_inicial indica el punto de partida para hacer
iteraciones, expresion_incremento cmo se va a ir incrementando la variable y
expresion_booleana expresa que condicin debe cumplirse para que el bucle for
acabe.

Al principio el contador i lo inicializamos a 1 pues el uno es un divisor para cualquier


nmero. Iremos incrementando i de uno en uno y calculando el mdulo de la
divisin del numero entre i. La condicin de salida del bucle es cuando el contador
sea menor o igual que la mitad del nmero, pues no habr divisores con un valor
mayor.

El bucle for slo acaba cuando se cumple la condicin de salida o cuando en el


bloque_de_sentencias se encuentra una sentencia break. Sin embargo, debido a
que se utiliza para iterar a lo largo de un rango de valores, romper el bucle es de
mal estilo.

while y do-while

Con la sentencia while se repite el bloque_de_sentencias hasta que la expresin


booleana sea falsa. Un bucle while sera:

El bucle while puede no ejecutarse nunca pues la expresion_booleana puede ser


falsa la primera vez que se evala. Como hay veces que se desea que el bucle se
ejecute al menos una vez, en Java tenemos tambin la instruccin do-while:
aqu la expresin booleana se evala al final por lo que bloque_de_sentencias se
ejecuta al menos una vez.

break y continue

Las sentencias break y continue se utilizan dentro de los bucles y modifican el


flujo natural de los mismos.

La sentencia break provoca la salida inmediata del bucle que estemos ejecutando,
sin realizar la ejecucin del resto de las sentencias. La sentencia break se puede
usar tanto en bucles como en bifurcaciones. El siguiente uso de break en el bucle
while nos garantiza que j no ser nunca negativo, pues en ese caso romper el
bucle y continuar con la ejecucin normal:

La sentencia continue finaliza la iteracin que en ese momento se est


ejecutando, salta al final del cuerpo del mismo y evala la expresin booleana que
controla dicho bucle. Se suele usar un continue para saltarse un elemento del
rango de valores que recorre el bucle. El uso de continue en el siguiente cdigo
evita que se produzca una divisin por cero al calcular el valor de aux.

return
La sentencia return termina la ejecucin de un mtodo y devuelve al invocador el
control de flujo del programa. En el caso de que la funcin devuelva alguna
variable, este valor se deber poner a continuacin del return, return <valor>. El
siguiente ejemplo nos ensea un uso de la sentencia return para determinar si un
nmero es positivo:

EsPositivo.java

Declaracin de una Clase en Java

Vimos como los elementos principales de una clase son sus atributos (datos) y sus
mtodos (cdigo para manipular los datos). Veamos una clase simple, Publicacion
que podramos utilizar para almacenar los datos sobre nuestra coleccin
bibliogrfica:
El nombre de la clase, Publicacion debe ser un identificador vlido en Java y por
convencin, empieza por letra mayscula. Una declaracin de clase crea un nombre
de tipo en Java. De esta forma las referencias a objetos Publicacion se pueden
declarar con un simple:

Las variables de una clase se llaman campos. La clase Publicacion tiene tres
campos, idPublicacion que identifica de forma unvoca cada publicacin, titulo que
es el ttulo de la publicacin y autor que ha firmado la publicacin.

Podramos definir un campo propietario. Con este campo indicaramos el propietario


del libro. Sera til, si slo vamos a almacenar nuestras publicaciones, que el valor
de este campo lo compartan todas los objetos que podamos definir a partir de esta
clase. Calificaramos la declaracin de este campo con la palabra reservada static:

Control de Acceso a Miembros de una Clase en Java

Cuando se defini la clase Publicacion, el campo idPublicacion se pens para que


se generase de forma automtica y de forma coherente. Por tanto cualquier
modificacin externa sobre este campo podra dejar al objeto en un estado
inconsistente, y podramos tener dos objetos con el mismo identificador. Queremos
por tanto que este campo slo se pueda leer y no pueda ser modificado por ningn
otro objeto. Para ello se "oculta" este campo y se proporciona un mtodo pblico
para poder acceder a su valor:
Qu hemos conseguido? Ahora para acceder al valor del
campo idPublicacion ser necesario utilizar el mtodo id. Y la nica forma de
modificar este campo ser por medio de mtodos internos a la clase Publicacion .

Estos mecanismos que regulan el acceso se denominan mtodos de acceso y se


resumen en la siguiente tabla:

Mtodo Descripcin

Un miembro privado es accesible slo para la clase en la que est


private
definido.

La propia clase, las subclases y todas las clases dentro del mismo
protected paquete tienen acceso a los miembros calificados con este mtodo de
acceso.

public Todas las clases tienen acceso a los miembros pblicos de la clase.

Slo las clases del mismo paquete que la clase tienen acceso a los
package
miembros

En los constructores de las clases, se pueden utilizar especificadores de acceso


para indicar que objetos pueden crear ejemplares de su clase: private si ninguna
clase puede crear un objeto de su clase, slo se podr crear por medio de mtodos
pblicos de la clase, protected cuando slo las subclases pueden crear
objetos, public si cualquiera puede crear objetos de esta clase y package-
access cuando slo desde los objetos pertenecientes al mismo paquete se pueden
crear objetos de esa clase.

This, Clases Java

Hay ocasiones en las que resulta til referirse al objeto desde el que se est
ejecutando un mtodo. En esas ocasiones se puede usar la referencia especial de
objeto this, pero cuidado, siempre dentro de un mtodo no esttico.

Esta referencia se suele usar para pasar una referencia al objeto actual como un
parmetro para otros mtodos. La siguiente llamada aadira el objeto a una
relacin de publicaciones prestadas:

Se usa this cuando un atributo est oculto por una declaracin de variable o
parmetro. Por ejemplo:

En el segundo constructor titulo y autor estn ocultos por los parmetros con el
mismo nombre. Para garantizar que accedemos al campo adecuado en lugar de al
parmetro del mtodo, le colocamos el prefijo this
Clases en Java de Utilidad

Las clases de utilidad son estructuras de datos, es decir, estructuras que nos sirven
para la organizacin de los datos. En este apartado veremos las ms comunes que
nos servirn, en las siguientes lecciones, para poder crear estructuras ms
complejas.

Array

Un vector (array) es una manera de agrupar un conjunto de valores bajo un mismo


nombre. La manera de acceder a aquellos es mediante un nmero denominado
ndices. Todos los valores pertenecientes a un vector tendrn el mismo tipo.

La declaracin de un tipo vector en Java puede hacerse de dos maneras:

int vector[];

int[] vector;

En ambos casos obtendramos un vector de enteros. Aunque ambas formas son


correctas, utilizaremos la segunda manera, que separa la declaracin de tipo del
nombre de la variable.

Los vectores en Java se tratan como objetos de una clase predefinida. Los arrays
pueden asignarse a objetos de la clase Object y los mtodos de Object pueden
utilizarse con vectores. Por tanto deben crearse llamando a un constructor con new,
aunque el constructor tenga una sintaxis totalmente distinta a la estudiada hasta
ahora:

int vector[] = new int[30];

Tambin se pueden inicializar con valores entre llaves separados por comas:

Esta declaracin es lo mismo que crear el vector por medio de un constructor e ir


asignndole los valores uno a uno:
Como puede observar, se accede a los elementos de un vector con los corchetes y
un ndice que vara de 0 a la longitud del vector menos uno. Esto tambin es vlido
cuando queremos consultar los valores del vector:

Vectores.java

Se puede acceder al nmero de elementos de un vector con la variable miembro


implcita length. Rescribiendo el programa anterior:

Conviene recordar que los vectores son objetos porque, a la hora de pasar
argumentos a una funcin, se pasarn por referencia.

Un detalle importante es el valor con el que se inicializan lo elementos del vector.


Cuando se crea el vector los elementos se inicializan con el valor por defecto del
tipo correspondiente (cero para valores numricos, carcter nulo para char, false
para boolean, null para String y referencias).
Los argumentos del array de cadenas son los "argumentos de la clase". El programa
imprimira por pantalla estos argumentos. As para realizar una posible ejecucin de
la aplicacin escribiramos en la lnea de comandos:

java imprime hola que tal estas

Obtenindose como resultado:

hola que tal estas

El mtodo main debe ser public, static y void(no devuelve nada)

Mtodos de Clase

Los mtodos de una clase constituyen la lgica de la clase, es decir, contienen el


cdigo que manipula el estado del objeto. Adems constituyen el mecanismo
utilizado para implementar los mensajes entre objetos. Quiere decir, cuando un
objeto se comunica con otro por un mensaje lo hace por medio de la invocacin al
mtodo correspondiente del objeto. Y el mecanismo para invocar un mtodo en
java es por medio de las referencias usando el operador de la siguiente forma:

referencia.metodo (parametros);

Declaracin de los Mtodos

Veamos la forma de declarar un mtodo. La estructura general de una declaracin


tiene dos partes, la declaracin y el cuerpo del mtodo.
La Declaracion_del_metodo proporciona informacin sobre su nombre, la
accesibilidad del mtodo, el nmero de parmetros que recibe, etc.
El Cuerpo_del_metodo contiene el conjunto de sentencias que manipula los datos
de cada objeto.

Sobrecarga de mtodos

Cada mtodo tiene una "firma" por as decirlo, que son su nombre, el tipo y nmero
de sus parmetros. Existe una caracterstica para tener dos mtodos (
constructores) con el mismo nombre. Esta caracterstica se denominasobrecarga
de mtodos.

Hemos estudiado la construccin de distintos constructores para una clase y


hemos puesto como ejemplo el caso de una clase Publicacion. Veamos lo
implementado hasta el momento y cmo los constructores nos dan un ejemplo de
sobrecarga de mtodos:

El compilador resolver que constructor debe ejecutar en cada momento en funcin


del nmero de parmetros y su tipo. Si se llama al constructor sin parmetros se
ejecutar el primer constructor y en caso de hacerlo con dos parmetrosString se
ejecutar el segundo.
Nota: El concepto de sobrecarga de mtodos se puede aplicar siempre
que los parmetros sean diferentes, bien por su tipo, bien por que el nmero
de parmetros de un mtodo o otro es diferente. Hay que tener cuidado con
los tipos: int, byte y short ya que aunque son tipos diferentes, si hacemos la
llamada an mtodo con un nmero entero no sabra a cual de los mtodos
llamar, ya que un entero puede ser considerado de las tres formas. Con
double y float no pasa, porque acordaros que hemos de forzar a que Java
entienda un decimal como float, sino lo entiende como double.

Origen de los Patrones de Diseo

Los patrones surgen al realizar un esfuerzo mental para generalizar la solucin a


problemas diversos y aparentemente independientes. Por tanto, cualquiera puede
encontrar y utilizar sus propios patrones de diseo a travs de la experiencia.
Adems, los patrones son un buen vehculo para transmitir dicha experiencia a otras
personas.Veamos un ejemplo:

Supongamos que hemos terminado una aplicacin de generacin de facturas. Una


parte de nuestro diseo contiene el siguiente diagrama de clases:
En otra ocasin diseamos una aplicacin de gestin de un almacn de repuestos,
donde nos encontramos con este diagrama de clases en una parte del diseo:

Se trata de dos estructuras muy similares, pero no es esto lo que nos sugiere la
existencia de un patrn. Sino el papel que juegan estas estructuras en el diseo. Y,
en efecto, dicho papel se repite en ambos casos:

Factura es algo que se compone de varias Lneas de factura, y adems, las


lneas de factura no tienen sentido sin la existencia de la Factura.

Almacn es algo que se compone de Repuestos, y adems, los repuestos


requieren la existencia de un Almacn.

Hemos dado con un patrn de diseo, se trata de una idea: un objeto que almacena
otros objetos, y stos ltimos no tienen sentido sin su "almacn". Se trata del patrn
"Continente-Contenido":

Pero no es el nico patrn que podemos encontrar:

Lnea de Factura es un objeto que se compone necesariamente de


Concepto, Cantidad y Precio..

Repuesto es un objeto que se compone necesariamente de Pieza, Garanta


y Precio.
Aqu hay otra idea que se puede generalizar: un objeto que se desglosa en otros
objetos. Podramos llamarlo el patrn "Objeto-componente":

Cuando nos enfrentamos a un nuevo problema intentaremos aplicar los patrones


que conozcamos, y esto no es una sugerencia, sino el comportamiento natural de
todo ser humano. Por otra parte, es muy importante tener en cuenta que los
patrones no slo surgen y se aplican a diseos diferentes. Un mismo patrn puede
aplicarse varias veces en un mismo diseo.

El Patrn Proxy

Este patrn consiste en interponer un intermediario (Proxy) entre un objeto y los


dems que lo utilizan. Se diferencia del patrn Adaptador en que el objeto
"adaptado" solamente puede ser manipulado a travs del objeto Proxy.

Se suele utilizar para implementar comportamientos "vagos" (lazy). Por ejemplo, si


tenemos muchos objetos imagen en un documento, se tardara mucho tiempo en
abrir el documento al cargar las imgenes de disco. Para evitarlo podemos sustituir
los objetos imagen por objetos proxyImagen, con el mismo interfaz, pero que
solamente cargan la imagen cuando se va a visualizar.
Debemos insistir en dos aspectos que caracterizan el patrn Proxy:

El objeto Apoderado tiene el mismo interfaz que el objeto "Protegido". Para


facilitar esto se puede derivar el objeto Apoderado de la misma clase padre
que el objeto "Protegido", pero no es absolutamente necesario.

El objeto "Protegido" solamente puede ser manipulado por su


correspondiente Apoderado.

Un ejemplo tpico de aplicacin del patrn proxy es el de un editor de documentos.


El editor podr incluir imgenes y dibujos complejos, y se plantea el problema de
recuperar todos estos costosos objetos cada vez que se abre el documento. La
aplicacin del patrn proxy soluciona el problema definiendo un "representante",
que ocupe su lugar, hasta que sea necesario cargarlos.
El Patrn Bridge (Puente)

Como sabemos, una abstraccin puede tener diferentes implementaciones. El


mecanismo de herencia permite que la implementacin de una abstraccin
evolucione sin modificar significativamente el diseo. Esto es cierto mientras la
abstraccin en s misma (bsicamente, su interfaz) no evolucione. Es decir, no se
puede modificar independientemente una implementacin y la abstraccin a la que
est ligada. Este patrn consigue que esto sea posible.

La parte importante del esquema son las clases Abstraccin y


ClaseObjetoImplementor. Los descendientes de Abstraccin son "evoluciones"
de la abstraccin que pueden o no mantener la implementacin. Al mismo tiempo,
los descendientes de ClaseObjetoImplementador son "evoluciones" de la
implementacin independientes de la evolucin de Abstraccin.

El esquema esttico es el siguiente:


El Patrn Iterador (Iterator)

Este patrn se utiliza en relacin a objetos que almacenan colecciones de otros


objetos, por ejemplo, las listas. El uso de un objeto Iterador permite recorrer los
elementos del agregado independientemente de su organizacin. Si todos los
objetos agregado (listas, rboles, etc) generan un objeto Iterador con el mismo
interfaz resulta muy fcil operar con ellos y se facilitan los cambios de
implementacin.
El objeto agregado puede crear objetos Iterador para la implementacin concreta
de dicho agregado. Diferentes implementaciones, diferentes iteradores. A partir de
entonces, un objeto cliente puede manipular el agregado nicamente a travs del
iterador. Si cambiamos la implementacin del agregado (por ejemplo, la lista pasa
a ser un rbol), el objeto cliente no resulta afectado. Se trata de un patrn muy
comn y ampliamente utilizado. En el caso de las listas, podramos recorrerla sin
exponer su estructura interna, permitiendo as diferentes tipos de listas (listas
normales, con vectores, etc) y diferentes tipos de iteradores:
Conceptos de Programacin

Un proceso es la ejecucin de un programa, es decir, los datos e instrucciones


estn cargados en la memoria principal, ejecutndose o esperando a hacerlo.

Un proceso no tiene porqu estar siempre en ejecucin. Puede pasar por diferentes
estados:

Preparado: Un proceso preparado es un proceso que est preparado para


ejecutarse. Slo le "falta" la CPU

En Ejecucin: Un proceso en ejecucin es un proceso que "tiene" CPU, se


est ejecutando
Bloqueado: Un proceso bloqueado est esperando que ocurra un suceso
antes de poder "usar" la CPU. Dicho suceso suele ser una operacin de
Entrada / Salida: pulsar una tecla, leer de disco... Pero tambin puede ser
que est esperando a que otro proceso haga algo

1. Creacin del proceso. Est preparado para ejecutarse

2. El proceso se ejecuta en CPU

3. El proceso espera a que ocurra un suceso y se bloquea

4. Ocurre el suceso por el que esperaba el proceso. Est preparado para


ejecutarse

5. El proceso "sale" de la CPU

6. Fin de la ejecucin del proceso

No es necesario que se cumplan todos los pasos, por ejemplo, podra ser que un
proceso hiciera los pasos 1-2-6.

Desde el punto de vista del Hardware, dependiendo del nmero de CPU's, un


sistema puede ser:

Sistema Monoprocesador

Sistema Multiprocesador

o Sistema fuertemente acoplado

o Sistema dbilmente acoplado

Como su nombre indica, un sistema monoprocesador es aquel en el que slo hay


una CPU; y como todos habris imaginado, un sistema multiprocesador es el que
tiene varias CPU's. ste ltimo se divide en 2 tipos. Los sistemas fuertemente
aclopados, en los que hay memoria comn y los dbilmente acoplados, en los
que no hay memoria comn. Un ejemplo de los fuertemente acoplados es un PC
con varios procesadores, y otro de los dbilmente acoplados es una red de
ordenadores.
Desde el punto de vista del Software, tambin hay diferentes tipos de sistemas,
atendiendo a cmo se ejecutan los procesos:

Sistema de Multiprogramacin

Sistema de Multiprocesamiento

La Multiprogramacin consiste en que todos los procesos se ejecuten en la misma


CPU. Esto se consigue mediante la intercalacin de la ejecucin de los procesos.

En Multiprocesamiento cada proceso se ejecuta en una CPU. En este caso hay


paralelismo real en la ejecucin de los procesos.

Adems de la programacin imperativa o secuencial y la programacin


concurrente, hay otros paradigmas o enfoques de la programacin.

La programacin imperativa se centra en la transformacin que hay que realizar


para procesar los datos, pasando estos a un segundo plano. En cambio, la
programacin orientada a objetos gira en torno a un nuevo concepto: el objeto.
ste comprende tanto procesos como datos. Aunque pueda parecer ms complejo,
este tipo de programacin se asemeja a la forma que tiene el ser humano de ver el
mundo, frente a la programacin imperativa que est orientada a la mquina. Para
entenderlo mejor, un objeto es "una cosa con lmites definidos", como por ejemplo,
una pelota, que tiene caractersticas (datos como tamao o color), asociadas a unas
operaciones (procesos como botar o lanzar) aplicables sobre el objeto. Otras
operaciones no son vlidas. No puedes beberte una pelota... aunque el mundo es
muy raro y hay de todo. Otra caracterstica importante de la programacin orientada
a objetos es la herencia. Este mecanismo se utiliza para estructurar el programa en
forma jerrquica.

La programacin declarativa es otra visin de la programacin, en la que no se


describe cmo obtener los resultados, sino qu es lo que debemos obtener. Se
divide en 2 tipos, la programacin lgica y la programacin funcional.

Hace unos aos, cuando todava no existan los entornos grficos, ni el hardware
que los soportara, todo se haca en un entorno de consola. Al abrir una ventana
de msdos en windows, o una consola de comandos en unix... entran escalofros
slo de pensar que las cosas eran antes "tan fras". Eso si, no se colgaban de vez
en cuando sin saber porqu. Primero Apple copiando de Xerox, y despus Microsoft
copiando de Apple, crearon los entornos visuales, con lo que vino la revolucin
multimedia y se dispar el negocio de la informtica. Dichos entornos visuales
constan de una interfaz grfica "ms amigable", adems de ofrecernos un amplio
abanico de posibilidades. No hay que creer que los entornos multitarea aparecieron
con lo entornos visuales en los que se puede "tener abiertas muchas ventanitas".
UNIX siempre ha sido multitarea, desde sus inicios en modo consola.

Ahora vamos a hacer un pequeo repaso de las arquitecturas existentes dentro del
mundo de la informtica. Cuando en los aos 60 se empezaron a comercializar los
ordenadores, disponibles slo para empresas debido a su alto coste, se utilizaban
sistemas centralizados o mainframes, que tenan diferentes consolas para dar
acceso a mltiples usuarios. Todo el trabajo lo realizaba el mainframe. En los aos
80 surgi el PC, con un precio ms asequible. Nacieron los sistemas en red que
permiten interconectar ordenadores de diferentes caractersticas compartiendo
recursos. El siguiente paso fueron los sistemas distribuidos en los que hay
diferentes estaciones interconectadas, aunque el usuario no necesita conocer su
ubicacin, como sucede en los sistemas en red. El acceso a los recursos es
transparente, es decir, se accede a los recursos como si fueran locales, aunque no
lo sean. Tambin existen sistemas paralelos, que constan de varios procesadores
operando conjuntamente.

Una vez aclarados ciertos conceptos, es hora de empezar con el curso de


Metodologa de la Programacin.
Palabras Reservadas en Java

En este captulo tenis un listado de las palabras reservadas de Java orientado a


objetos. Las palabras reservadas son identificadores, pero como su nombre indica,
estas palabras estn reservadas, y no se pueden usar como identificadores de
usuario.

abstract continue for new switch

assert default goto package synchronized

boolean do if private this

break double implements protected throw

byte else import public throws

case enum instanceof return transient

catch extends int short try

char final interface static void

class finally long strictfp volatile

const float native super while

Java y Aplicaciones Web

Introduccin a las Aplicaciones Web

Cuando un cliente Web, como un navegador, comunica con una aplicacin J2EE, lo
hace a travs de objetos del lado del servidor llamados componentes Web. Hay
dos tipos de componentes Web: Java Servlets y pginas JavaServer Pages
(JSP). Los servlets son las clases Java que procesan dinmicamente las
solicitudes y construyen las respuestas. Las pginas JSP son documentos basados
en texto que ejecutan Servlets pero permiten una forma ms natural de crear
contenido esttico.
Aunque los Servlets y las pginas JSP pueden usarse indistintamente, cada uno
tiene sus propios puntos fuertes:

Los servlets son mejores para manejar las funciones de control de una
aplicacin, como despachar solicitudes, y manejar datos que no sean texto.

Las pginas JSP son ms apropiadas para generar marcas basadas en texto
como HTML, SVG, WML, y XML.

Este capitulo describe los procedimientos de empaquetamiento, configuracin, y


despliegue de componentes Web, en Tomcat, nuestro servidor por defecto y en los
servidores ms comnmente utilizados en el mundo empresarial.

Muchas caractersticas de la tecnologa JSP estn determinadas por la tecnologa


Java Servlet, por eso deberas familiarizarte con este material aunque no hayas
pensado en escribir servlets.

La porcin del lado del servidor de un cliente Web consta de componentes Web,
ficheros de recursos estticos como imgenes, y clases y libreras de ayuda. La
plataforma J2EE proporciona muchos servicios de soporte que mejoran las
capacidades de los componentes Web y hacen ms fcil su despliegue. Sin
embargo, como debe tener en cuenta estos servicios, el proceso de creacin y
ejecucin de un cliente Web es diferente de las tradicionales clases Java
independientes.

Los componentes Web se ejecutan dentro dentro un entorno llamado Contenedor


Web. El contenedor Web proporciona servicios como el despacho de solicitudes, la
seguridad, la concurrencia y el control del ciclo de vida. Tambin ofrece a los
componentes Web acceso a los APIs de la plataforma J2EE como el sistema de
nombres, las transacciones y el envo recepcin de e-mail.

Antes de poder ser ejecutado, un cliente Web debe ser empaquetado en un archivo
de aplicacin Web (WAR), que es un JAR similar al paquete usado para las libreras
de clases Java, y debe ser instalado (o desplegado) en un contenedor Web.
Ciertos aspectos del comportamiento de un cliente Web se pueden configurar
durante su despliegue. La informacin de configuracin se mantiene en un fichero
de texto en formato XML llamado "Descriptor de Despliegue de una Aplicacin
Web" (cuyo nombre real es web.xml). Cuando se crean componentes y clientes
Web usando la utilidad deploytool del J2EE SDK, automticamente genera o
actualiza el descriptor de despliegue basndose en los datos que se introducen en
los "magos" (wizards) e inspectores de deploytool. Tambin podemos crear
manualmente un descriptor de despliegue segn el esquema descrito en la
Especificacin Java Servlet.

El proceso de crear, desplegar, y ejecutar un cliente Web se puede resumir en los


siguientes pasos:

1. Desarrollar el cdigo de los componentes Web (posiblemente incluyendo un


descriptor de despliegue).

2. Empaquetar los componentes del cliente Web junto cualquier recurso


esttico (por ejemplo, imgenes) y clases de ayuda referenciadas por los
componentes

3. Desplegar la aplicacin.

4. Acceder a un URL que referencie al cliente web.

Archivos de Aplicacin Web

Los clientes Web estn empaquetados en archivos de aplicacin Web. Adems de


los componentes Web, un archivo de aplicacin Web normalmente contiene otros
ficheros, incluyendo los siguientes:

Clases de utilidad del lado del cliente (beans de bases de datos, tarjetas de
compra, etc.). Frecuentemente estas clases cumplen la especificacin de la
arquitectura de componentes JavaBeans.

Contenido Web esttico (HTML, ficheros de imgenes, de sonido, etc.).

Clases del lado del cliente (applets y clases de utilidad).


Los componentes Web y los ficheros de contenido Web esttico se llaman recursos
Web.

Una aplicacin Web se puede ejecutar desde un fichero WAR o desde un directorio
de distribucin desempaquetada en el mismo formato que un WAR.

Estructura de un Directorio WAR

Un fichero WAR tiene una estructura de directorio especfica. El directorio de ms


alto nivel de un fichero WAR o de una distribucin de una aplicacin sin empaquetar,
es la raz del documento de la aplicacin. La raz del documento es donde se
almacenan las pginas JSP, las clases y archivos del lado del cliente, y los recursos
Web estticos.

La raz del documento contiene un subdirectorio llamando WEB-INF, que contiene


los siguientes ficheros y directorios:

web.xml: El descriptor de despliegue de la aplicacin Web.

Ficheros de libreras de etiquetas del descriptor.

classes: Un directorio que contiene las clases del lado del servidor: servlets, clases
de utilidad, y componentes JavaBeans.

lib: Un directorio que contiene los archivos JAR o libreras (libreras de etiquetas y
libreras de clases de utilidad llamadas por las clases del lado del servidor).

Tambin podemos crear subdirectorios especficos de la aplicacin (es decir,


directorios de package) en la raz del documento o en el directorio WEB-
INF/classes.

Crear un Fichero WAR

Cuando se aade el primer componente Web a una aplicacin J2EE, le herramienta


deploytool crea automticamente un nuevo fichero WAR para contener el
componente.

Tambin podemos crear manualmente un fichero WAR de tres formas diferentes:


Con la herramienta packager distribuida con el J2EE SDK.

Con la tarea war de la herramienta portable ant.

Con la herramienta JAR distribuida con el J2SE SDK. Si se ha distribuido el


directorio de desarrollo de la aplicacin en la estructura requerida por el formato
WAR, se puede crear un fichero de aplicacin Web en el formato requerido.
Simplemente ejecutamos el siguiente comando en el directorio de ms alto nivel de
la aplicacin:

jar cvf archiveName.war .

Servlet en Java

Qu son los Servlets Java?

Los Servlets son las respuesta de la tecnologa Java a la programacin CGI. Son
programas que se ejecutan en un servidor Web y construyen pginas Web.
Construir pginas Web al vuelo es til (y comnmente usado) por un nmero de
razones:

La pgina Web est basada en datos enviados por el usuario. Por ejemplo, las
pginas de resultados de los motores de bsqueda se generan de esta forma, y los
programas que procesan pedidos desde sitios de comercio electrnico tambin.

Los datos cambian frecuentemente. Por ejemplo, un informe sobre el tiempo o


pginas de cabeceras de noticias podran construir la pgina dinmicamente, quizs
devolviendo una pgina previamente construida y luego actualizndola.

Las pginas Web que usan informacin desde bases de datos corporativas u
otras fuentes. Por ejemplo, usaramos esto para hacer una pgina Web en una
tienda on-line que liste los precios actuales y el nmero de artculos en stock.
Cules son las Ventajas de los Servlets sobre el CGI Tradicional?

Los Servlets Java son ms eficientes, fciles de usar, ms poderosos, ms


portables, y ms baratos que el CGI tradicional y otras muchas tecnologas del tipo
CGI. (y lo que es ms importante, los desarrolladores de servlets cobran ms que
los programadores de Perl :-).

Eficiencia. Con CGI tradicional, se arranca un nuevo proceso para cada solicitud
HTTP. Si el programa CGI hace una operacin relativamente rpida, la sobrecarga
del proceso de arrancada puede dominar el tiempo de ejecucin. Con los Servlets,
la mquina Virtual Java permanece arrancada, y cada peticin es manejada por un
thread Java de peso ligero, no un pesado proceso del sistema operativo. De forma
similar, en CGI tradicional, si hay N peticiones simultneas para el mismo programa
CGI, el cdigo de este problema se cargar N veces en memoria. Sin embargo, con
los Servlets, hay N threads pero slo una copia de la clase Servlet. Los Servelts
tambin tienen ms alternativas que los programas normales CGI para
optimizaciones como los cachs de clculos previos, mantener abiertas las
conexiones de bases de datos, etc.

Conveniencia. Hey, tu ya sabes Java. Por qu aprender Perl? Junto con la


conveniencia de poder utilizar un lenguaje familiar, los Servlets tienen una gran
infraestructura para anlisis automtico y decodificacin de datos de formularios
HTML, leer y seleccionar cabeceras HTTP, manejar cookies, seguimiento de
sesiones, y muchas otras utilidades.

Potencia. Los Servlets Java nos permiten fcilmente hacer muchas cosas que son
difciles o imposibles con CGI normal. Por algo, los servlets pueden hablar
directamente con el servidor Web. Esto simplifica las operaciones que se necesitan
para buscar imgenes y otros datos almacenados en situaciones estndares. Los
Servlets tambin pueden compartir los datos entre ellos, haciendo las cosas tiles
como almacenes de conexiones a bases de datos fciles de implementar. Tambin
pueden mantener informacin de solicitud en solicitud, simplificando cosas como
seguimiento de sesin y el cach de clculos anteriores.
Portable. Los Servlets estn escritos en Java y siguen un API bien estandarizado.
Consecuentemente, los servlets escritos, digamos en el servidor I-Planet Enterprise,
se pueden ejecutar sin modificarse en Apache, Microsoft IIS, o WebStar. Los
Servlets estn soportados directamente o mediante plug-in en la mayora de los
servidores Web.

Barato. Hay un nmero de servidores Web gratuitos o muy baratos que son buenos
para el uso "personal" o el uso en sitios Web de bajo nivel. Sin embargo, con la
excepcin de Apache, que es gratuito, la mayora de los servidores Web
comerciales son relativamente caros. Una vez que tengamos un servidor Web, no
importa el coste del servidor, aadirle soporte para Servlets (si no viene
preconfigurado para soportarlos) es gratuito o muy barato.

Java Server Pages JSP

Qu es JSP?

Java Server Pages (JSP) es una tecnologa que nos permite mezclar HTML esttico
con HTML generado dinmicamente. Muchas pginas Web que estn construidas
con programas CGI son casi estticas, con la parte dinmica limitada a muy pocas
localizaciones. Pero muchas variaciones CGI, incluyendo los servlets, hacen que
generemos la pgina completa mediante nuestro programa, incluso aunque la
mayora de ella sea siempre lo mismo. JSP nos permite crear dos partes de forma
separada. Aqu tenemos un ejemplo:
Cules son las Ventajas de JSP?

Contra Active Server Pages (ASP). ASP es una tecnologa similar de


Microsoft. Las ventajas de JSP estn duplicadas. Primero, la parte dinmica
est escrita en Java, no en Visual Basic, otro lenguaje especfico de MS, por
eso es mucho ms poderosa y fcil de usar. Segundo, es portable a otros
sistemas operativos y servidores Web.

Contra los Servlets. JSP no nos da nada que no pudiramos en principio


hacer con un servlet. Pero es mucho ms conveniente escribir (y modificar!)
HTML normal que tener que hacer un billn de sentencias println que generen
HTML. Adems, separando el formato del contenido podemos poner
diferentes personas en diferentes tareas: nuestros expertos en diseo de
pginas Web pueden construir el HTML, dejando espacio para que nuestros
programadores de servlets inserten el contenido dinmico.

Contra Server-Side Includes (SSI). SSI es una tecnologa ampliamente


soportada que incluye piezas definidas externamente dentro de una pgina
Web esttica. JSP es mejor porque nos permite usar servlets en vez de un
programa separado para generar las partes dinmicas. Adems, SSI,
realmente est diseado para inclusiones sencillas, no para programas
"reales" que usen formularios de datos, hagan conexiones a bases de datos,
etc.

Contra JavaScript. JavaScript puede general HTML dinmicamente en el


cliente. Este una capacidad til, pero slo maneja situaciones donde la
informacin dinmica est basada en el entorno del cliente. Con la excepcin
de las cookies, el HTTP y el envi de formularios no estn disponibles con
JavaScript. Y, como se ejecuta en el cliente, JavaScript no puede acceder a
los recursos en el lado del servidor, como bases de datos, catlogos,
informacin de precios, etc.

JavaServer Pages 1.0


Las JavaServer Pages (JSP) nos permiten separar la parte dinmica de nuestras
pginas Web del HTML esttico. Simplemente escribimos el HTML regular de la
forma normal, usando cualquier herramienta de construccin de pginas Web que
usemos normalmente. Encerramos el cdigo de las partes dinmicas en unas
etiquetas especiales, la mayora de las cuales empiezan con "<%" y terminan con
"%>". Por ejemplo, aqu tenemos una seccin de una pgina JSP que resulta en
algo as como "Gracias por medir Un Libro" para una URL como
http://host/OrderConfirmation.jsp?title=Un+Libro:

Normalmente daremos a nuestro fichero una extensin .jsp, y normalmente lo


instalaremos en el mismo sitio que una pgina Web normal (en el directorio raz una
aplicacin web o fichero WAR). Aunque lo que escribamos frecuentemente se
parezca a un fichero HTML normal en vez de a un servlet, detrs de la escena, la
pgina JSP se convierte en un servlet normal, donde el HTML esttico simplemente
se imprime en el stream de salida estndar asociado con el mtodo service del
servlet. Esto normalmente slo se hace la primera vez que se solicita la pgina, y
los nosotros podemos solicitar la pgina nosotros mismos cuando la instalamos si
queremos estar seguros de que el primer usuario real no tenga un retardo
momentneo cuando la pgina JSP sea traducida a un servlet y el servlet sea
compilado y cargado. Observa tambin, que muchos servidores Web nos permiten
definir alias para que una URL que parece apuntar a un fichero HTML realmente
apunte a un servlet o a una pgina JSP.

Adems del HTML normal, hay tres tipos de construcciones JSP que embeberemos
en una pgina JSP: elementos de script, directivas y acciones. Los elementos de
script nos permiten especificar cdigo Java que se convertir en parte del servlet
resultante, las directivas nos permiten controlar la estructura general del servlet, y
las acciones nos permiten especificar componentes que deberan ser usados, y de
otro modo controlar el comportamiento del motor JSP. Para simplificar los elementos
de script, tenemos acceso a un nmero de variables predefinidas como request del
fragmento de cdigo anterior.

Plantilla de Texto: HTML esttico

En muchos casos, un gran porcentaje de nuestras pginas JSP consistir en HTML


esttico, conocido como plantilla de texto. En casi todos lo aspectos, este HTML
se parece al HTML normal, sigue la mismas reglas de sintaxis, y simplemente "pasa
a travs" del cliente por el servlet creado para manejar la pgina. No slo el aspecto
del HTML es normal, puede ser creado con cualquier herramienta que usemos para
generar pginas Web. Por ejemplo, yo he usado Homesite de Allaire, para la
mayora de las pginas de este tutorial.

La nica excepcin a la regla de que "la plantilla de texto se pasa tal y como es" es
que, si queremos tener "<%" en la salida, necesitamos poner "<\%" en la plantilla de
texto.

JavaBeans Enterprise

La especificacin Enterprise JavaBeans define una arquitectura para un sistema


de objetos transaccionales distribuidos basado en componentes. La especificacin
obliga a un modelo de programacin; es decir, convenciones o protocolos y un
conjunto de clases e interfaces que componen el API EJB. El modelo de
programacin EJB proporciona a los desarrolladores y a los vendedores de
servidores EJB con un conjunto de contratos que definen una plataforma comn
para el desarrollo. El objetivo de estos contratos es asegurarse la portabilidad entre
vendedores mientras soporta un rico conjunto de funcionalidades.

El Contenedor EJB

Los beans Enterprise son componentes software que se ejecutan en un entorno


especial llamado contenedor EJB. El contenedor hospeda y maneja un bean
enterprise de la misma forma en un servidor de aplicaciones Java hospeda un
servlet o un servidor HTML hospeda una applet Java. Un bean enterprise no puede
funcionar fuera de un contenedor EJB. El contenedor EJB maneja todos los
aspectos de un bean enterprise en tiempo de ejecucin incluyendo los accesos
remotos al bean, la seguridad, la persistencia, las transacciones, la concurrencia y
el acceso y almacenamiento de recursos.

El contenedor asla el bean enterprise del acceso directo desde las aplicaciones
clientes. Cuando una aplicacin cliente llama a un mtodo remoto de un bean
enterprise, el contenedor primero intercepta la llamada para asegurarse de que la
persistencia, las transacciones, y la seguridad se aplican apropiadamente para cada
operacin que realice el cliente sobre el bean. El contenedor maneja todo esto
automticamente por el bean, para que el desarrollador de beans no tenga que
escribir este tipo de lgica en el propio cdigo del bean. El desarrollador de beans
enterprise se puede enfocar en la encapsulacin de las reglas de negocio, mientras
el contenedor tiene cuidado de todo lo dems.

Los contenedores manejaran muchos bean simultneamente de la misma forma


que Tomcat maneja muchos servlets. Para reducir el consumo de memoria y de
procesador, los contenedores almacenan recursos y manejan el ciclo de vida de
todos los beans muy cuidadosamente. Cuando un bean no est siendo utilizado, un
contenedor lo situar en un almacn para que sea reutilizado por otros clientes, o
posiblemente lo sacar de la memoria y slo lo traer de vuelta si es necesario.
Como las aplicaciones clientes no tienen acceso directo al bean--el contenedor trata
entre el cliente y el bean-- la aplicacin cliente est completamente despreocupada
de las actividades de control de recurso de los contenedores. Un bean que no est
en uso, por ejemplo, podra ser sacado de la memoria del servidor, aunque su
referencia remota en el cliente permanezca intacta. Cuando el cliente llama una
mtodo del interface remoto, el contenedor simplemente re-encarna el bean para
servir la peticin. Las aplicaciones cliente se despreocupan de todo el proceso.

Un bean enterprise depende del contenedor para todo lo que necesita. Si un bean
enterprise necesita acceder a una conexin JDBC o a otro bean enterprise, lo hace
a travs del contenedor; si un bean enterprise necesita acceder a la identidad de su
llamador, obtener una referencia a s mismo, o acceder a las propiedades lo hace a
travs del contenedor. El bean enterprise interacta con su contenedor a travs de
tres mecanismos: mtodos de retrollamadas, el interface EJBContext,y el Interface
de Nombres y Directorio Java (JNDI).

Mtodos de retrollamada (callbacks)

Todo bean implementa un subtipo del interface EnterpriseBean que define varios
mtodos, llamados mtodos de retrollamada. Cada uno de estos mtodos alerta
al bean SOBRE un evento diferente en su ciclo de vida y el contenedor llamar a
estos mtodos para notificar al bean cuando va a ser activado, cuando va a persistir
su estado en la base de datos, finalizar una transaccin, eliminar el bean de la
memoria, etc. Los mtodos de retrollamada le dan al bean una oportunidad para
hacer algn trabajo casero inmediatamente antes o despus de algn evento.

EJBContext

Todo bean obtiene un objeto EJBContext, que es una referencia directa a su


contenedor. El interface EJBContext proporciona mtodos para interactuar
directamente con el contenedor para que el bean pueda solicitar informacin sobre
su estado como la identidad de sus clientes, el estado de una transaccin, u obtener
referencias remotas a s mismo.

Java Naming and Directory Interface (JNDI)

Es una extensin estndar de la plataforma Java para acceder a sistemas de


nombres como LDAP, NetWare, sistemas de ficheros, etc. Todo bean tiene acceso
automtico a un sistema de nombres especial llamado Environment Naming
Context (ENC). El ENC es manejado por el contenedor y es accedido por los beans
usando JNDI. El JNDI ENC permite a un bean acceder a recursos como conexiones
JDBC, otros beans enterprise, y a propiedades especficas de ese bean.

La especificacin EJB define un contrato bean-contenedor, que incluye los


mecanismos (callbacks, EJBContext, JNDI ENC) descritos arriba, as como un
estricto conjunto de reglas que describen cmo se comportan en tiempo de
ejecucin los beans enterprise y sus contenedores, cmo se chequean los accesos
de seguridad, cmo se manejan las transacciones, y cmo se aplica la persistencia,
etc. Este contrato est diseado para hacer que los beans enterprise sean portables
entre contenedores EJB.

La portabilidad es el valor principal que ponen los EJB encima de la mesa. La


portabilidad asegura que un bean desarrollado para un contenedor podr migrarse
a otro si ste ltimo ofrece ms rendimiento, ms caractersticas o un menor coste.

Adems de la portabilidad, la simplicidad de los modelos de programacin EJB los


hace muy valiosos. Como el contenedor realiza todas la tareas complejas como la
seguridad, las transacciones, las persistencia, la concurrencia y el control de
recursos, el desarrollador del bean est liberado para enfocar su atencin en la
reglas de negocio y en un modelo de programacin muy sencillo.

Para crear un componente EJB del lado del servidor, un desarrollador de beans
proporciona dos interfaces que definen los mtodos de negocio, adems de la
implementacin real de la clase bean. Entonces el cliente usa un interface pblico
del bean para crear, manipular o eliminar bean del servidor EJB. La implementacin
de la clase, para ser llamada la clase bean, es ejemplarizada en tiempo de ejecucin
y se convierte en un objeto distribuido.

Los beans enterprise viven en un contenedor EJB y son accedidos por aplicaciones
clientes sobre la red a travs de sus interfaces remote y home. Estos interfaces
exponen las capacidades del bean y proporcionan todos los mtodos necesarios
para crear, actualizar, interactuar y borrar el bean. Un bean es un componente del
lado del servidor que representa conceptos de negocio como un Cliente o un Cajero
de Hotel.
Los interfaces Remote y Home

Los interfaces remote y home representan el bean, pero el contenedor asla los
beans de los acceso directos desde las aplicaciones cliente. Cada vez que se
solicita, se crea o se borra un bean, el contenedor maneja todo el proceso.

El interface home representa los mtodos del ciclo de vida del componente (create,
destroy, find) mientras que el interface remote representa los mtodos de negocio
del bean. Los interfaces remote y home extienden los interfacesjavax.ejb.EJBObject
y javax.ejb.EJBHome respectivamente. Estos tipos de interfaces EJB definen un
conjunto de mtodos de utilidad estndares y proporcionan tipos bsicos comunes
para todos los interfaces remote y home.
Los clientes usan el interface home para obtener referencias al interface remote del
bean. El interface remote define los mtodos de negocios como mtodos de acceso
o mtodo mutadores para cambiar el nombre de un cliente, o mtodo de negocio
que realizan tareas como usar el bean CajeroDeHotel para reservar una habitacin
en un hotel. Aqu tenemos un ejemplo de cmo un bean Cliente podra ser accedido
desde una aplicacin cliente. En este caso el interface home es del tipo
ClienteHome y el interface remoto es el tipo Cliente:

El interface remoto define los mtodos de negocio de un bean; los mtodos que son
especficos para el concepto de negocio que representa. Los interfaces remotos son
subclases de javax.ejb.EJBObject que es una subclase del interface
java.rmi.Remote. La importancia de la herencia de los interfaces remotos se
explicar ms tarde. Por ahora nos enfocaremos en los mtodos de negocio y sus
significados. Aqu tenemos una definicin del interface remoto para un bean Cliente:
El interface remoto define los mtodos para acceder y mtodos para leer y actualizar
informacin sobre un concepto del negocio. Este un tpico tipo de bean llamado
bean de entidad, que representa un objeto de negocio persistente; objetos de
negocio cuyos datos se almacenan en una base de datos. Los beans de entidad
representan datos del negocio en la base de datos y aaden comportamiento
especfico para esos datos.

Mtodos de Negocio

Los mtodos de negocio tambin pueden representar tareas que un bean realiza.
Aunque un bean de entidad normalmente tiene mtodos orientados a tareas, las
tareas son ms tpicas de un tipo de bean llamado bean de sesin. Los beans de
sesin no representan datos como los beans de entidad. Representan procesos del
negocio o agentes que realizan un servicio, como hacer una reserva en un Hotel.
Aqu tenemos la definicin del interface remoto de un bean CajeroDeHotel, que es
un tipo de bean de sesin:

Los mtodos de negocio definidos en el interface remoto de CajeroDeHotel


representan proceso en vez de simples mtodos de acceso. El bean CajeroDeHotel
acta como un agente en el sentido en que realiza tareas por cuenta del usuario,
pero l mismo no persiste en la base de datos. No necesitamos informacin sobre
el CajeroDeHotel, slo necesitamos que haga las tareas que queremos que haga.
Este es el comportamiento tpico de un bean de sesin.

Hay dos tipos bsicos de beans enterprise: beans de entidad, que representan
datos en una base de datos, y beans de sesin, que representan procesos o actan
como agentes que realizan tareas. Cuando construyamos aplicaciones EJB
crearemos muchos beans enterprise, cada uno representando un concepto de
negocio diferente. Cada concepto de negocio se manifestar como un bean de
entidad o como un bean de sesin. Elegiremos el tipo de bean adecuado
dependiendo de lo que queramos que haga.

Beans de Entidad

Por cada interface remoto hay una clase que lo implementa; un objeto de negocio
que realmente implementa los mtodos de negocio definidos en el interface remoto.
Esta es la clase bean; el elemento clave del bean. Aqu tenemos una definicin
parcial de la clase del bean Cliente:
ClienteBean es la clase de implementacin. Contiene los datos y proporciona los
mtodos de acceso y otros mtodos de negocio. Como es un bean de entidad, el
ClienteBean proporciona una vista de los datos del cliente. En lugar de escribir
lgica de acceso a la base de datos en la aplicacin, la aplicacin simplemente
puede usar el interface remoto del bean Cliente para acceder a los datos del cliente.
Los beans de entidad implementan el tipo javax.ejb.EntityBean que se define como
un conjunto de mtodo de notificacin que el bean usa para interactuar con su
contenedor. Estos mtodos de notificacin se examinarn ms adelante en este
curso:

Beans de Sesin

El bean CajeroDeHotel es un bean de sesin, que es similar en muchos aspectos a


un bean de entidad. Los beans de sesin representan un conjunto de proceso o
tareas, que son realizadas por cuenta de la aplicacin cliente. Los beans de sesin
podran usar otros beans para usar tareas o acceder directamente a bases de datos.
Un poco ms de cdigo muestra un bean de sesin haciendo ambas cosas. El
mtodo reservaHabitacon() usa otros beans para realizar una tareas, mientras que
HabitacionDisponible() usa JDBC para acceder directamente a la base de datos.
Podras observar que las clases bean definidas arriba no implementan interfaces
home o remote. EJB no requiere que la clase bean implemente estos interfaces; de
hecho est desaconsejado porque el tipo base de los interface remote y home
(EJBObject y EJBHome) definen muchos otros mtodos que son implementados
automticamente por el contenedor. Sin embargo, la clase bean debe proporcionar
implementaciones para todos los mtodos de negocio definidos en el interface
remoto.

Mtodos del Ciclo de Vida

Adems de un interface remoto, todos los beans tienen un interface Home. El


interface Home proporciona los mtodos de ciclo de vida para crear, destruir y
localizar beans. Estos comportamientos de ciclo de vida estn separados del
interface remoto porque representan comportamientos que no son especficos de
un slo ejemplar del bean. Aqu tenemos la definicin del interface home del bean
Cliente. Observa que extiende el interface javax.ejb.EJBHome que a su vez
extiende el interface java.rmi.Remote:
El mtodo create() se usa para crear una nueva entidad. Esto resultar en un nuevo
registro de la base de datos. Un home podra tener muchos mtodos create(). El
nmero y tipo de datos de los argumentos de cada mtodo create() se dejan para
el desarrollador del bean, pero el tipo de retorno debe ser el tipo de dato del interface
remoto. En este caso, llamar a create() sobre el interface ClienteHome devolver un
ejemplar de Customer. Los mtodos findByPrimaryKey() y findByZipCode() se usan
para localizar un ejemplar especfico del bean Cliente. De nuevo, podramos definir
tantos mtodos de bsqueda como sean necesarios.

De vuelta a los Interface Remote y Home

Los interfaces remote y home los usan las aplicaciones para acceder a beans
enterprise en tiempo de ejecucin. El interface home permite a la aplicacin crear o
localizar un bean, mientras que el interface remote permite a la aplicacin llamara a
los mtodos de negocio del bean:
El interface javax.ejb.EJBHome tambin define otros mtodos que hereda
automticamente el bean ClienteBean, incluyendo un conjunto de mtodos
remove() que permiten a la aplicacin destruir ejemplares del bean.

Los interfaces remote y home son tipos de interfaces Java RMI Remote. El Interface
java.rmi.Remote es utilizado por objetos distribuidos para representar el bean en un
espacio de direccionamiento diferente (proceso o mquina). Un bean enterprise es
un objeto distribuido. Lo que significa que la clase bean es ejemplarizada y vive en
el contenedor pero puede ser accedida por aplicaciones que viven en otros espacios
de direccionamiento.

Para hacer que un ejemplar de un objeto de un espacio de direccionamiento est


disponible en otro espacio se requiere un pequeo truco que implica sockets de red.
Para hacer que el truco funcione, envolvemos el ejemplar en un objeto espacial
llamado un esqueleto que es una conexin de red a otro objeto especial llamado
stub. El stub implementa el interface remoto por lo que parece un objeto de
negocio. Pero el stub no contiene lgica de negocio; contiene una conexin de red
socket al esqueleto. Cada vez que se llama a un mtodo de negocio sobre el
interface remoto del stub, ste enva un mensaje de red al esqueleto diciendo el
mtodo que fue invocado. Cuando el esqueleto recibe un mensaje de red desde el
stub, identifica el mtodo invocado y los argumentos, y luego llama al mtodo
correspondiente del ejemplar real. El ejemplar ejecuta el mtodo de negocios y
devuelve el resultado al esqueleto, que lo enva al stub.

El stub devuelve el resultado a la aplicacin que invoc su mtodo del interface


remoto. Desde la perspectiva la aplicacin que usa el stub, parece como si el stub
no funcionar localmente. Realmente, el stub es slo un objeto volcado en la red
que enva peticiones a travs de la red al esqueleto, que a su vez llama al mtodo
del ejemplar real. El ejemplar hace todo el trabajo, el stub y el esqueleto slo pasan
la identidad del mtodo y los argumentos a travs de la red.

En EJB, el esqueleto para los interfaces home y remote estn implementados por
el contenedor, no por la clase bean. Esto es para asegurar que todo mtodo llamado
sobre estos tipos de referencia por una aplicacin cliente primero es manejado por
el contenedor y luego delegado al ejemplar del bean. El contenedor debe interceptar
esas peticiones hacia el bean para poder aplicar automticamente la persistencia
(beans de entidad), las transacciones, y el control de acceso.

Los protocolos de objetos distribuidos definen el formato de los mensajes de red


enviados entre espacios de direcciones. Los protocolos de objetos distribuidos son
bastantes complicados, pero afortunadamente no los vemos porque son manejados
automticamente. La mayora de los servidores EJB soportan Java Remote
Method Protocol (JRMP) o Internet Inter-ORB Protocol (IIOP) de CORBA. El
programador del bean y el de la aplicacin slo ven la clase bean y su interface
remoto, los detalles de la comunicacin en red permanecen ocultos.

Con respecto al API EJB, el programador no debe preocuparse de si el EJB usa


JRMP o IIOP--el API es el mismo. La especificacin EJB requiere que usemos una
versin especializada del API Java RMI, cuando trabajamos con un bean de forma
remota. Java RMI es un API para acceder a objetos distribuidos y de alguna forma
es un protocolo agnstico--de la misma forma que JDBC es una base de datos
agnstica. Por eso, un servidor EJB, puede soportar JRMP o IIOP, pero el
desarrollador del bean y de la aplicacin siempre usa el mismo API Java RMI. Para
que el servidor EJB tenga la opcin de soportar IIOP, se ha desarrollado una versin
especializada de Java RMI, llamada Java RMI-IIOP. Java RMIO-IIOP usa IIOP
como protocolo y el API Java RMI. Los servidores EJB no tienen que usar IIOP.
pero tienen respetar las restricciones Java RMI-IIOP, porque EJB 1.1 usa las
convenciones Java RMI-IIOP especializado, pero el protocolo subyacente puede ser
cualquiera.

Estructura de Datos en Java

Pilas en Java

La pila es una secuencia de elementos del mismo tipo en la que el acceso a la


misma se realiza por un nico lugar denominado cima:

Vemos como el acceso a los elementos de la pila se realiza siempre sobre un nico
extremo. Las operaciones que caracterizan la pila son las de introducir un nuevo
elemento sobre la cima (push) y la de extraer el elemento situado en la cima (pop).
Una forma de ver esta estructura de datos es como una pila de libros en la que slo
se puede coger el libro que est en la cima o apilar ms libros sobre la misma, pero
los libros que sostienen la pila no son accesibles pues de otro modo todo se
desmoronara.

El interfaz en Java que define esta clase de objetos y sus mtodos son los
siguientes:

Pila.java

Veremos ahora dos implementaciones de pila, mediante arrays y listas enlazadas.


Implementacin de pilas mediante arrays

Implementemos una Pila mediante un vector

PilaArray.java

La dimensin de la pila se establece al crear la pila, mediante el constructor. En el


siguiente ejemplo creamos una pila con capacidad para 125 elementos

PilaArray pila_de_ejemplo = new PilaArray(125);


Si hubieramos usado el constructor por defecto se hubiera establecido el tamao de
la pila en 1000 elementos.

Definimos un campo privado top para conocer en todo momento cul es la cima de
la pila. De esta forma, si queremos aadir un nuevo elemento a la pila (push) lo
haremos en la posicin siguiente a la que nos indica este campo. Observe como
slo se inserta un nuevo elemento sobre la cima cuando hay espacio suficiente, es
decir la longitud de la pila es menor que su capacidad. Primero se incrementa el
valor del campo top y despus se inserta el elemento en la pila .

Para implementar las operaciones pop y primero se comprueba que la lista no es


vaca, en cuyo caso se devuelve un valor nulo (null). Para el caso de pop se
decrementa la variable top para eliminar el objeto de la cima, mientras que para
primero no, puesto que en este ltimo slo se est consultando la cima.

Implementacin de pilas mediante listas enlazadas

Utilizaremos ahora la clase Nodo definida anteriormente para ver esta otra
implementacin a la que llamaremos PilaEnlazada . Los campos que definiremos
para esta clase son top, que almacena el nodo que est en la cima de la pila y la
longitud de la misma.
PilaEnlazada.java

A continuacin vemos como se insertan los nodos por la cima de la pila. Para ello
se crea un nuevo nodo y se le asigna como siguiente nodo la antigua cima de la
pila. El siguiente paso es actualizar la cima de la pila con el nuevo nodo creado.
El funcionamiento del pop es el siguiente. Si la lista es vaca devuelve un valor nulo.
En caso contrario actualiza la cima al siguiente elemento por debajo del nodo
situado en la cima y devuelve el valor del nodo cima:

El mecanismo que sigue el mtodo primero es similar al visto en el pop, aunque se


elimina la cima, nicamente se devuelve su valor:
Listas en Java

Una lista es una secuencia de elementos dispuesto en un cierto orden, en la que


cada elemento tiene como mucho un predecesor y un sucesor. El nmero de
elementos de la lista no suele estar fijado, ni suele estar limitado por anticipado.
Representaremos la estructura de datos de forma grfica con cajas y flechas. Las
cajas son los elementos y las flechas simbolizan el orden de los elementos.

La estructura de datos deber permitirnos determinar cul es el primer elemento y


el ltimo de la estructura, cul es su predecesor y su sucesor (si existen de cualquier
elemento dado). Cada uno de los elementos de informacin suele denominarse
nodo.

La lista tambin puede representarse de forma simblica escribiendo sus elementos


separados por comas y encerrados entre corchetes. Por ejemplo:

["rojo","verde","azul","amarillo"]

Las listas admiten ciertas operaciones como son insertar un nodo adicional, borrar
un nodo, etc. En funcin de la forma de insertar nuevos elementos y acceder a los
existente tendremos distintos tipos de listas. Veamos ahora qu operaciones
bsicas se puedes realizar sobre las listas. Se tratarn aqu las operaciones que
permiten insertar y borrar elementos nicamente al principio de la misma, por lo que
las operaciones de acceso, insercin y supresin de elementos en cualquier
posicin de la lista no se consideran bsicas pero podrn ser tratadas mediante
recursin.

Las operaciones bsicas sobre una lista son:


EsVacia Averiguar si la lista esta vaca.

Insertar Aade un elemento al principio de la lista.

Primero Obtener el valor del primer elemento de la lista, tambin llamado cabeza.

Resto Devuelve el trozo de lista resultado de eliminar el primer elemento de la lista.

Borrar Borrar el primer elemento de la lista.

Las listas pueden ser circulares, con el ltimo elemento apuntando al primero, o
pueden tener un campo que contenga el nmero de nodos que hay en la lista.

Las listas se pueden definir de muchas formas. Podramos definirlas a partir de un


vector teniendo un acceso rpido aunque con un nmero de elementos limitado por
la dimensin del vector.

Otra forma de definir una lista es de forma recursiva. Resulta menos eficiente que
definirla a partir de un vector sin embargo no nos impone restricciones en cuanto a
su longitud. Veamos como se define en Java cada uno de los elementos de la lista:

Observe como esta estructura se corresponde con las cajas que se haban visto en
la representacin de listas. Vemos que tiene dos atributos, el elemento que se
almacena en cada nodo y el Nodo siguiente en el orden de la lista. A continuacin
se implementan los mtodos de la clase para manipular los nodos:
Nodo.java

El constructor crea un nodo a partir de un objeto y el siguiente nodo al que va a estar


enlazado. Las operaciones cambiarElemento y cambiarSiguiente cambian los
valores de los campos del objeto. Por ltimo Siguiente y Elemento devuelven el
contenido del nodo.

A partir de esta clase implementaramos las lista como una cadena de nodos:

ListaEnlazada.java

Fjese como el constructor inicializa la lista a null. Este va a ser tambin el final de
la lista. De forma que cuanto el principio y final de la lista coincidan la lista estar
vaca.

Veremos a continuacin algunas implementaciones distintas de listas. Se debe


prestar especial inters a los mecanismos de implementacin, pues las distintas
operaciones pueden cambiar de una implementacin a otra sin embargo la forma
no.
Colas en Java

Los elementos de la cola se aaden y se eliminan de tal manera que el primero en


entrar es el primero en salir. La adicin de elementos se realiza a travs de una
operacin llamada encolar (enqueue), mientras que la eliminacin se denomina
desencolar (dequeue). La operacin de encolar inserta elementos por un extremo
de la cola, mientras que la de desencolar los elimina por el otro.

El siguiente interfaz muestras las operaciones tpicas para colas:

Cola.java

La siguiente es una posible implementacin de colas mediante la clase Nodo:

ColaEnlazada.java
Vemos como la clase Cola contiene dos campos, cola y cabecera que apuntan al
principio y al final de la cola. La cabecera la utilizaremos para extraer elementos.
Para insertar utilizaremos la cola.

La operacin encolar crea un nodo cuyo sucesor es nulo. Esto es porque aadimos
al final de la cola, es decir, donde apunta el campo cola. Si la cola es vaca la
cabecera y la cola apuntan al mismo objeto Nodo.
Para eliminar (desencolar) y para consultar (cabecera) se utiliza el campo cabecera.
Se extraen/consultan elementos de la cabeza de la cola.

rboles en Java

La estructura de datos rbol al contrario que las listas es una estructura de datos
no lineal. Las listas tienen un orden impuesto en sus elementos teniendo como
mucho un predecesor y un sucesor. Los rboles pueden tener dos o ms sucesores.

Un rbol consiste en un conjunto de nodos o vrtices y un conjunto de aristas o


arcos que satisface unos requisitos:

Existe una jerarqua de nodos, de forma que a cada nodo hijo le llega una
arista de otro nodo padre. De esta forma se establece la relacin padre-hijo:
p es padre de h, h es un hijo de p.
El nodo donde comienza la jerarqua se llama nodo raz. A este nodo no
llegan arcos de ningn otro nodo, en otras palabras, no es hijo de ningn
nodo padre.

Existe un camino nico entre la raz y cualquiera de los nodos del rbol

Veremos ahora un poco de terminologa relacionada con los rboles. En primer


lugar estudiaremos qu tipos de nodos nos podremos encontrar en un rbol. Hemos
visto que existe un nodo especial, el nodo raiz que no tiene padres. El caso de los
nodos que no tienen hijos es el de los nodos externos o nodos hoja. El resto de
nodos son internos, cuando tiene descendientes. Diremos que un nodo es
descendiente de otro, si es hijo de l descendiente de sus hijos. Los
descendientes nos determinan un subrbol con raz el nodo descendiente.

Veremos ahora aquellos conceptos que nos dan una idea sobre la topologa del
rbol. Son los conceptos de camino, longitud y profundidad:

El camino existente entre dos nodos, es la secuencia de "arcos" que nos


llevan, siguindolas de forma consecutiva del primero al segundo. La longitud
es el nmero de aristas que contiene.

Profundidad de un nodo es la longitud del camino de la raz a ese nodo.

Altura de un rbol es la profundidad mxima entre todos los nodos extremos


del rbol. Es decir, "la profundidad del nodo ms profundo".

Por simplificar el estudio de los rboles veremos el caso de los rboles binarios.
Un rbol binario es un rbol en el que cada nodo tiene 0 2 hijos (el hijo izquierdo
y el derecho). Este rbol podr ser ordenado si para cada nodo existe un orden
lineal para todos su hijos, es decir, si tenemos el orden "menor que", un rbol ser
ordenado si para cada nodo sus hijos son menores que el padre.

Al igual que las listas la forma de definir los rboles es de manera recursiva.
Definiremos inicialmente una clase Nodo que represente cada uno de los nodos del
rbol:

Cada uno de los objetos de tipo NodoBinario representa una estructura de datos
compuesta por el elemento que se almacena en cada nodo y dos nodos que
llamaremos nodoizqy nododcha. Puesto que los nodos binario pueden tener 0 2
hijos, se han definido dos tipos de constructores para cubrir los dos casos. El resto
de mtodos son para manipular la clase nodo de forma transparente. A partir de
esta clase NodoBinario se define la clase ArbolBinario como sigue:
Notes que un ArbolBinario como mximo puede tener un hijo, si es el caso
usaremos el constructor con un solo parmetro si no es as utilizaremos el
constructor por defecto, es decir, el constructor sin parmetros.

Un ArbolBinario no es mas que un NodoBinario llamado raiz. Vemos en el siguiente


esquema cmo sera grficamente la estructura del rbol:

Vamos a ver cmo se calculara el tamao del rbol a partir de esta definicin:

Definimos una funcin auxiliar que calcula el tamao de un subrbol bajo un nodo.
Este mtodo calcula una longitud 0 si el Nodo es nulo. En otro caso, la longitud ser
la suma de los tamaos de los nodos hijos ms uno, correspondiente al nodo actual.
El mtodo tamao llama al mtodo tam_aux con el nodo raiz.

Veremos las distintas formas de recorrer un rbol en el captulo de Exploracin de


rboles

Exploracin de rboles

Los rboles son estructuras de datos usadas cuando se quieren manejar


rpidamente gran cantidad de datos. A menudo querremos realizar operaciones
sobre los nodos del rbol para lo que necesitaremos explorarlo. A pesar de la
variedad de algoritmos, en todos ellos deberemos visitar todos los nodos o lo que
es lo mismo recorrer el rbol.

Existen dos formas principales para recorrer un rbol:

Profundidad, que engloba recorridos que se realizarn de forma recursiva.

Anchura que seguir la estructura de niveles del rbol.

Existen tres formas de recorrer un rbol en profundidad:

Preorden. El tratamiento de la raz se realiza primero y luego el de los hijos,


siendo el orden de recorrido raiz, hijoIzquierdo, hijoDerecho

Inorden. El tratamiento de la raz se realiza entre el de los subrboles. El


orden del recorrido ser hijoIzquierdo, raz, hijoDerecho

Postorden. Se realiza el tratamiento de los hijos y se deja para el final el de


la raz quedando un orden de recorrido hijoIzquierdo, hijoDerecho, raz

Los recorridos en profundidad son muy sencillos de implementar ya que siguen la


estructura recursiva del rbol. Veremos la implementacin de los distintos
recorridos en Java:

Veremos un mtodo que imprime el contenido de un rbol en preorden. El algoritmo


consta de tres pasos:

Imprimir nodo raz

Llamada recursiva al mtodo con el hijo izquierdo

Llamada recursiva al mtodo con el hijo derecho

quedando la implementacin como sigue:


En el siguiente rbol ejemplo,

la impresin resultado sera:

El algoritmo de recorrido inorden es similar salvo que la raz se imprimir despus


de haber impreso todo el subrbol correspondiente al hijo izquierdo. Por tanto la
primera llamada recursiva ser a ImprimirEnInorden con el hijo izquierdo. Despus
se imprimir la raiz y por ltimo la llamada a ImprimirEnInorden con el hijo derecho.

En el rbol ejemplo,

la impresin resultado sera:

a
c

La implementacin del algoritmo de recorrido en postorden es muy parecida:

En el rbol ejemplo,

la impresin resultado sera:

c
a

Aunque existen distintas formas de recorrer un rbol en anchura, nosotros


estudiaremos la manera ms usual, de izquierda a derecha y descendente.

Para la implementacin se utilizar una cola donde se almacenarn los nodos que
deben ser visitados. El primer elemento que se insertar en la cola ser el rbol.

El algoritmo ir extrayendo de la cabeza de la cola el rbol correspondiente.


Cuando se extrae la cabeza obtendremos un subrbol. Realizaremos el
tratamiento correspondiente con el nodo raz y los hijos los insertaremos en la cola
de la cola.

Este proceso se realizar de forma iterativa hasta que la cola se quede vaca. Lo
ltimo que nos quedara por concretar es qu sucede cuando llegamos a un rbol
que est compuesto por un nico nodo hoja. En este caso no insertaremos ningn
subrbol en la cola puesto que no ste no tiene.

La implementacin en Java de un procedimiento que imprime el contenido de los


nodos recorriendo el rbol en anchura quedara:
Grafos en Java

Desde un punto de vista intuitivo un grafo es un conjunto de nodos unidos por un


conjunto de arcos. Un ejemplo de grafo que podemos encontrar en la vida real es el
de un plano de trenes. El plano de trenes est compuesto por varias estaciones
(nodos) y los recorridos entre las estaciones (arcos) constituyen las lneas del
trazado.

Veremos a continuacin una definicin ms formal de grafos. Un grafo G=(V,E)


consiste en un conjunto V de nodos (vrtices) y un conjunto E de aristas (arcos).
Cada arista es un par (v,w), siendo v y w un par de nodos pertenecientes al conjunto
V de nodos. Podemos distinguir entre grafos dirigidos y no dirigidos. En un grafo
dirigido los pares (v,w) estn ordenados, traducindose la arista en una flecha que
va desde el nodo v al nodo w.

En el caso de un grafo no dirigido, los nodos estn unidos mediante lneas sin
indicacin de direccin.

Por ltimo se puede definir una funcin que asocie a cada arco un coste:
coste(arco)

Estudiaremos a continuacin algo de terminologa comn en los grafos.

Hablaremos de dos vrtices adyacentes cuando estn unidos por un arco. El


nmero de vrtices adyacentes de un nodo constituye el grado del mismo. En el
ejemplo los vrtices adyacentes al nodo 3 son el 1, 4 y 5, siendo ste por tanto un
nodo de grado tres por tener tres vrtices adyacentes.
Un camino entre dos vrtices, es una secuencia de vrtices tal que dos vrtices
consecutivos son adyacentes. En el siguiente ejemplo el camino entre el vrtice a y
el vrtice e ser la secuencia de vrtices abecde.

Cuando este camino no tiene vrtices repetidos se dice que es simple. Salvo en el
caso de que el primer y ltimo vrtice del camino sean el mismo, en cuyo caso
hablaremos de un ciclo

La siguiente clasificacin, aunque no es completa, presenta las principales


caractersticas que nos podemos encontrar en los grafos:

Grafo conexo: Cuando entre cada dos nodos del grafo hay un camino.

Bosque: Es un grafo sin ciclos.

Arbol libre: es un bosque conexo.

La representacin ms extendida de los grafos es mediante lo que se llaman


Matrices de adyacencia. Si el nmero de vrtices del grafo es N, la matriz de
adyacencia es un una matriz tal que:

Mediante esta representacin, la matriz de adyacencia del ejemplo sera

a b c d e
a 0 1 1 1 0

b 1 0 0 0 1

c 1 0 0 1 1

d 1 0 1 0 1

e 0 1 1 1 0

La implementacin de un grafo valorado en una clase de java, representado


mediante una matriz de adyacencia sera:

La clase grafo est compuesta de cuatro miembros:

Adyacentes: Representa la matriz de adyacencia donde cada celda


Adyacentes[i][j] representar el valor del arco que va desde el nodo i al nodo
j. Si el valor es 0, consideraremos que no existe arco alguno.

Informacin: Representa la informacin accesible a cada nodo.

nodos: que indica el nmero de nodos.

vacio: con valor true si el grafo est vaco.

El constructor crear un grafo con un nmero de nodos igual a numeroNodos.


Inicializar la matriz de adyacencia a cero.
Algoritmos Voraces

Tal y como indica su nombre estos algoritmos intentan buscar la solucin desde el
primer momento. El enfoque que utilizan es ir construyendo la solucin en cada
paso.

Este tipo de algoritmos es muy empleado en los llamados problemas de


optimizacin. Son problemas que a partir de una coleccin de elementos tratan de
obtener un subconjunto de los mismo que optimice la consecucin del objetivo. En
algunos caso se trata de obtener un orden entre los elementos de entrada con el fin
de optimizar una medida. Ejemplos de este tipo de problemas donde aplicar esta
tcnica son:

Tenemos un ascensor capaz de transportar un mximo de kilos k y tenemos


un grupo de personas cuyos pesos suman ms de la capacidad del ascensor.
El problema sera llenar el ascensor con el mximo nmero de pasajeros sin
sobrepasar su capacidad

Cmo podemos grabar una cinta de msica de manera que el orden de


grabacin nos permita minimizar el tiempo de acceso a las canciones?

El esquema que va a seguir la tcnica voraz es ir construyendo una solucin parcial


y evaluando qu elemento de entre el conjunto de candidatos aadir en el
siguiente paso. Para ello se ayudar de una funcin de seleccin que en el caso
del ascensor podra ser tan sencilla como "escoger el ms ligero". Esta funcin ha
de disearse de forma que garantice la obtencin de la solucin ptima, sin prejuicio
de que existan ms de una. Los algoritmos voraces nunca rectifican: una vez que
un elemento de la entrada ha pasado a formar parte de la solucin, permanece
como integrante de sta hasta que el algoritmo termina.
Como se puede observar, una vez seleccionado el candidato y tras haber
comprobado que aadido a la solucin parcial construida es una solucin vlida, se
aade este a la misma. Se contina seleccionando candidatos. Este proceso acaba
cuando ya no quedan candidatos del conjunto de elementos de entrada cuando
se ha alcanzado una solucin.

El problema de la mochila es el ejemplo tpico de problemas de optimizacin, que


puede resolverse eficientemente mediante la tcnica voraz. Tenemos una mochila
y una serie de objetos que queremos meter en la mochila. El nmero de objetos que
podemos meter en la mochila est limitado por la capacidad (C) de la mochila y el
peso de cada uno de los objetos (Pi). Sin embargo daremos ms importancia a unos
objetos sobre otros, otorgndoles a cada objeto i = 1, .., n un peso Wi = W1, ..., Wn.

Tendremos por tanto dos vectores:

Vector de pesos: [P1, ..., Pn]

Vector de precios: [B1, ..., Bn]

Podremos meter en la mochila los objetos enteros o fracciones de los mismos


(vector de fracciones [X1, ..., Xn]). El objetivo final es encontrar este vector, donde
cada Xi expresa la fraccin del objeto i-simo que se introduce en la mochila de
forma que maximize la funcin

Supondremos que la suma de los pesos de todos los objetos es mayor que la
capacidad mxima de la mochila. Por tanto, la solucin que encontremos deber
incluir el mximo de objetos fracciones sin sobrepasar esta capacidad.
Detectaremos que hemos alcanzado esta solucin cuando se cumpla que

es decir, que se ha llenado completamente la mochila

Para encontrar la solucin ptima es importante elegir adecuadamente la funcin


de seleccin. Plantearemos a continuacin tres criterios para ir construyendo la
solucin:

Escoger en cada momento el objeto ms caro, con mayor precio Bi.

Escoger el objeto menos pesado para que me quede espacio para mas
cosas.

Elegir el objeto que ofrece mayor relacin precio/peso

Con el siguiente ejemplo veremos que criterio utilizaremos. Si tenemos una mochila
con capacidad, C = 14 y con el siguiente vector de pares (peso, precio):

( (10, 30), (4, 8), (6, 24) )

Las soluciones generadas por los tres criterios son:

Criterio 1: (1, 0, 4/6), peso del contenido: 46

Criterio 2: (4/10, 1, 1), peso del contenido: 44

Criterio 3: (8/10, 0, 1), peso del contenido: 48


Veamos ahora una implementacin imperativa del algoritmo. Supondremos, con
objeto de facilitar la eleccin del siguiente objeto, que los elementos estarn
ordenados en funcin de la relacin beneficio/peso.

La variable resto indica en todo momento la capacidad an no completada de la


mochila. Se inicializa el vector de fracciones todo a cero. Dentro del bucle cuando
el peso del elemento no sobrepasa la capacidad restante se introduce
completamente en la mochila. En caso de que no quede capacidad suficiente se
introduce la fraccin correspondiente.

Backtracking

La tcnica de backtracking esta muy asociada a la recursividad, o mas propiamente,


a la estructura recursiva de la mayora de tipos de datos: listas, rboles, etc.

Esta tcnica consiste bsicamente en

Enumerar sistemticamente las alternativas que existen en cada momento


para dar con la solucin a un problema.

Se prueba una alternativa, guardando memoria del resto de alternativas.

Si no damos con la solucin, podemos dar marcha atrs (backtracking) y


probar otra alternativa.
Para entender el concepto pongamos un ejemplo muy tpico de la vida real.
Supongamos que nos quedamos sin leche en la nevera y decidimos salir
urgentemente a comprar un cartn de leche. Tenemos dos alternativas para
solucionar el problema:

Ir a la tienda de la esquina.

Ir al supermercado.

Ahora probamos la alternativa 1.1, y nos vamos a la tienda de la esquina. Ops !! Me


olvid de que hoy es Domingo, as que la tienda esta cerrada. Afortunadamente,
guardo memoria de otra alternativa, as que doy marcha atrs y elijo ir al
supermercado. Como las Grandes Superficies siempre estn abiertas, entro en el
supermercado pero, Dnde esta la leche?. Se plantean otras dos alternativas:

Ir al refrigerador de los yogures.

Ir al pasillo de alimentacin.

Elijo la alternativa 2.1, pero en el refrigerador no hay leche. De nuevo, recuerdo la


otra posibilidad, ir al pasillo de alimentacin donde encuentro el cartn de leche.
Problema resuelto !.

Esta tcnica tan trivial resulta especialmente til para los problemas de bsqueda
en estructuras de datos. Especialmente si no existe a priori ningn criterio de
bsqueda mejor o peor. El inconveniente es que hay que explorar sistemticamente
todas las alternativas, lo que resulta muy lento en general.

Como hemos visto, un algoritmo de backtracking tiene ciertos requerimientos:

Un espacio de bsqueda, esto es un conjunto de posibilidades o "estados"


del problema a resolver. En general, un estado puede estar definido por el
elemento de la estructura de datos que queremos tratar en cada instante. Por
ejemplo, en un rbol, cada uno de sus nodos.

Un estado inicial, el punto de partida del problema.


Un conjunto de estados finales. Estos se definen mediante alguna
caracterstica, criterio o condicin. Por ejemplo, todos los nodos de un rbol
que almacenen un nmero entero igual a 10.

Una memoria de estados. Generalmente una pila donde guardamos los


estados de bsqueda, es decir las alternativas posibles en cada momento.

As, una algoritmo de backtracking tendr la siguiente estructura genrica:

Definiremos este interfaz de forma que la clase Backtracking podr recorrer


cualquier estructura de datos que implemente este interfaz.

La clase que realiza backtracking hasta encontrar una solucin ser:

El constructor nos servir para indicar el elemento que corresponde con el estado
inicial. El siguiente mtodo contiene el algoritmo de backtracking. Como argumento,
recibe cualquier objeto que acte como criterio para distinguir un estado final. El
resultado del mtodo ser null si no se encuentra una solucin, y si algn elemento
es solucin, retorna dicho elemento.
Utilizaremos la clase definida para ver un ejemplo ms concreto. Disponemos de un
rbol binario que contiene en sus nodos la siguiente informacin:

El problema se trata de encontrar el nombre asociado a un DNI concreto.


Tendremos que definir una clase que implemente el interface
EstadoDeBacktracking:
Hemos implementado los dos mtodos del interfaz:

EsSolucion: En el que nuestro objeto criterio es el DNI a encontrar. El


resultado ser true si el DNI encontrado coincide con el DNI del Nodo actual.

IntroducirNuevasAlternativas: Colocar en la pila los dos hijos del nodo


raiz.

El siguiente mtodo buscar la persona por el DNI obteniendo su nombre o el literal


"desconocido":
Conceptos Bsicos de Programacin

Lgica

Qu nadie se asuste ! Este captulo es una simple introduccin a la lgica


matemtica que ser aplicada a la programacin en lenguajes de alto nivel. No se
trata de adentrarse en "el mundo de la lgica", pero lo que aprenderis en este
captulo es necesario y bsico si se quiere programar.

Comparemos 2 tipos de lenguajes, el lenguaje natural y el lenguaje formal. Los


lenguajes naturales, como el castellano, el ingls, etc... nacieron como respuesta a
la necesidad de comunicarse de los seres humanos.

La gramtica y dems metodologas aplicadas al lenguaje surgieron despus. Las


matemticas y la lgica nacieron para formalizar los razonamientos del ser humano
y permitirnos hacer razonamientos complejos, en base a teoras, teoremas,
axiomas... En la lgica se elimina la ambigedad del lenguaje natural. Slo existen
2 valores: verdadero y falso.

Vamos a centrarnos en la lgica proposicional, compuesta por sentencias,


proposiciones o frmulas. Una frmula est formada por smbolos... que pueden
tener un significado y operadores lgicos. El rango de valores que puede tomar
es verdadero y falso.
Tablas de Verdad

Como ya hemos dicho, una frmula puede tomar los valores verdadero y falso. La
semntica es el conjunto de reglas que permiten dar significado a una frmula. El
valor de una frmula vendr dado por los operadores segn las tablas de verdad.
A partir de ahora, al valor falso le asignaremos el 0, y al verdadero el 1.

Negacin: La negacin de un valor es su opuesto.

p not p

0 1

1 0

Conjuncin: La conjuncin de 2 valores slo es cierta si ambos son verdaderos.

p q p and q

0 0 0

0 1 0

1 0 0

1 1 1

Disyuncin: La disyuncin de 2 valores slo es falsa si ambos son falsos.

p q p or q

0 0 0

0 1 1

1 0 1
1 1 1

Condicional: La nica posibilidad de que una condicin o implicacin sea falsa es


si verdadero implica falso (1 -> 0).

p q p -> q

0 0 1

0 1 1

1 0 0

1 1 1

Disyuncin exclusiva: La disyuncin exclusiva de 2 valores es verdadera si son


diferentes, y falsa si los 2 valores son iguales.

p q p xor q

0 0 0

0 1 1

1 0 1

1 1 0

A continuacin, veremos cmo utilizar tablas de verdad. Queremos saber si las


frmulas not (p and q) y (not p) or (not q) son equivalentes. Para ello utilizaremos
las tablas de verdad para obtener el resultado de las frmulas, y si ambas dan el
mismo resultado para cualquier combinacin de valores (sus tablas de verdad son
iguales), sern equivalentes:

p q not p not q p and q not (p and q) (not p) or (not q)


0 0 1 1 0 1 1

0 1 1 0 0 1 1

1 0 0 1 0 1 1

1 1 0 0 1 0 0

Como se puede apreciar, las 2 frmulas devuelven el mismo resultado. Son


equivalentes.

Propiedades en Programacin

En lgica proposicional, a veces es necesario transformar una frmula en otra


equivalente. Las transformaciones se hacen de acuerdo a una serie de leyes o
reglas:

Complemento

not 0 = 1

not 1 = 0

p and (not p) = 0

p or (not p) = 1

Idempotencia

p and p = p

p or p = p

Identidad

p and 1 = p

p and 0 = 0
p or 1 = 1

p or 0 = p

Doble negacin

not (not p) = p

Asociacin

(p and q) and r = p and (q and r)

(p or q) or r = p or (q or r)

Distribucin

p and (q or r) = (p and q) or (p and r)

(q or r) and p = (q and p) or (r and p)

p or (q and r) = (p or q) and (p or r)

(q and r) or p = (q or p) and (r or p)

Absorcin

p and (p or q) = p

p or (p and q) = p

Leyes de Morgan

not (p and q) = (not p) or (not q)

not (p or q) = (not p) and (not q)

Conmutacin Por definicin

p and q = q and p p and q = not ((not p) or (not q))

p or q = q or p p -> q = (not p) or q
Utilizando estas leyes podemos demostrar que 2 frmulas son equivalentes. Por
ejemplo, not (p -> q) y p and (not q) son frmulas equivalentes. Es decir, partiendo
de una frmula y aplicndole las reglas de transformacin, llegamos a la otra
fmula. La demostracin, utilizando las reglas anteriores, sera:

Definicin: not (p -> q) = not ((not p) or q) =

Morgan: = (not (not p)) and (not q) =

Doble Negacin: = p and (not q)

Vemos que a partir de una frmula hemos llegado a la otra aplicndole las reglas
de transformacin. Queda como ejercicio para el alumno desarrollar las tablas de
verdad de ambas frmulas y comprobar que son equivalentes.

Tautologa: Frmula o proposicin Contradiccin: Frmula o proposicin


siempre cierta (su tabla de verdad es siempre falsa (su tabla de verdad es
siempre 1). Por ejemplo: p or (not p) = 1 siempre 0). Por ejemplo: p and (not p) =
0
p not p p or (not p)
p not p p and (not p)
0 1 1
0 1 0
1 0 1
1 0 0

El Pseudolenguaje Parte I

El pseudocdigo es un lenguaje de especificacin de algoritmos. Se utiliza como


un primer borrador del programa en la fase de diseo, para "perfilar" el cdigo
fuente, centrndose en la lgica y los puntos de control de ste sin tener que ceirse
a las restricciones sintcticas de un lenguaje de programacin. Como ya supondris,
el pseudocdigo no puede ser ejecutado por un computador.

Los lenguajes de alto nivel tienen sentencias de control que se asemejan al lenguaje
hablado: "si pasa esto hago tal, si no, hago otra cosa", "mientras pase esto hago
aquello"... El pseudocdigo no es ms que una pequea "estandarizacin" del
lenguaje hablado, que luego podr traducirse a un lenguaje de programacin. Por
ejemplo, si yo digo: "si vienes ms tarde de las 5 me voy", podra escribir un
pseudocdigo:

Si tu_hora_de_llegada > 5 entonces me_voy

Siguiendo con la filosofa del pseudocdigo, no vamos a seguir unas normas


estrictas, pero s unas mnimas normas bsicas para homogeneizar y hacer
comprensible el pseudocdigo que desarrollemos.

Se insistir mucho en seguir unas "normas de estilo" que hagan ms comprensible


el cdigo fuente de un programa. Es responsabilidad del alumno seguirlas, pero
todos los buenos programadores las siguen, no es una "pijada", realmente ayuda a
programar mejor.

Vamos a adelantar una serie de conceptos que veremos con ms detalle en


prximos artculos. Una variable es una "entidad" que utilizaremos para almacenar
informacin durante la ejecucin de un programa. El contenido de una variable
puede modificarse asignndole un valor. Por ejemplo, si quisiramos que una
parte del programa se ejecutase si el valor de una variable es 5, en pseudocdigo
lo escribiramos:

variable_1 := 3;
(* grupo de instrucciones 1 *)

si (variable_1 = 5) entonces
hacer
_____(* grupo de instrucciones 2 *)
fin_hacer

en_otro_caso
hacer
_____(* grupo de instrucciones 3 *)
fin_hacer

Se ejecutara el "grupo de instrucciones 2"? Eso no lo sabemos, depende del valor


que tome la variable variable_1 en el momento de evaluar si es igual o no a 5. Es
por esto por lo que se dice que la ejecucin de los programas es dinmica.
Dependiendo de las condiciones en las que se ejecute un programa, obtenemos un
resultado u otro. De todas formas, ya veremos ms adelante "de qu va todo esto".

En el fragmento anterior de pseudocdigo han aparecido varios elementos. Una


asignacin de un valor a una variable, tres comentarios y una estructura de control
selectiva. El pseudocdigo de las estructuras de control ya lo veremos en los
captulos correspondientes, de todas formas, a partir de este momento las
utilizaremos para empezar a desarrollar los primeros "mini-programas".

El Pseudolenguaje Parte II

Variables

Las variables pueden almacenar cualquier tipo de valor, ya sea un nmero, un texto,
etc... Pero debe quedar claro, que a partir de ahora, si una variable la utilizamos
para almacenar nmeros, no podr almacenar otro tipo de datos. Adems, es
recomendable que los nombres de las variables reflejen para qu se van a usar
esas variables.

Asignacin

Ya conocis las variables. Si queremos establecer el valor de una variable, lo


haremos mediante la sentencia variable := valor.
Comparacin

Cuando queramos comparar el valor de 2 variables:

Menor: variable1 < variable2

Menor o igual variable1 >= variable2

igual variable1 = variable2

Mayor variable1 > variable2

Mayor o igual variable1 >= variable2

Importante: Estos "operadores de comparacin" son binarios, es decir la sentencia


variable_1 >= variable_2 >= variable_3 no la consideraremos vlida. En cambio,
(variable_1 >= variable_2) >= variable_3 s es correcta.

Aritmtica Cuando queramos realizar operaciones aritmticas bsicas,


utilizaremos:

suma (+)

Resta (-)

Multiplicacin (*)

Divisin (/)

Importante: Estos "operadores aritmticos" permiten operar con ms de 2


variables, es decir, variable_1 + variable_2 + variable_3 la consideraremos vlida.

Lgico

Cuando queramos utilizar expresiones lgicas, utilizaremos:

Not

And

Or
Bloques de sentencias

En ocasiones... veo muertos. Frases del Sexto sentido aparte, en ocasiones hay
que agrupar un conjunto de sentencias, y lo haremos de la siguiente forma:

hacer
sentencia_1
.........
sentencia_3
fin_hacer

Consejo: El cdigo fuente de un programa puede ser muy extenso. Debe tener una
"estructura visual" que lo haga lo ms legible posible. Para ello, se suele "tabular"
el cdigo fuente, es decir, las sentencias dentro de un bloque de sentencias se
desplazan a la derecha. Esto se hace por cuestiones de estilo y legibilidad del
cdigo. Un programa funcionar igual si su cdigo fuente est bien organizado o si
est todo en una sola lnea, pero el cdigo ser mucho ms comprensible si sigue
unas "normas de estilo".

Tambin pueden anidarse varios bloques de sentencias:

hacer
sentencia_1 hacer
sentencia_2
hacer
sentencia_3
fin_hacer
fin_hacer
sentencia_N
fin_hacer

Como os comentaba en el consejo anterior, aqu quizs veis mejor el porqu de


estructurar el cdigo.
Comentarios

Se utilizan para hacer aclaraciones en el cdigo fuente. Pero tambin al probar


cdigo, ya que los comentarios no son ejecutados. Por lo tanto, podemos
"comentar" una parte del cdigo para ver qu pasa si no se ejecuta. Los comentarios
los escribiremos as: (* texto del comentario *). Ya veris que el cdigo fuente de un
programa puede ser muy extenso: Windows 98 tena unas 18 millones de lneas de
cdigo... uffff !!! Como es lgico el desarrollo corre a cargo de un equipo compuesto
por muchas personas, y si alguien necesita ver lo que ha hecho otra persona no
estara mal que "todo ese caos" tuviera alguna que otra aclaracin. Muchas veces
hasta lo que uno mismo hace no se entiende pasado un tiempo. Por ejemplo,
alguien entiende esto ? "^http[s]?://[:alnum:][\.[:alnum:]]+$". Este "engendro" salido
de las profundidades del PHP, comprueba si una direccin web es vlida. Para este
tipo de cosas "vienen bien" los comentarios.

A partir de ahora, y mientras no se diga lo contrario, es conveniente resolver los


ejercicios sobre el papel, ya que os ayudar a comprender los algoritmos.
Seguramente alguno de vosotros podr pasar los algoritmos a un lenguaje de
programacin y ejecutarlos. Si hacis esto estaris tirando el dinero que os cuesta
el curso. Insisto en recomendar hacer los ejercicios segn se indica en el curso.

Diagrama de Flujo I

Los diagramas de flujo son una tcnica grfica de representacin de algoritmos


en la que se utilizan smbolos para representar "el flujo de ejecucin" del programa.
En un diagrama de flujo se define el comportamiento del programa, dependiendo
de las condiciones que se presenten. Los elementos bsicos que usaremos en los
diagramas de flujo son:
Significado de los smbolos

Inicio y fin: Al inicio y al final del diagrama, habr un smbolo de este tipo

Entrada / Salida: Representa una operacin de entrada /salida del


programa, como entrada de teclado, salida a pantalla...

Proceso: Es una accin, un clculo, como la suma de 2 nmeros, etc... Se


pueden agrupar varias acciones bajo un mismo proceso

Decisin: Es un punto del diagrama en el que dependiendo del resultado de


una determinada condicin, se realiza una accin u otra. Tambin puede
utilizarse para elegir entre varias alternativas

Lnea de flujo: Representa el "flujo lgico secuencial" de un programa


A continuacin mostramos un diagrama de flujo mucho ms complejo, incluyendo
iteraciones o bucles hasta que se cumplan las condiciones del diagrama.
Diagrama de flujo II

Si comparamos este diagrama de flujo con el pseudocdigo del ejercicio anterior,


nos daremos cuenta de que ambos representan el mismo algoritmo. Podis elegir
el mtodo de representacin que ms os guste.

Tambin se pueden disear estructuras repetitivas con diagramas de flujo, usando


para ello el smbolo de decisin y una "retro-alimentacin" mediante una lnea de
flujo. Esto que puede parecer tan complicado, no es ms que lo representado en la
siguiente figura:

Se repetirn las acciones de la parte superior hasta que la condicin no se cumpla.

UML

UML es un Lenguaje de Modelado Unificado basado en una notacin grfica que


permite: especificar, construir, visualizar y documentar los objetos que forman un
sistema software orientado a objetos.
UML representa la unificacin de las notaciones de los mtodos Booch, Objectory
(Ivar Jacobson) y OMT (James Rumbaugh) siendo su sucesor directo y compatible.
Igualmente, UML incorpora ideas de otros metodlogos entre los que podemos
incluir a Peter Coad, Derek Coleman, Ward Cunningham, David Harel, Richard
Helm, Ralph Johnson, Stephen Mellor, Bertrand Meyer, Jim Odell, Kenny Rubin,
Sally Shlaer, John Vlissides, Paul Ward, Rebecca Wirfs-Brock y Ed Yourdon.

Algo que debe quedar bien claro es que se trata de una notacin, es decir, reglas y
recomendaciones para representar modelos. UML no es un proceso de desarrollo,
entendido como el conjunto de pasos sistemticos a seguir para desarrollar
software. UML nos va a permitir documentar y especificar los elementos creados
mediante un lenguaje comn describiendo modelos.

Surge la pregunta, qu es eso del modelado? En todos los mbitos de la ingeniera


se construyen modelos para entender mejor el sistema que vamos a desarrollar. As
los arquitectos disean planos de edificios que ms tarde se van a construir. Los
ingenieros industriales hacen diseos de automviles. Por tanto, si hablamos de
ingeniera del software, los ingenieros de software deberan hacer lo propio y
construir modelos de los sistemas software.

Para la construccin de modelos, hay que centrarse en los detalles relevantes


mientras se ignoran los dems, por lo cual con un nico modelo no tenemos
bastante. Varios modelos nos aportan diferentes vistas de un sistema para
comprenderlo desde varios puntos de vista. As, UML recomienda nueve diagramas
para representar los distintos puntos de vista de un sistema: Casos de Uso,
Diagrama de Clases, Diagrama de Objetos, Diagrama de Secuencia, Diagrama de
Colaboracin, Diagrama de Estados, Diagrama de Actividades, Diagrama de
Componentes y Diagrama de Despliegue.

UML maneja un vocabulario que abarca tres clases de bloques: elementos,


relaciones y diagramas.

Los elementos son abstracciones que representan las entidades principales en un


modelo,
las relaciones son mecanismos para enlazar los elementos,

los diagramas permiten manejar diferentes visualizaciones de conjuntos de


elementos conectados entre s.

UML ofrece cuatro clases de elementos: los estructurales, los de comportamiento,


los de agrupacin y los de anotacin.

Elementos estructurales

Los elementos estructurales representan la parte esttica del modelo e identifican


las partes que lo forman. UML contempla siete tipos de elementos estructurales:
clases, interfaces, colaboraciones, casos de uso, clases activas, componentes y
nodos. Durante el desarrollo del curso sern necesarios los siguientes:

Las clases describen un conjunto de objetos que comparten los mismos atributos,
operaciones, relaciones y semntica. En la representacin de clases y objetos
distinguiremos uno de otro subrayando el nombre del objeto, a diferencia de la clase
cuyo nombre ir sin subrayar.

Una interface es una coleccin de operaciones que especifica un servicio de una


clase o componente, describiendo el comportamiento visible, parcial o total, de un
elemento.

Elementos de comportamiento

Son la parte dinmica de UML y representan la forma de actuar del sistema, tanto
en el tiempo como en el espacio. Hay dos clases de comportamiento:

Diagrama de interaccin que refleja el conjunto de mensajes que intercambian


una coleccin de objetos dentro de un contexto particular con un propsito
especfico. El comportamiento involucra los elementos: mensajes, secuencias de
accin y ligas.

Mquina de estados que especifica la secuencia de estados que un objeto o una


interaccin tiene durante su tiempo de vida al responder a eventos.

Elementos de agrupacin

Son la parte organizacional de UML. Representan las partes en las que se puede
descomponer un modelo, las cuales son llamadas paquetes. Los paquetes son un
mecanismo de propsito general para organizar elementos en grupos. En un
paquete se pueden agrupar elementos estructurales, de comportamiento y otros. Es
un elemento puramente conceptual, existe slo en el tiempo de desarrollo.

Elementos de anotacin
Sirven para documentar los modelos. Hablamos de las notas que utilizaremos para
remarcar restricciones o comentarios a un elemento o a una coleccin de
elementos.

Nos permiten modelar los enlaces existentes entre diferentes elementos


estructurales, mostrando adems informacin adicional como nombres de roles
(identificacin del papel que juegan cada elemento en la relacin) multiplicidad
(restriccin que limita el nmero de instancias de una clase que pueden estar
relacionadas con la clase asociada).

UML maneja cuatro tipos de relaciones:

Una dependencia es una relacin semntica entre dos clases en la cual un cambio
de un elemento puede afectar la semntica de otro (dependiente). Una asociacin
es una relacin estructural que describe un conjunto de ligas, las cuales representan
conexiones a travs de objetos. La agregacin es una clase especial de asociacin
que representa una relacin de estructura entre un conjunto y sus partes. Se
representa con un diamante en el extremo de la clase agregada.

La generalizacin es una relacin de especializacin/generalizacin en la cual los


objetos de un elemento especializado (hijos) son consistentes con los objetos de un
elemento generalizable (el padre). Modeliza el comportamiento de la herencia.
Una realizacin es una relacin semntica entre clasificadores, en donde un
clasificador especifica un contrato que otro clasificador garantiza llevar a cabo.
Bsicamente modeliza el comportamiento existente entre el interfaz y la clase que
implementa el interfaz.

Un diagrama es la representacin grfica de un conjunto de elementos conectados


entre s. De los elementos vistos, un mismo elemento puede aparecer en uno, varios
o ningn diagrama. UML incluye nueve tipos de diagramas que son:

Diagrama de Casos de Uso: modela la funcionalidad del sistema. agrupndola en


descripciones de acciones ejecutadas por un sistema para obtener un resultado.

Diagrama de Clases: muestra las clases que componen el sistema y cmo se


relacionan entre s.
Diagrama de Objetos: muestra una serie de objetos y sus relaciones.

Diagrama de Secuencia: Describe la interaccin entre los objetos por medio de los
mensajes que intercambian a lo largo del tiempo entre s.

Diagrama de Colaboracin: Muestra la interaccin entre los objetos resaltando la


organizacin estructural de los objetos.

Diagrama de Estados: modela el comportamiento de acuerdo con eventos.

Diagrama de Actividades: simplifica el Diagrama de Estados modelando el


comportamiento mediante flujos de actividades.

Diagrama de Componentes: muestra la organizacin y las dependencias entre un


conjunto de componentes.

Diagrama de Despliegue: muestra los dispositivos que se encuentran en un sistema


y su distribucin en el mismo.

Divide y Vencers

Es una tcnica muy extendida gracias a su sencillez. Su aproximacin es bastante


intuitiva, si un problema es demasiado grande se descompone en partes de menor
tamao y ms sencillas de resolver. Podremos aplicar esta tcnica siempre que la
"instancia" del problema se pueda dividir en subinstancias de menor tamao.

En qu consiste esta tcnica?


Se divide el problema en subproblemas. Por eficiencia debemos intentar que
los subproblemas tengan un tamao similar. Si es posible resolver el
problema, porque este es indivisible, se resuelve directamente

Se resuelve el problema para cada una de las instancias ms pequeas

Se combinan las soluciones obtenidas para obtener una solucin global

La principal ventaja de esta tcnica es su sencillez. Sin embargo no siempre


obtendremos una solucin ptima, aunque en muchas ocasiones ser eficiente.

Veamos un ejemplo de aplicacin de esta tcnica para calcular la suma de los n


primeros nmeros naturales (1, 2, 3, ..., n):

Nos hemos ayudado de una funcin auxiliar, suma_aux, que suma los nmeros
existentes en un intervalo dado. Para divide el intervalo por su punto medio. Si no
se puede dividir el intervalo se devuelve el valor nfimo. Sera el caso del intervalo
[2,2], donde se devolvera el 2. En otro caso se resolvera el problema ms pequeo
de calcular la suma de los intervalos ms pequeos. Por ltimo se combinaran las
soluciones de los problemas ms pequeos sumndolas:
Operadores

Operadores Aritmticos

Los operadores aritmticos son aquellos que "manipulan" datos numricos, tanto
enteros como reales. Hay 2 tipos de operadores aritmticos: unarios y binarios.
Los operadores unarios se anteponen a la expresin aritmtica, y son los
operadores de signo. Los operadores binarios se sitan entre 2 expresiones
aritmticas.

Operadores aritmticos unarios

Operador Operacin Los operadores unarios devuelven


expresiones del mismo tipo que la
+ Signo positivo expresin a la que afectan.

- Signo negativo

Por ejemplo, -4 es el resultado de aplicar el operador unario - al entero 4,


devolviendo otro nmero enterio.

Operadores aritmticos binarios

Operador Operacin Operador Operacin

+ Suma / Divisin

- Resta div Divisin entera

* Multiplicacin mod Mdulo (resto)

Todos los operadores binarios admiten expresiones enteras y reales a excepcin


de div y mod, que slo admiten expresiones enteras, por lo que devuelven
expresiones enteras. En el caso de los otros operadores, si los 2 operandos a los
que afecta son enteros, la expresin resultante ser entera, pero si alguno o ambos
son reales, la expresin resultado es de tipo real. En esto tenemos de nuevo otra
excepcin: el operador / devuelve siempre expresiones de tipo real.

El operador aritmtico + tambin se puede usar con datos de tipo string. El resultado
es la concatenacin de las cadenas. Por ejemplo:

'Esto' + 'es una' + 'concatenacin de' + 'cadenas'

Como todos sabris, cualquier nmero dividido por 0 da como resultado infinito.
Esto se puede aceptar desde el punto de vista abstracto de las matemticas, pero
si probis esto en un lenguaje de programacin, el compilador os avisar de un error
que viene a decir que la divisin por 0 no est permitida. Por lo tanto, el segundo
argumento de los operadores /, div y mod no debe ser 0.

Como ltima aclaracin, el operador mod devuelve el resto de realizar la divisin del
primer operando por el segundo. Es decir, 6 mod 3 = 0 y 5 mod 2 = 1.

Operadores de Asignacin

Slo utilizaremos 1 operador de asignacin. Este operador es binario y se escribe:


:=. Una asignacin es una operacin en la que se asigna una valor a una variable
sustituyendo el que tuviera sta previamente.

variable := valor;

El valor que se le asigna a la variable puede ser un valor simple, o el resultado de


evaluar una expresin. Lo que se debe cumplir es la compatibilidad de tipos a ambos
lados del operador. Es decir, no podemos asignar un valor de tipo caracter a una
variable de tipo entero.

Tabla de compatibilidad entre tipos en la asignacin

Asignacin (tipos) Compatibilidad


entero := real NO

real := entero SI

(entero | real) := caracter NO

caracter := (entero | real) NO

(entero | real | caracter | string) := lgico NO

lgico := (entero | real | caracter | string) NO

string := caracter SI

caracter := string NO

Operadores Relacionales

Los operadores relacionales nos permiten comparar expresiones de tipos


compatibles, devolviendo un resultado de tipo lgico: la comparacin es verdadera
o falsa. Por ejemplo, la expresin (3 + 4) > 12 sera falsa, ya que 7 es menor que
12.

La estructura de una operacin relacional sera la siguiente:

expresin_1 operador_relacional expresin_2

Operadores relacionales

Operador Operacin

= Igual

<> Distinto

< Menor
> Mayor

<= Menor o igual

>= Mayor o igual

in Elemento de

Los operadores de relacin se pueden aplicar a cualquiera de los tipos que hemos
visto hasta ahora:

entero

real

lgico

caracter y cadena

Las operaciones relacionales o de comparacin entre nmeros reales y enteros no


merecen mayor comentario, las matemticas dictan las reglas. Si comparamos
expresiones lgicas, lo cual no tiene mucho sentido, hay que saber que el valor falso
se considera menor que el valor verdadero. Las comparaciones entre caracteres o
cadenas se basan en el cdigo ASCII de cada caracter. Por ejemplo, el cdigo ASCII
de la letra a es 97, y el de la letra A es 65, luego si las comparamos, tendramos
que 'a' > 'A'.

El operador in se utiliza en unas estructuras llamadas conjuntos que veremos en


el prximo captulo.

Tipos compatibles en operaciones relacionales

Tipo1 Tipo2

entero real

caracter cadena

You might also like