Beruflich Dokumente
Kultur Dokumente
DESARROLLO
ELEMENTAL
OO
LUIS ERNESTO
RUBIO TORRES
AGOSTO 2006
Contenido
ALUMNO: ADA LOVELACE EXAMEN PARCIAL: 10.0 EXAMEN FINAL: 10.0 PROMEDIO: 10.0
.......................................................................................................................................................................... 20
ALUMNO: ADA LOVELACE EXAMEN PARCIAL: 10.0 EXAMEN FINAL: 10.0 PROMEDIO: 10.0
.......................................................................................................................................................................... 22
Con base en los principios de desarrollo de software orientado a objetos (OO), un sistema (la
aplicación) se construye a partir de un conjunto de elementos (los objetos) enlazados de tal forma,
que proveen la solución al problema.
En el contexto de las aplicaciones, un objeto es una unidad que almacena información y es capaz
de efectuar operaciones; al cual se le asigna una misión dentro del sistema.
0xC1
:Inventor
0xB1
:Invento [ ]
[0] 0x11
[1] 0x15
[2] 0x1A
0x11
:Invento
nombre = Helicoptero
creador = OxC1
Una clase es el equivalente a un plano arquitectónico o instructivo de ensamble a partir del cual
una computadora produce los objetos.
Puede pensarse que una Clase, es un molde o plantilla a partir de la cual la computadora crea
múltiples instancias (los objetos), en dichas clases se declara la configuración (tipos de dato) de
las variables miembro que almacenarán los valores de las características o atributos de los
objetos; valores que en su conjunto determinan el estado de un objeto particular, en un cierto
instante de la ejecución de una aplicación.
Inventor
- nombre : String
- arregloInventos : Invento [ ]
+ getNombre ( ) : String
+ setNombre ( : String )
+ getInventos ( ) : Invento []
+ setInventos ( : Invento[] )
+ getInvento ( index : int )
+ setInvento ( : Invento, index : int )
También es en las Clases, en donde se incluyen los algoritmos o procedimientos que determinarán
el comportamiento de los objetos de una clase; estos algoritmos se codifican en las funciones
miembro (métodos), en donde, se declaran la configuración (tipo) de las variables argumento de
entrada de datos, se programan las instrucciones y se determina la forma del resultado (tipo de
retorno) del proceso efectuado.
En una aplicación se enlazan los objetos, a fin de obtener datos e información de éstos, poder
realizar procesos y/o construir nuevos objetos.
Los Enlaces y Asociaciones son los medios para establecer relaciones entre objetos y clases. Un
enlace es una conexión física entre objetos a tiempo de ejecución de una aplicación. Por su parte
una asociación se emplea al nivel de Clases para describir un grupo de enlaces con estructura y
semántica comunes. De ese modo, puede pensarse en una asociación como un molde o plantilla
a partir de la cual se obtienen múltiples enlaces. Así, un enlace, es una instancia de una
asociación.
Inventor
arreglo Inventos
nombre
1..*
Invento
1 nombre
creador
0xC1
:Inventor
0x11
:Invento
nombre = Helicoptero
creador = OxC1
0xB1
0x15
:Invento [ ]
:Invento
[0] 0x11
[1] 0x15 nombre = Submarino
[2] 0x1A creador = OxC1
0x1A
:Invento
nombre = Paracaidas
creador = OxC1
Puede decirse que una referencia es el nombre a través del cual se manipulan y controlan los
objetos. Un mismo objeto puede ser controlado a partir de múltiples y distintas referencias, en
diferentes partes de una aplicación.
Un atributo de enlace es una propiedad de los enlaces de una asociación. Cuando las
asociaciones tienen atributos de enlace frecuentemente se modelan como clases (cada enlace
pasa a ser entonces, una instancia de tales clases), de modo que pueden poseer además de
atributos (de enlace), un nombre y métodos (del enlace). Todo atributo de enlace tiene un valor
para cada enlace.
Resulta útil modelar las asociaciones como clases cuando los enlaces pueden participar en
asociaciones con otros objetos o cuando están sometidos a operaciones. Las asociaciones
muchos-a-muchos proporcionan el caso de uso mas frecuente de los atributos de enlace, pues
tales atributos son, una propiedad particular del enlace y de ningún modo pueden asociarse
individualmente con alguno de los objetos relacionados.
La generalización (herencia) es la relación entre una clase y una o más versiones refinadas de esa
misma clase. La que se está refinando se denomina superclase (clase base o clase padre) y cada
versión refinada se llama una subclase (clase derivada o clase hija).
Las asociaciones de herencia son transitivas a través de un número arbitrario de niveles. Una
instancia de una subclase, es simultáneamente una instancia de todas sus clases ancestro. El
estado de una instancia incluye un valor para cada uno de los atributos de todas sus clases
ancestro. Todo método aplicable a una clase ancestro podrá ser aplicado a una instancia suya.
Además una subclase añade a sus miembros heredados, sus propios atributos y métodos
específicos
Entre las principales necesidades de la industria de desarrollo de sistemas a gran escala, destaca
la de integración, estandarización y generalización de código, de la cual se desprende la
posibilidad de reutilización de software.
El lenguaje de programación Java ofrece una serie de mecanismos avanzados de sus clases para
lograr de una forma efectiva la integración y generalización de procesos, así como para promover
la estandarización y reutilización de código. Estos mecanismos incluyen a las Clases Abstractas,
las Interfaces, y las Clases Anidadas.
Las Clases Abstractas son superclases que declaran métodos que no tienen implementación (es
decir que carecen de instrucciones). A dichos métodos se les llama métodos abstractos y por
tanto las clases que los contienen se denominan Clases Abstractas. La implementación
(instrucciones) de los métodos abstractos se proporciona en las subclases de la clase abstracta.
La utilidad de las clases abstractas radica en que aprovecha el mecanismo de invocación virtual
de métodos para permitir la programación de métodos genéricos (esto es, permitir que un solo
método sea empleado para cumplir adecuadamente las tareas de objetos de múltiples subclases).
Una clase “implementa” una interface cuando define las instrucciones de todos y cada uno de los
métodos declarados por dicha interface. La misma interface puede ser implementada por múltiples
clases, mientras que a su vez, una clase puede implementar varias interfaces (a diferencia de la
herencia, pues cada clase únicamente puede extender a sólo una superclase).
//Animal.java
public abstract class Animal {
protected int legs;
//Spider.java
public class Spider extends Animal {
public Spider() {
super(8);
} //Cat.java
public class Cat extends Animal implements Pet {
public void eat() { private String name;
System.out.println("Spiders catch flies in their webs to eat.");
} public Cat(String name) {
} super(4);
this.name = name;
}
public Cat() {
this("");
}
Para utilizar este patrón, basta sustituir las variables X, Y, Z, por conceptos que se relacionen en el mundo real bajo asociaciones “a uno” y “a
muchos”. Por ejemplo si se sustituyen X = Médico, Y = Hospital, Z = Pacientes, en los modelos UML siguientes, pueden escribirse las clases para
generar objetos en donde un médico trabaja en un hospital y tiene muchos pacientes. Si X = Corporación, Y = Departamento, Z = Empleado;
puede escribirse código para crear objetos en donde un departamento con muchos empleados pertenece a una corporación.
Otro ejemplo sería, cuando se hace que X = Industria, Y = Almacén, Z = Producto; el almacén de una industria guarda muchos productos. Otro
más, si X = Juego, Y = Personaje, Z = Arma, podrían generarse objetos como las muchas armas de Batman, en el juego de la “Liga de la
Justicia”.
En la siguiente página se ilustran los modelos de diseño del el patrón de código, con métodos para gestionar – alta, baja, cambio, consulta, los
enlaces entre objetos de las clases X,Y, Z y la misión de cada una – por ejemplo el método misión de un objeto médico incluiría instrucciones para
aliviar a sus pacientes.
X
oneY : Y
data : type
misiónX ( )
oneX : X
oneY 1 collectionZs
collectionZs
Y z
:Z
:Z
:Z
Modelo de Objetos
Modelo de Diseño Conceptual
Luis Ernesto Rubio T.
Problemas y Ejercicios Elementales de Modelado OO Hoja 10
public class X {
private type data; X
private Y oneY;
private Zs collectionZs; data : type
misiónX ( ) {... } misiónX ( )
X ( ) { // the X Constructor ... }
void setData (type aData)
{data = aData; } X()
type getData ( ) {return data; }
void deleteData ( ) {... }
Modelo de Diseño Operativo
void setY (Y oneY)
setData (:type )
{ this.oneY = oneY} getData ( ) :type
Y getY ( ) {return oneY }
void deleteY ( ) {oneY = null }
deleteData ( )
void setZs (Zs collectionZs ) {... }
Zs getZs ( ) { return collectionZs } setY ( :Y)
void deleteZs ( ) getY ( ) : Y
{ collectionZs = null }
deleteY ( )
int sizeZs ( ) {... }
boolean isEmptyZs ( ) {... }
setZs ( : Zs)
void add/setZ ( Z oneZ) {... } getZs ( ) : Zs
Z getZ ( ) {... }
boolean contains (Z oneZ ) {... } deleteZs ( )
void remove/deleteZ (Z oneZ ) {... }
add/setZ ( : Z)
contains/getZ ( ): Z
remove/deleteZ (:Z
Patrón en Lenguaje Java
)
nextZ ( ) : Z
hasNextZ ( ) : bool
Luis Ernesto Rubio T.
previousZ ( ) : Z
hasPreviousZ()
:bool
Problemas y Ejercicios Elementales de Modelado OO Hoja 11
ANÁLISIS Y DISEÑO
ITERATIVO
Responde a las preguntas imaginando e inventando una serie de cosas (tangibles o intangibles,
reales o artificiales, concretas o abstractas, animadas o inanimadas) a las cuales dotarás de
capacidades de procesamiento dinámicas para resolver el problema; y con ellas modela (dibuja)
un Diagrama de Instancias UML y a partir de éste, modela el correspondiente Diagrama de Clases
UML al nivel de Análisis es decir, sólo especifica los nombres de los atributos y asociaciones.
Nota: Diagrama de Clases.- representa las plantillas o moldes del sistema que permiten crear los
objetos en la memoria de la computadora para efectuar los procesos y así satisfacer los Casos de
Uso.
Nota: Para acceder a los datos (propiedades o atributos) diseña un par de mensajes de acceso
set/get.
Nota: Para acceder a los objetos mediante un enlace de cardinalidad “a uno” diseña un par de
mensajes de acceso set/get. Para acceder a los objetos mediante un enlace de cardinalidad “a
muchos” diseña dos pares de mensajes de acceso set/get; el primero para acceder a la colección
total, y el segundo par set/get para acceder a un elemento individual de la colección.
Tim Solley abrió una cuenta con $ 500.00 USD en el banco más importante de su comunidad, y realizó una
serie de transacciones durante la semana subsecuente a la apertura de su cuenta bancaria. Dichas
transacciones incluyeron: un retiro inicial de $150.00, un depósito de $ 22.50, otro retiro de $ 47.62 y
finalmente la impresión del balance (saldo) de su cuenta.
Modele mediante ADOO una aplicación que permita llevar el registro del balance para diferentes cuentas
bancarias semejantes a las de Tim Solley y codifique en Java un programa que despliegue en la pantalla de
la consola un reporte con las transacciones de este cliente bancario:
Se responde a las preguntas imaginando e inventando una serie de cosas (tangibles o intangibles, reales
o artificiales, concretas o abstractas, animadas o inanimadas) a las cuales dotaras de capacidades de
procesamiento dinámicas para resolver el problema; y con ellas se modela (dibuja) un Diagrama de
Instancias UML y a partir de éste, se modela el correspondiente Diagrama de Clases UML al nivel de
Análisis es decir, sólo especifica los nombres de los atributos y asociaciones.
Diagrama de Instancias.- representa gráficamente a los objetos que en la memoria de la computadora llevan a
cabo los procesos del sistema, incluyendo sus atributos (características) y enlaces (conexiones).
TestBanking Account
balance
Diagrama de Clases.- representa las plantillas o moldes del sistema que permiten crear los objetos en la
memoria de la computadora para efectuar los procesos y así satisfacer los Casos de Uso.
Se responde a la pregunta modelando un Diagrama de Clases al nivel de Diseño (incluye tipos de datos
de los atributos, nombres de métodos, argumentos y sus tipos de datos, tipos de retorno de los métodos).
package banking;
Desarrolle una aplicación OO para obtener la lista de los alumnos del instructor de SuperSoftware y
codifíquela en lenguaje Java. Modele mediante ADOO la clase necesaria para generar los objetos
que permitan registrar y recuperar los datos: nombre, calificación del examen parcial y calificación
del examen final, y que proporcione el cálculo de la calificación final de los alumnos.
Tip: Revisa el “Use Case Diagram” del Ejemplo 1: La Cuenta Bancaria de Tim Solley
Tip: Hay de 3 a 5 casos de uso, dos de ellos son “Ingresar Datos del Alumno” y “Calcular Promedio”
Responde a las preguntas imaginando e inventando una serie de cosas (tangibles o intangibles, reales o
artificiales, concretas o abstractas, animadas o inanimadas) a las cuales dotaras de capacidades de
procesamiento dinámicas para resolver el problema; y con ellas modela (dibuja) un Diagrama de
Instancias UML y a partir de éste, modela el correspondiente Diagrama de Clases UML al nivel de
Análisis es decir, sólo especifica los nombres de los atributos y asociaciones.
Tip: Revisa el “Instance Diagram” y el “Class Diagram” del Ejemplo 1: La Cuenta Bancaria de Tim Solley
Tip: El diagrama de instancias debe tener 4 objetos, uno de ellos tiene 3 atributos: el nombre “Ada_Lovelace”
y dos calificaciones de 10
Puedes responder a la pregunta modelando un Diagrama Secuencia UML En esta etapa debes imaginar
que los objetos pueden comunicarse unos con otros a través de mensajes o llamadas, que contienen
datos (parámetros), estos mensajes son equivalentes a órdenes o solicitudes, de modo que un objeto le
puede pedirle a otro que haga algo; piensa qué mensajes o solicitudes puede recibir un cierto objeto para
llevar a cabo una actividad importante dentro del sistema.
Tip: Revisa el “Secuence Diagram” del Ejemplo 1: La Cuenta Bancaria de Tim Solley
Tip: Los mensajes para el objeto alumno podrían ser new Alumno() y setNombre(“Ada Lovelace”)
Tip: Revisa el “Collaboration Diagram” del Ejemplo 1: La Cuenta Bancaria de Tim Solley
Tip: Otro de los mensajes para el objeto alumno puede ser: setCalificaciónParcial(10)
Tip: Revisa el “Collaboration Diagram” del Ejemplo 1: La Cuenta Bancaria de Tim Solley
Tip: incluye mensajes como: getNombre() y calculaPromedio()
Puedes responder a la pregunta modelando un Diagrama de Clases al nivel de Diseño (incluye tipos de
datos de los atributos, nombres de métodos, argumentos y sus tipos de datos, tipos de retorno de los
métodos).
Tip: Revisa el “Class Diagram” del Ejemplo 1: La Cuenta Bancaria de Tim Solley
Tip: por ejemplo puedes especificar que el atributo nombre es privado y de tipo String así: - nombre: String
Tip: podrías especificar métodos como: +calculaPromedio( ):double y +
setCalificacionParcial(:double):void
Alumno: Ada Lovelace Examen Parcial: 10.0 Examen Final: 10.0 Promedio: 10.0
Tip: Revisa el código Java del Ejemplo 1: La Cuenta Bancaria de Tim Solley
I AppListaTop3
Ingresar Datos Personales
– nombre : String
:AppListaTop3 ada : Alumno – exParcial : int
<<usa>> – exFinal : int
nombre = “Ada Lovelace”
exParcial = 10 + setNombre( argumentoNombre: String ) :
exFinal = 10 + setParcial ( argumentoParcial : double ) :
+ setFinal ( argumentoFinal : double) : void
Diagrama UML de Instancias
+ getNombre( ) : String
III + getParcial ( ) : double
AppListaTop3 <<usa>> Alumno + getFinal ( ) : double
nombre
I no m b re
2: getParcial( )
new Alumno ( )
exParcial
setNombre(“Ada Lovelace”)
3: getFinal( )
setParcial( 10 )
exFinal
setFinal( 10 ) 4: calcularPromedio( )
DISEÑO II
(exParcial + exFianal) / 2
// AppListaTop3.java // Alumno.java
:Inventor
Diagrama de Instancias
Inventor
arreglo Inventos
nombre
1..*
Invento
1 nombre
creador
Inventor
- nombre : String
- arregloInventos : Invento [ ]
Invento
- nombre : String
- creador : Inventor
package learning.business.inventos;
package learning.business.inventos;
textAreaGUI.append(reporte);
System.out.print(reporte);
0xC1
:Inventor
0x11
:Invento
nombre = Helicoptero
creador = OxC1
0xB1
0x15
:Invento [ ]
:Invento
[0] 0x11
[1] 0x15 nombre = Submarino
[2] 0x1A creador = OxC1
0x1A
:Invento
nombre = Paracaidas
creador = OxC1
textAreaGUI.append(reporte);
System.out.print(reporte);
María y Juan, son hermanos, ambos profesionistas Ingenieros de Software; por las tardes, después del trabajo, Juan desempeña el papel de
padre de familia y María, por su parte, estudia una maestría.
A propósito de los roles personales, María debe desarrollar un software de análisis con fines estadísticos, que facilite el registro de los distintos
roles que una persona asume. Se desea que dicho estudio estadístico contemple a personas de los distintos estados de nuestro país;
considerando además, para fines de control algunos datos del acta de nacimiento de las personas.
María debe registrar para cada persona, el nombre, la edad, su sexo y un número consecutivo de identificación; en el caso de los roles contempla
un número de rol y la descripción del rol (por ejemplo al rol padre de familia corresponde el número de rol 10 y su descripción es "padre_familia").
Con respecto de las Actas de Nacimiento, María sabe que los datos número de libro y folio bastan para localizar cada acta, sin embargo, adicionó
un número secuencial a cada acta, a fin de emplearlo como único identificador de estas. Finalmente, de los estados del país, decide registrar el
nombre del estado y un número de control que ella misma asignó a cada estado.
:Persona
numero = 2
nombre = Eva
:Estado
:Acta
numero = 10
numero = 77777 nombre = Veracruz
Libro = 007
folio = 70
Persona Estado
acta
Acta Rol
Persona
numero : int
nombre : char *
edad : double
sexo : char
acta : Acta
edoNac : Estado
roles : Rol [ ]
objPersona.setRoles(new Rol[3]); reporte = reporte + "Los datos de mi Acta de Nacimiento son:" + "\n"
+ "\t#Libro: " + objPersona.getActa().getLibro() + "\n"
for (int i = 0; i < 3; i++){ + "\t#Folio: " + objPersona.getActa().getFolio() + "\n";
objPersona.setRol(new Rol(), i);
objPersona.getRol(i).setNumero(i + 1); reporte = reporte + "Las actividades que desempeño son:" + "\n";
if(i == 0){ for (int i = 0; i <= 2; ++i){
objPersona.getRol(i).setNombre("Profesionista"); reporte = reporte + "\t" + objPersona.getRol(i).getNombre() + "\n";
}else if(i == 1){ }
objPersona.getRol(i).setNombre("Estudiante"); reporte = reporte + "----------------------------------------" + "\n";
}else if(i == 2){
objPersona.getRol(i).setNombre("Conyuge"); System.out.print(reporte);
}
}
0xA1
0xB1
0xD1 :Persona
:Rol [ ]
:Acta
numero = 1
0xC1 nombre = Eva [0] 0x11
numero = 21 edad = 18 [1] 0x15
libro = 88 sexo = F [2] 0x1A
:Estado
folio = 22 acta = 0xD1 [3] 0x1B
numero = 10 edoNac = 0xC1
nombre = Veracruz roles = 0xB1
Se desea crear un sistema que registre la siguiente información: nombre, teléfono y especialidad
de los investigadores; de cada proyecto: el nombre, el tiempo estimado de desarrollo, la fecha de
inicio, el presupuesto asignado y el objetivo del proyecto. Así también se desean obtener reportes
con los horarios y pagos correspondientes a cada investigador por proyecto, y los horarios y pagos
correspondientes por proyecto a cada líder, así como los pagos totales por persona. A continuación
se ilustran algunos de los reportes que debe obtener el sistema:
Proyecto: Aspirinix AB
Líder: Lili
Horario/gestión de proyecto: 6:00 – 9:00 hrs.
Salario/gestión de proyecto: USD $ 100.00
Investigadores:
Nombre: Lola Horario: 09:00 – 14:00 Salario: USD $ 95.00
Nombre: Lulú (I) Horario: 09:00 – 15:00 Salario: USD $ 120.00
Nombre: Leda Horario: 09:00 – 15:00 Salario: USD $ 150.00
Nombre: Lili Horario: 09:00 – 15:00 Salario: USD $ 125.00
// Código: TestInvestigador
System.out.print(reporte);
// Código: TestLider
System.out.print(reporte);
lili.setID("inv001");
lili.setNombre("Lili");