Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. GÉNESIS
Esto resolvió los dos problemas que tenían: en primer lugar ya no era
necesario que el diseñador del programa fuese experto en informática, simulación e
ingeniería; se precisaba solo ser un buen informático, pero el diseño se limitaba a
reproducir informáticamente el diseño físico proporcionado por el ingeniero
mecánico.
En segundo lugar las modificaciones del programa también quedaban
resueltas; pues si se sustituía una pieza solo habría que cambiar la pieza
informática homónima y cambiarle sus atributos, recompilar todo el sistema de
2 · Fundamentos de programación
hereda aunque se pueden introducir ciertos cambios como serían nuevos atributos
y operaciones. Esto nos ofrece ventajes como la reutilización, posibilidad de
ampliación, un bajo coste de mantenimiento y una forma de relacionar clases de un
modo que sea sensato desde un punto de vista semántico.
La herencia también se puede ver como forma de compartir código, de
forma que cuando se utiliza la herencia para definir una nueva clase sólo se debe
añadir aquello que sea diferente. Es por eso que a la programación con herencia
también se le llame programación por diferencias.
Otro aspecto de la herencia es la herencia múltiple, consistente en definir
por herencia una clase a partir de dos o más superclases
La reutilización aumenta la
productividad en el desarrollo del software.
En el diseño clásico podíamos reutilizar de
forma muy limitada: determinadas funciones
o subaplicaciones que, a menudo requerían
de otras aplicaciones del programa o no
funcionaban exactamente como queríamos.
En la orientación a objetos podemos
reutilizar mucho más porque las piezas son
más pequeñas; si además estas piezas se han diseñado pensando en su
reutilización posterior, llegamos a niveles muy significativos de reaprovechamiento,
hecho que favorece un incremento de la productividad.
Alumno
Nombre
DNI
Dirección
Población
Fecha_Nacimiento
Curso
ObtenerNombre()
EstablecerNombre()
ObtenerDNI()
EstablecerDNI()
…
Para cada atributo, lo iniciaremos con public si queramos que pueda ser
visto por cualquiera o como private si queremos ocultarlo los atributos desde el
exterior.
INTRODUCCIÓN AL UML
un sistema, incluyendo tanto los que ofrecen una visión global del sistema como los
más detallados de alguna de sus partes. Para comprender el objetivo del modelado
con UML, es muy útil compararlo con otras áreas de ingeniería, como es la
construcción de edificios o automóviles, con sus diferentes planos y vistas; o
incluso con la industria cinematográfica, donde la técnica del storyboarding
(representación de las secuencias de un película con viñetas dibujadas a mano)
constituye un modelado del producto1.
La especificación, visualización, construcción y documentación de cualquier
sistema software requiere que el sistema pueda ser estudiado desde diferentes
puntos de vista, ya que un usuario final necesita una visión diferente del sistema de
la que necesita un analista o un programador. UML incorpora toda una serie de
diagramas y notaciones gráficas y textuales destinadas a mostrar el sistema desde
las diferentes perspectivas, que pueden utilizarse en las diferentes fases del ciclo de
desarrollo del software.
Debemos tener claro también que un diagrama de clases UML (esto es
aplicable a cualquier tipo de diagrama UML) es tan sólo una vista del modelo
estático del sistema en cuestión, esto quiere decir que una misma clase puede
aparecer en varios diagramas y que podemos crear más de un diagrama, bien si es
el número de clases es elevado o bien si queremos mostrar dos o más partes del
sistema que tienen poco que ver en diagramas separados.
Clases y Objetos
Implementación
/**
* La clase CuentaBancaria representa cuentas bancarias en las
* que se mantiene un saldo.
* @author Miguel Angel Sicilia
*/
public class CuentaBancaria {
/** Número de cuenta*/
private String numero;
/** Saldo en euros de la cuenta*/
protected float saldo;
/**
* Constructor de una cuenta bancaria.
* @param numero numero identificativo de cuenta
* @param saldoInicial saldo inicial de la cuenta
*/
public CuentaBancaria(String numero, float saldoInicial){
this.numero = numero;
saldo = saldoInicial;
}
/**
* Getter para el saldo de la cuenta.
*/
public float getSaldo() {
return saldo;
}
/**
* Getter para el numero de la cuenta.
12 · Fundamentos de programación
*/
public String getNumero(){
Introducción al Lenguaje De modelado Unificado.
return numero;
}
/**
* Aumenta el saldo en la cantidad indicada.
* @param cantidad la cantidad a ingresar
*/
public void ingresar(float cantidad){
saldo += cantidad;
}
/**
* Disminuye el saldo en la cantidad indicada.
* @param cantidad la cantidad a retirar
*/
public void retirar(float cantidad)
throws SaldoResultanteNoPermitido{
saldo -= cantidad;
}
}
Nótese que hemos definido el atributo saldo protected al darnos cuenta que posibles futuras
subclases
podrían requerir su manipulación. También hemos declarado que el método retirar puede
lanzar una
excepción definida por nosotros. Aunque en el código de esta clase no lo hace, posiblemente
lo hará el
código de subclases que por ejemplo, no permitan que una cuenta de un tipo determinado
quede en
“números rojos”.
Una relación entre clases se puede definir como una conexión entre dos
o más clases. En orientación a objetos, las principales relaciones que se pueden
establecer entre clases son las de generalización (o herencia), asociación,
agregación y dependencia (o uso).
Las asociaciones representan relaciones estructurales entre clases. En
UML, se define una asociación como una relación que describe un conjunto de
enlaces, donde cada enlace define una interconexión semántica entre instancias de
las clases que participan en la asociación. Se dice que las instancias de una de las
clases “conocen” a las instancias de la otra clase a las que están enlazadas.
continua que conectan dos clases (aunque puede darse el caso particular en que
Fundamentos de programación · 13
las dos clases involucradas en la asociación binaria sean la misma. En este caso,
hablamos de asociaciones reflexivas).
Una dependencia entre clases denota una relación de uso entre las
mismas. Esto quiere decir que si la clase de la que se depende cambia, es posible
que se tengan que introducir cambios en la clase dependiente. Por ejemplo, cuando
un método de la clase A tiene como parámetro un objeto de la clase B, decimos
que A depende de B, usa sus servicios.
Por ejemplo, si tenemos una clase Impresora que tiene una operación
imprimir que toma como parámetro una instancia de la clase Documento, diremos
que Impresora depende de Documento. Nótese que las impresoras no mantienen
enlaces con los documentos que imprimen, sólo los procesan con la operación
correspondiente, pero después de cada llamada a imprimir, no “recuerdan” los
documentos que imprimieron. Se dice que este es el tipo de relación entre clases
“más débil”, y como recomendación general, sólo debería mostrarse en los
diagramas cuando aporten alguna información importante.
1. HERENCIA
que les es común para crear la superclase alumno y posteriormente creamos las
subclases con las diferencias entre cada una de ellas.
2. TIPOS DE CLASES
Existen tres tipos de clases: las abstractas, diferidas y genéricas. Todas son
inutilizables directamente, es decir, no permiten crear instancias, pero en cada caso
por razones diferentes:
Las clases abstractas no se pueden utilizar para crear instancias en
nuestra aplicación porque describe aspectos que tienen otras clases en nuestro
dominio. EN el ejemplo de las clases Alumno, AlumnoDoctorado y AlumnoBecario;
alumno es una clase abstracta en nuestro programa del que no vamos a crear
instancias si hacemos un programa de doctorado. En ese caso utilizaremos
AlumnoDoctorado y consecuentemente, también Alumno, ya que la primera es
descendente de esta, pero solo crearemos alumnos de Doctorado. Pero sin os piden
una aplicación demográfica clasificada en alumnos estudiantes, trabajadores o
jubilados, la clase Alumno sería perfectamente adecuada y, en el segundo caso, no
sería una clase abstracta.
Las clases diferidas son las que incorporan servicios diferidos y, por ello,
no permiten crear instancias.
Las clases genéricas o parametrizadas son aquellas que tienen algún
atributo sin implementar, cuando las queremos usar llamamos a la clase e
implementamos para nuestro caso específico ese atributo que le falta.
Las clases terminales son aquellas que no pueden tener subclases, pues
las hemos bloqueado precisamente para evitar cambios futuros con la herencia.
Cuando hay herencia y se han utilizado aserciones hay que tener en cuenta que
las precondiciones de la superclase se añaden a las subclases con or (se debe
cumplir la precondición de la clase o bien alguna de las superclases) por lo que será
igual o más débil que la original.
Las postcondiciones se añaden con and y será por lo tanto igual o más fuerte
que la original, pues debe cumplir la poscondición de la clase y también de las
superclases.
Cuando una aserción no se cumple se puede forzar la ejecución de una
excepción, es decir, un tratamiento de error; y se activa cuando una o varias de
las condiciones expresadas por una aserción no se cumplen. Tiene dos partes el
tratamiento de una excepción:
La que provoca el error y lanza la excepción (throw).
La que captura la excepción y la trata (match).
A modo de resumen
22 · Fundamentos de programación
1. ELEMENTOS BÁSICOS
Encontramos:
Comentarios: Se suelen añadir del mismo modo que en C++; el primer
tipo de comentario empieza con “/*” y acaba con “*/” y normalmente no se
pueden anidar. Otro tipo de comentario y que luego se utilizará para
generar la documentación en javadoc son los que empiezan por “/**” y
acabn con “*/”. Otro tipo de comentario es el que se extiende desde “//”
hasta el final de la linea de texto, no puede ocupar más.ç
Sentencias: Es una acción ejecutable y puede ocupar una o más líneas,
las sentencias van separadas por el punto y coma.
Bloques de código: Las sentencias se suelen agrupas en bloques para
que de forma sencilla, una sola pueda controlar la ejecución de muchas. Al
igual que en C los bloques de código se delimitan por las llaves “{“ y “}”.
Palabras reservadas: Son las que tienen un significado especial para el
compilador Java y que, por tanto, no podemos usar, como int, new, bolean,
byte, etc.
2. TIPOS DE DATOS
<,>,>=,
Verifica magnitudes 7 Izquierda
<=
== Verifica la igualdad 8 Izquierda
¡= Verifica la desigualdad 8 Izquierda
Condicional: retorna uno
?: de los operandos en 14 Derecha
función de un tercero
¡ Negación 2 Derecha
&& AND Condicional 12 Izquierda
|| OR Condicional 13 Izquierda
4. APPLETS
Un Applet siempre tiene que estar dentro de una página web, y la etiqueta que
lo contiene puede tener muchos parámetros, pero nos interesan sobre todo 3:
1. Code: Indica cual es el archivo que tiene el código del applet. Se debe
especificar aquí el archivo ya compilado con extensión class.
2. Width: Indica al navegador el ancho (en píxeles) del applet dentro de la
página web.
3. Height: Indica al navegador la altura (en píxeles) del applet dentro de la
página web.
5. EXCEPCIONES
Una vez que Java lanza una excepción, el método que ha provocado la
excepción acaba y el control vuelve al método más cercando en la secuencia de
llamadas que contenga un match() que incluya la excepción. Para capturar una
excepción tenemos un bloque try-catch. Si un código cualquiera del bloque try
lanza una excepción de la clase indicada en la cláusula match, entonces Java omite
el resto del código en el bloque try y ejecuta el código de tratamiento dentro de la
cláusula match.
Cuando Java lanza un error se detiene el proceso de todo el código en el
método. Esto supone un problema si el método local ha adquirido un recurso que
solo conoce este método y si este recurso debe ser liberado. Una solución sería
capturar y volver a lanzar la excepción, pero es necesario liberar el código normal y
el código de la excepción. Para poder solucionar este problema, Java utiliza la
cláusula finally
6. PACKAGES
7. ENTRADA/SALIDA ESTÁNDAR
La clase String crea una cadena inmutable: una vez creada no se puede
modificar su contenido (al contrario que la clase stringBuffer) por lo que cada vez
que llevamos a cabo operaciones que modifican la cadena, Java crea una nueva
instancia con el nuevo valor y es el que nos retorna la operación.
Fundamentos de programación · 31
1. ELEMENTOS BÁSICOS
La Clase dialog gestiona las ventanas de diálogo: son ventanas que aparecen
temporalmente por encima de la ventana de la aplicación para comunicar un
mensaje o una información al usuario, o bien para pedir información: una vez que
la ventana ha cumplido su misión, desaparece, por ello los diálogos siempre
dependen sde una ventana principal. Dentro de esta clase, destaca la clase
FileDialog, que es la tipica clase en la que tenemos que dar un nombre de archivo
para guardar “save” o para abrilo “load”.