Documentos de Académico
Documentos de Profesional
Documentos de Cultura
03CursoOO Clases
03CursoOO Clases
la introduccin de ambigedad
65
Sobre el captulo
Motivaciones
En la evolucin del software los objetos fueron una abstraccin de nuevo tipo, es
decir, cualitativamente diferente a las dems porque eran variables que se podan asociar
con el concepto de cosa. Gracias a este nivel de ambigedad, los objetos facilitaron el
acceso a un campo ms amplio de trabajo. Con los objetos el software aumento su
capacidad para enfrentar la complejidad, pero no era suficiente. En la misma direccin,
convena disponer de mayor nivel de abstraccin y se inventaron las clases para
expresar abstracciones de cosas (objetos). Una vez ms, se facilit el trabajo porque las
clases permiten pensar el diseo con menos elementos, expresar relaciones de forma
ms compacta (abstracta) y adems, dejan abierta la puerta para elevar todava ms el
potencial de ambigedad. Pero esto ser en el captulo siguiente.
Objetivos
El objetivo del presente captulo es que los alumnos comprendan:
1. El concepto de clase y su papel en el aumento de la ambigedad
2. La funcin de los constructores y destructores
3. El diagrama de clase y su importancia para el diseo
4. Las relaciones entre clases
Contenidos
La primera parte estudia en profundidad el concepto de clase y los elementos
que se deben considerar en su diseo desde afuera y desde adentro. Tambin se discute
la funcin de los constructores y destructores.
La segunda parte se ocupa de la representacin grfica de la organizacin de las
clases y destaca la importancia que tiene sobre las propiedades alotrpicas del sistema.
Por ejemplo, la comprensin y la facilidad de modificacin.
La tercera parte discute las posibles relaciones entre clases
66
3.1Las clases
Los objetos se podran definir uno a uno o en conjunto. Para conseguir esto
ltimo se han inventado las clases como las definiciones de los conjuntos de objetos. Ya
se utilizaron en el programa orientado a objetos para pintar crculos. Las clases Crculo,
Ventana y Formulario sirvieron para definir las propiedades de los objetos crculo,
ventana y formulario respectivamente. Algunos lenguajes de programacin permiten
definir uno a uno los objetos y otros, los ms difundidos, exigen la definicin (clase) de
los conjuntos de objetos aunque slo se utilice un elemento.
En general, los conjuntos se definen de forma extensiva o intensiva. Por
ejemplo, el conjunto X formado por los nmero 6 y 7, se puede definir de estas dos
maneras:
X {6, 7}
X {x / x N y 5 < x < 8}
La primera es una definicin extensiva porque enumera todos los elementos del
conjunto, mientras que la segunda es una definicin intensiva porque describe las
propiedades que cumplen todos los elementos del conjunto, sin mencionar los
elementos. Las clases son definiciones del segundo modo.
Clase: es una definicin intensiva de un conjunto de objetos. Es una definicin
intensional porque establece las propiedades (atributos y mtodos) distintivas de
cualquier elemento del conjunto. Por ejemplo, clase crculo {radio, centro,
color, crear, pintar} define que cualquier objeto crculo tiene un radio, un centro,
un color, se puede crear y pintar. Dicho de otra forma, si un objeto tiene estas
propiedades entonces es un crculo, segn la definicin previa. Los valores de
los atributos pueden diferir de un objeto a otro. Todos los objetos de una clase
tienen la misma semntica, las mismas operaciones y los mismos atributos
aunque pueden diferir sus valores.
Considerando las clases se podra decir que un objeto es una instancia (ejemplo
concreto) de una clase o un elemento del conjunto definido por una clase. La notacin
UML de un objeto en particular, teniendo en cuenta la clase a la que pertenece, es
67
La influencia del pensamiento estructurado que asocia a los objetos con datos se
extrapola y asocia las clases con entidades, en el sentido del diagrama entidad-relacin.
Tanto las clases como las entidades son abstracciones pero de variables cualitativamente
distintas: objetos y datos. No obstante, algunas metodologas tempranas de desarrollo
orientado a objetos, como OMT (Object Modelling Technique) combinaban el
diagrama entidad-relacin con el diagrama de flujo de datos para disear las clases del
sistema. Hace quince aos, este procedimiento estructurado de disear objetos era un
68
3.2
69
Entonces, o se tiene una memoria muy buena, o se escribe en algn lugar el significado
de la yuxtaposicin GN3Q o, en vez de usar como nombre las siglas, se usa la lista de
palabras que identifican a cada tarea. Pero, en cualquier caso, qu tarea, de todas las
posibles, est realizando GN3Q en un momento dado? La ambigedad es til, pero
tanta ambigedad desconcierta porque desborda el lmite usual de comprensin humana.
Parece ms prudente asociar una clase con un concepto o idea. Por ejemplo,
crculo, vuelo, sesin de trabajo, rengln, precio, prstamo, extraccin, control de
acceso, segn convenga al diseo. De esta manera, se facilita pensar y expresar las
piezas o elementos del sistema software.
No se trata de copiar la realidad, como se dice a menudo, porque el objetivo del
software no es copiar la realidad, salvo el caso de la simulacin; ni la realidad es
copiable en el software porque el mundo fuera del software es distinto al mundo del
software y, ni siquiera se puede hablar de realidad en sentido absoluto, porque cada
persona tiene una percepcin distinta de la realidad.
Tampoco se trata de descubrir las clases, como tambin se dice con frecuencia,
porque las clases software no existen previamente, se inventan. Las ingenieras,
incluyendo la ingeniera software, crean, inventan realidades, no descubren, ni describen
la realidad, que es una tarea de las ciencias naturales.
Las clases se pueden inventar directamente pensando en la estructura de una
solucin, o se pueden inventar a partir de soluciones semejantes o a partir del trabajo
con los diagramas de interaccin, o de cualquier otro modo, porque en definitiva la
creacin de una clase software, insistiendo, es un acto creativo. Los diseadores
(constructores) de software deben ser capaces de usar muchos modos y criterios de crear
segn sean los objetivos que desean conseguir o priorizar. En el curso se han dado y se
darn diversos modos y criterios de diseo, analizando sus cualidades respectivas para
ayudar a decidir cundo aplicarlos.
El diseo (construccin) de los sistemas software se podra ocupar slo de
conseguir el funcionamiento deseado, si se pudiera conseguir a la primera, si fuese
posible predecir el futuro, si no fuese necesario tocar los sistemas nunca ms; en fin, si
la utopa fuese alcanzable. En el caso contrario, que es el cotidiano y el ms interesante,
el diseo debe considerar tambin otros objetivos. De estos objetivos adicionales, uno
70
3.3
clase. Define:
1. el nombre de cada atributo y su pertenencia a una clase, si es un objeto, o a
un tipo, si es una variable tradicional.
2. el nombre de cada operacin, los parmetros de la operacin y el cdigo que
conforma la operacin. Algunos lenguajes de programacin obligan a definir
el cdigo dentro del mbito de la clase y otros admiten que se defina afuera
y se le relacione, explcitamente, con la clase.
El nombre y las propiedades de la clase deben estar sintonizados para facilitar
que la clase se asocie a un concepto. No se trata de representar un concepto, aunque
pudiera ser, porque en general no se trata de simular y adems, porque asociar ofrece
ms libertad que representar. Si el nombre y las propiedades de las clases estn
sintonizados se facilita localizar y aislar las modificaciones potenciales. Pero este
aspecto del diseo tampoco es de receta. La sintona es subjetiva e imprecisa. Los
siguientes ejemplos pueden ilustrar este hecho.
71
una decisin de diseo que facilita las modificaciones del sistema software
respecto al mecanismo de autorizacin, como se ver despus.
Resumiendo, el diseo del primer caso coloc dentro de una clase una operacin
inusual del concepto asociado. El segundo diseo, segrega la definicin de un atributo
de una clase y le otorga la categora de clase. En el tercer caso, designa como atributo
de una cosa algo que es una cosa diferente, aunque relacionada. Todas son soluciones
vlidas de diseo y adems, tiles, dependiendo de las condiciones particulares del
problema. Ms all de los mtodos, los humanos deben inventar y decidir.
3.4
72
73
Crculo()
Crculo (int centrox, int centroy, int radio, color Color)
Los clientes de la clase Circulo podran utilizar indistintamente uno u otro
mtodo para crear un objeto de esta clase.
Un destructor es un mtodo que libera la memoria destruyendo el objeto. A
diferencia de los constructores, los destructores son mtodos de los objetos. Para
destruir un objeto, se le enva un mensaje a l mismo para que se destruya.
Actualmente los destructores se usan poco porque los lenguajes de programacin
proporcionan mecanismos, como el garbage collector de Java, que se encargan de
destruir automticamente los objetos que no estn siendo utilizados. Sin embargo,
aunque el mtodo destructor no exista, en los diagramas de secuencia se suele mostrar el
mensaje <<destroy>>, para enfatizar que a partir de ese momento el objeto deja de
usarse.
3.5
74
75
76
3.6
77
relacin entre ellas. El resto del diagrama de clases (por ejemplo, Crculo y su relacin
con Formulario) estara asociado con otros diagramas de secuencia
El diagrama de secuencias define el funcionamiento parcial del mecanismo para
pintar crculos (nada dice acerca de cmo se obtiene la informacin para definir los
crculos, ni otros aspectos) y el diagrama de clases, correspondiente, describe la
organizacin de los elementos del sistema, en trminos de los conjuntos y sus
relaciones:
El sistema est formado por objetos ventana y crculo; todos los objetos ventana
usan a objetos crculo y adems, los objetos crculos tienen las propiedades de
crearse y pintarse.
Es importante observar que el diagrama de clases se puede obtener, aunque sea
de forma parcial, de los diagramas de secuencias. Pero, no al revs. Del diagrama de
clases no se pueden obtener los diagramas de secuencia. Viendo el diagrama de clases
no se sabe cmo funciona el sistema. Sin los diagramas de secuencia la descripcin del
sistema queda incompleta. Pero tampoco los diagramas de secuencia son suficientes
para describir el sistema porque faltaran los atributos de los objetos, operaciones
internas, las relaciones jerrquicas entre clases y entre objetos.
78
Dependencia
Se denomina relacin de dependencia, o de uso, a la relacin de una clase hacia
otra, cuando los objetos de la primera utilizan objetos de la segunda, como argumento
en alguna operacin, o sus objetos utilizan alguna de las operaciones de la otra clase. La
relacin de dependencia es una relacin direccional porque los objetos que usan
dependen de la especificacin de los objetos usados, mientras que los usados son
independientes de quin los usa.
En UML la relacin de dependencia se representa con una flecha discontinua del
elemento dependiente A hacia el elemento independiente B (del que usa hacia el usado).
79
pero que puede ser muy fuerte entre clases si el diseo descuida la ambigedad de la
relacin. Por ejemplo, es una relacin muy fuerte cuando el objeto dependiente se trae
atributos del otro objeto para procesarlos como sucede en el caso de la extraccin de
dinero del cajero automtico.
Asociacin
Se denomina relacin de asociacin a la relacin de una clase hacia otra, cuando
los objetos de la primera contienen atributos que son objetos de la segunda. La relacin
de asociacin permite navegar de los objetos que contienen a los objetos contenidos.
La asociacin se presenta en dos modalidades unidireccional y bidireccional. En la
primera, al menos un atributo de los objetos de una clase pertenece a otra clase. En la
segunda, los objetos de cada clase contienen al menos un atributo perteneciente a la otra
clase.
En UML la asociacin unidireccional se representa con una flecha continua de la
clase que contiene a la clase cuyos objetos son contenidos. La asociacin bidireccional
se representa con una lnea continua entre las clases asociadas. Figura 3. 8
81
Ventana::Ventana {
crculo1 nuevoCrculo
crculo2 nuevoCrculo
crculo1.Pintar
crculo2.Pintar
}
En una relacin de asociacin, el vnculo del objeto continente con el objeto
contenido es permanente. Es una relacin fuerte entre objetos que dificulta la plasticidad
del software.
82
Agregacin
Se denomina relacin de agregacin entre clases cuando hay una relacin
todo/parte entre los objetos de ambas clases. En el ejemplo del sistema para pintar
crculos, se puede decir que la clase Ventana tiene una relacin de agregacin con la
clase Crculo porque su respectivos objetos tienen una relacin todo/parte.
En UML se utiliza una lnea continua y un rombo en el lado del todo para
representar una relacin de agregacin. Figura 3. 9.
84
85
3.8
Ejercicio
Queremos construir una aplicacin que pinte un tringulo en la pantalla. La
aplicacin debe permitir que el cliente introduzca los datos del tringulo.
86
3.9
Solucin
De modo semejante a como se hizo en el problema de los crculos, podemos
87
88
}
}
public class Triangulo extends JPanel{
//Coordenada x del vertice superior
private int verticesuperiorx;
//Coordenada y del vertice superior
private int verticesuperiory;
//Base
private int base;
//Altura
private int altura;
//Color
private Color color;
private boolean haydatos=false;
// Crea una nueva instancia de Triangulo */
public Triangulo() {
// Mostrar el formulario para obtener los datos del triangulo
FormularioTriangulo formulario= new FormularioTriangulo();
JDialog dialog =new JDialog();
dialog.setTitle("Introduzca los datos del triangulo");
dialog.setModal(true);
dialog.setContentPane(formulario);
dialog.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
dialog.pack();
dialog.show();
// Obtener los datos introducidos por el usuario
verticesuperiorx=formulario.obtenerVerticeSuperiorx();
verticesuperiory=formulario.obtenerVerticeSuperiory();
base=formulario.obtenerBase();
altura=formulario.obtenerAltura();
color=formulario.obtenerColor();
haydatos=true;
}
public void paint(Graphics g) {
int [] coordenadasx=getCoordenadasX();
int [] coordenadasy=getCoordenadasY();
super.paint(g);
//Si el usuario ha introducido los datos pinta el triangulo
if (haydatos){
g.setColor(color);
g.drawPolygon(coordenadasx, coordenadasy, 3);
g.fillPolygon(coordenadasx, coordenadasy, 3);
g.dispose();
}
}
private int [] getCoordenadasX(){
int [] coordenadasx = new int [3];
coordenadasx[0]=verticesuperiorx;
coordenadasx[1]=verticesuperiorx-(base/2);
89
coordenadasx[2]=verticesuperiorx+(base/2);
return coordenadasx;
}
private int [] getCoordenadasY(){
int [] coordenadasy= new int[3];
coordenadasy[0]=verticesuperiory;
coordenadasy[1]=verticesuperiory+altura;
coordenadasy[2]=verticesuperiory+altura;
return coordenadasy;
}
public void mover (int desplazamientox, int desplazamientoy){
verticesuperiorx = verticesuperiorx + desplazamientox;
verticesuperiory = verticesuperiory + desplazamientoy;
}
public void ampliar (int zoomin){
if (zoomin > 0){
base= base * zoomin;
altura=altura*zoomin;
}
}
public void reducir (int zoomout){
if (zoomout > 0){
base = base / zoomout;
altura = altura / zoomout;
}
}
public void borrar(){
//Pintarme del color del fondo de la ventana
color= this.getBackground();
repaint();
}
}
public class FormularioTriangulo extends JPanel{
//Valores de los cuadros de texto
private int verticesuperiorx;
private int verticesuperiory;
private int base;
private int altura;
private Color color;
//Etiquetas de los campos de texto
private JLabel verticesuperiorxLabel;
private JLabel verticesuperioryLabel;
private JLabel baseLabel;
private JLabel alturaLabel;
private JLabel colorLabel;
//Textos de las etiquetas
private static String verticesuperiorxString = "Coordenada x del vrtice superior: ";
90
91
contentPane.setLayout(new BorderLayout());
contentPane.add(labelPane, BorderLayout.CENTER);
contentPane.add(fieldPane, BorderLayout.EAST);
add(contentPane);
}
//Obtiene el Color seleccionado por el usuario
public Color obtenerColor()
{
String string=(String)colorField.getSelectedItem();
Color color;
if (string.equals("Azul"))
color=Color.BLUE;
else if (string.equals("Verde"))
color=Color.GREEN;
else if (string.equals("Naranja"))
color=Color.ORANGE;
else if (string.equals("Rojo"))
color=Color.RED;
else if (string.equals("Amarillo"))
color=Color.YELLOW;
else if (string.equals("Gris"))
color=Color.GRAY;
else
color=Color.BLACK;
return color;
}
//Obtiene la coordenada x del vertice superior introducida por el usuario
public int obtenerVerticeSuperiorx(){
if (verticesuperiorxTextField.getText()!= null)
return Integer.parseInt(verticesuperiorxTextField.getText());
else
return 0;
}
//Obtiene la coordenada y del vertice superior introducida por el usuario
public int obtenerVerticeSuperiory(){
if (verticesuperioryTextField.getText()!= null)
return Integer.parseInt(verticesuperioryTextField.getText());
else
return 0;
}
//Obtiene la base introducida por el usuario
public int obtenerBase(){
if (baseTextField.getText()!= null)
return Integer.parseInt(baseTextField.getText());
else
return 0;
}
//Obtiene la altura introducida por el usuario
public int obtenerAltura(){
if (alturaTextField.getText()!= null)
return Integer.parseInt(alturaTextField.getText());
else
return 0;
}
}
92
93
3.10 Ejercicio
Queremos construir una aplicacin que pinte un rectngulo en la pantalla. La
aplicacin debe permitir que el cliente introduzca los datos del rectngulo.
94
3.11 Solucin
Como en el ejercicio anterior, podemos pensar en tres objetos: ventana,
rectngulo y formulario.
1. el objeto rectngulo ser la variable software capaz de recordar las constantes de
un rectngulo, capaz de crearse a s misma y, adems, capaz de pintar el
rectngulo.
rectngulo {vrtice superior izquierdo, base, altura, color, crear, pintar}
2. el objeto ventana que contendr el rectngulo .
ventana {rectngulo, crear, pintar}
3. y el objeto formulario que ser el encargado de leer los datos necesarios para
crear el rectngulo.
formulario {crear, leer}
La Figura 3. 13 muestra el diagrama de clases de esta solucin.
95
96
}
public class Rectangulo extends JPanel{
//Coordenada x del vertice superior izquierdo
private int origenx;
//Coordenada y del vertice superior izquierdo
private int origeny;
//Base
private int base;
//Altura
private int altura;
//Color
private Color color;
private boolean haydatos=false;
//Crea una nueva instancia de Rectangulo
public Rectangulo() {
// Mostrar el formulario para obtener los datos del rectangulo
FormularioRectangulo formulario= new FormularioRectangulo();
JDialog dialog =new JDialog();
dialog.setTitle("Introduzca los datos del rectangulo");
dialog.setModal(true);
dialog.setContentPane(formulario);
dialog.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
dialog.pack();
dialog.show();
// Obtener los datos introducidos por el usuario
origenx=formulario.obtenerOrigenx();
origeny=formulario.obtenerOrigeny();
base=formulario.obtenerBase();
altura=formulario.obtenerAltura();
color=formulario.obtenerColor();
haydatos=true;
}
public void paint(Graphics g) {
super.paint(g);
//Si el usuario ha introducido los datos pinta el rectangulo
if (haydatos){
g.setColor(color);
g.drawRect(origenx,origeny,base,altura);
g.fillRect(origenx,origeny,base,altura);
g.dispose();
}
}
public void mover (int desplazamientox, int desplazamientoy){
origenx=origenx+desplazamientox;
origeny=origeny+desplazamientoy;
}
public void ampliar (int zoomin){
if (zoomin > 0){
97
98
99
else if (string.equals("Amarillo"))
color=Color.YELLOW;
else if (string.equals("Gris"))
color=Color.GRAY;
else
color=Color.BLACK;
return color;
}
//Obtiene la coordenada x del vertice superior izquierdo introducida por el usuario
public int obtenerOrigenx(){
if (origenxTextField.getText()!= null)
return Integer.parseInt(origenxTextField.getText());
else
return 0;
}
//Obtiene la coordenada y del vertice superior izquierdo introducida por el usuario
public int obtenerOrigeny(){
if (origenyTextField.getText()!= null)
return Integer.parseInt(origenyTextField.getText());
else
return 0;
}
//Obtiene la base introducida por el usuario
public int obtenerBase(){
if (baseTextField.getText()!= null)
return Integer.parseInt(baseTextField.getText());
else
return 0;
}
//Obtiene la altura introducida por el usuario
public int obtenerAltura(){
if (alturaTextField.getText()!= null)
return Integer.parseInt(alturaTextField.getText());
else
return 0;
}
}
100
101