1. Orientación a Objetos, una técnica
para mejorar la calidad del software
Programación Orientada a Objetos
2. Desarrollo de software OO
Método de desarrollo de software que basa la
arquitectura del sistema en módulos deducidos
de los tipos de objetos que se manipulan (en
lugar de basarse en la función o funciones a las
que el sistema está destinado a asegurar).
3. Desarrollo de software OO
Encontrar los objetos relevantes
Encontrar las operaciones para los tipos
de objetos
Describir los tipos de objetos
Encontrar relaciones entre objetos
Utilizar los tipos de objetos y las
relaciones para estructurar el software
4. Ejemplo: objeto coche
Funciones que puede realizar:
•Ir
•Parar
•Girar a la derecha
•Girar a la izquierda
•Arrancar
id: número de bastidor
Tiene las características:
•Color
•Velocidad
•Tamaño
•Carburante
5. Clases de objetos
Los objetos con estados similares y el mismo
comportamiento se agrupan en clases
6. Clase Coche
Coche
color
velocidad
tamaño
carburante
ir
parar
girarDerecha
girarIzquierda
arrancar
7. Relaciones entre objetos
B es un cliente de A si todo objeto de B puede contener
información sobre uno o mas objetos de A
B A
A at
B hereda de A si B denota una versión especializada de
A
A
B
10. Estructura del software
Publicacion Autor
Revista Libro Actas Congreso
“Libro es una especialización de Publicacion”
“Publicacion usa servicios de Autor”
11. Modelo de objetos
Programación Orientada a Objetos Métodos de Análisis y Diseño OO
Modelo de Objetos
Abstracción
Encapsulación
Modularidad
Herencia
Polimorfismo
Bases de Datos OO
Otros desarrollos se asientan en el paradigma OO
Desarrollo basado en componentes
Tecnología de objetos distribuidos
12. Abstracción
“Supresión intencionada, u
ocultamiento, de algunos
detalles de un proceso o
artefacto, con el objeto de
destacar de manera más clara
otros aspectos, detalles o
estructuras”
Tipos de abstracción:
Datos, procedural
Métodos de abstracción:
Parametrización
Especificación
[Booch’96] Booch, G. Análisis y Diseño Orientado Sofware y con Aplicaciones. Addison-Wesley. 1996
Curso 2009/2010 Calidad del a Objetos OO 57
13. Encapsulación
“Proceso de almacenar en un mismo compartimento los
elementos de una abstracción que constituyen su
estructura y su comportamiento”
14. El enfoque de la POO
Programa OO Colección estructurada
de clases
Clase Implementación de un
Tipo Abstracto de Datos (TAD)
Objeto Una instancia de una clase
Los objetos se comunican mediante mensajes
15. Clases
DEFINICIÓN: Implementación total o parcial de un TAD
Entidad sintáctica que describen objetos que van a
tener la misma estructura y el mismo
comportamiento.
Doble naturaleza: Módulo + Tipo de Datos
Módulo (concepto sintáctico)
Mecanismo para organizar el software
Tipo (concepto semántico)
Mecanismo de definición de nuevos tipos de datos: describe
una estructura de datos (objetos) y las operaciones
aplicables.
16. Componentes de un clase
Atributos:
Determinan una estructura de almacenamiento para cada
objeto de la clase
Métodos:
Operaciones aplicables a los objetos
Único modo de acceder a los atributos
Ejemplo : En una aplicación bancaria, encontramos objetos
“cuenta”. Todos los objetos “cuenta” tienen propiedades comunes:
atributos: saldo, titular, ...
operaciones: reintegro, ingreso, …
Definimos una clase CUENTA
17. Ejemplo: Clase Cuenta
Cuenta
Definición de la clase
titular: String;
Atributos
saldo: double;
reintegro(valor:double);
ingreso (valor:double); Métodos
Tiempo de ejecución
“José Martínez” titular
1200.0 saldo
Objeto Cuenta
18. Clase Cuenta en Java
class Cuenta{
String titular; ATRIBUTOS
double saldo;
void ingreso (double cantidad){
saldo = saldo + cantidad;
}
void reintegro (double cantidad){
if (cantidad <= saldo)
saldo = saldo – cantidad;
} MÉTODOS
}
19. Ocultación de Información
A las características de una clase (atributos y
métodos) se les puede asignar un modificador
de visibilidad:
public:
Característica pública, accesible desde todas las clases
private:
Característica privada, accesible sólo dentro de la clase
donde se define
Principio de diseño:
Todos los atributos de una clase son privados
Los métodos pueden tener distintos niveles de
visibilidad
20. Clase Cuenta en Java
class Cuenta{
private String titular;
private double saldo;
public void ingreso (double cantidad){
saldo = saldo + cantidad;
}
public void reintegro (double cantidad){
if (puedoSacar(cantidad))
saldo = saldo – cantidad;
}
private boolean puedoSacar(double cantidad){
return cantidad <= saldo;
}
}
21. Acceso y modificación de atributos
La única forma de acceder a los atributos es a
través de métodos públicos
Métodos get para consultar el valor del
atributo
Métodos set para establecer el valor del
atributo
La implementación de los métodos set/get
depende del nivel de acceso de los atributos.
Se aísla al cliente de los cambios en la
estructura de datos.
22. Clase Cuenta en Java
class Cuenta{
private String titular;
private double saldo;
public String getTitular(){
return titular;
}
//No setTitular porque es inmutable
public double getSaldo(){
return saldo;
}
/* No setSaldo porque se modifica con ingresos
y reintegros */
}
23. Paquetes
Unidad modular del lenguaje que permite agrupar
clases que están relacionadas
Además de public y private, se puede establecer
que una característica de la clase tiene visibilidad a
nivel de paquete
A las clases también se les puede especificar un nivel
de visibilidad:
public: la clase es visible desde cualquier paquete
A nivel de paquete: la clase sólo es visible en el paquete al que
pertenece.
24. Paquetes
La pertenencia de una clase a un paquete se
debe especificar antes de la declaración
(package)
Para utilizar una clase definida en un paquete
distinto:
Se utiliza el nombre cualificado de la clase
Ejemplo: java.util.LinkedList unaLista;
Se importa la clase o el paquete al comienzo de la
declaración
Se puede utilizar el nombre de la clase sin cualificar
import java.util.LinkedList; o bien
import java.util.*;
25. Clase Cuenta en Java
package banco;
import java.util.LinkedList;
public class Cuenta{
String titular;
double saldo;
LinkedList ultimasOperaciones;
void ingreso (double cantidad){…
}
void reintegro (double cantidad){…
}
}
26. Objetos
Un objeto es una instancia de una clase,
creada en tiempo de ejecución
Es una estructura de datos formada por tantos
campos como atributos tiene la clase.
El estado de un objeto viene dado por el valor
de los campos.
Los métodos permiten consultar y modificar el
estado del objeto.
27. Objetos dominio vs. Objetos aplicación
Ejemplo: Aplicación Correo electrónico
Objetos externos:
Procedentes del dominio de la aplicación:
“carpeta”, “buzón”, “mensaje”
Objetos software:
Procedentes del ANALISIS: todos los externos
Procedentes del DISEÑO/IMPLEMENTACION:
“lista enlazada”, “ventana”,...
28. cuentaAhorro Cuenta Persona
empleado
CuentaCorriente CuentaAhorro Empleado Cliente
cuentaCorriente cliente
Sistema Software (Clases)
Objetos del mundo real
O
EÑ
S
DI
EJECUCIÓN
AN
AL
ISI
S
empleado cuentaAhorro
“Cada objeto es
instancia cuentaCorriente cliente
directa
Instancias de las clases (objetos software)
de una clase”
29. Tipos de los atributos
Tipos de datos primitivos:
Enteros: byte, short, int, long
Reales: float, double
Carácter: char
Booleano: boolean
Referencias:
Sus valores son objetos de tipos no básicos, otras
clases.
Enumerados: son clases que representan un
conjunto finito de valores
31. Relación cliente
Cuando en una clase A establecemos que el
tipo de un atributo es otra clase B, decimos que
A es cliente de B.
Por ejemplo:
Definimos la clase Persona
Declaramos el tipo del atributo titular (en la clase
Cuenta) como Persona.
La clase Cuenta es cliente de la clase Persona
32. Relación de cliente
Cuenta Persona
titular: Persona; nombre: String;
saldo: double; dni: String;
reintegro(valor:double);
ingreso (valor:double);
Referencia a otro objeto!!
titular “José Martínez”
saldo 1200.0 “34789567R”
Objeto Cuenta Objeto Persona
33. Semántica referencia
Una referencia es un valor que en tiempo de ejecución
está o vacío (null) o conectado.
Si está conectado, una referencia identifica a un único
objeto.
Mientras exista, cada objeto posee una identidad única,
independiente de su estado identificador de
objeto (oid):
Dos objetos con diferentes oids pueden tener los mismos
valores en sus campos.
Los valores de los campos de un objeto pueden cambiar, pero
su oid es inmutable.
Cuando se asigna un objeto a una variable no se asigna
la estructura de datos del objeto sino el oid.
34. Igualdad vs. identidad
b
d
a “uno” “uno” “dos”
23 23 23
c
Igualdad entre referencias Identidad
a == c {true}
a == b {false}
Igualdad entre objetos
Podemos utilizar el método equals
35. Copia de objetos
Si la asignación no implica copia de
objetos ¿cómo se pueden copiar?
copia = obj.clone();
Constructor de copia:
Se pasa como parámetro un objeto de la misma
clase
Se inicializan los campos del nuevo objeto con los
mismos valores de los campos del objeto que se
pasa como parámetro.
36. Semántica referencia
Ventajas de las referencias:
Compartición de objetos integridad referencial
Permite definir estructuras recursivas (auto-
referencias)
Más eficiente manejo objetos complejos
Los objetos se crean cuando se necesitan
Soporte para el polimorfismo
37. Semántica referencia
miCuenta
titular J. Gomez nombre
codigo 123456 87654321 dni
saldo 100000 Objeto Persona
ultimasOperaciones
-5000 10000
Objeto Array
38. Semántica referencia
Compartición Autorreferencias
Objeto Cuenta Objeto Cuenta
nombre M. Martinez
titular titular categoria Fijo
codigo 123456 876234 codigo
salario 100000000
saldo 100000 50000 saldo
jefe
ultOper ultOper
Objeto Empleado
-5000 55000
10000 -5000
J. Gómez nombre
87654321 dni
Objeto Persona
39. Métodos y mensajes
Un método está compuesto por:
Cabecera: Identificador y Parámetros
Cuerpo: Secuencia de instrucciones
Mensaje:
Mecanismo básico de la computación OO.
Invocación de la aplicación de un método sobre un
objeto.
Un mensaje está formado por tres partes
Objeto receptor
Selector o identificador del método a aplicar
Argumentos
40. Ejemplo método vs. mensaje
Método reintegro en la clase Cuenta:
public double reintegro (double cantidad) {
if (puedoSacar(cantidad))
saldo = saldo – cantidad;
}
Mensaje, aplica el método reintegro sobre un
objeto cuenta:
cuenta.reintegro(600.0);
41. Definición de Métodos
Todo método tiene un valor de retorno
Si no devuelve nada se indica con void
Para cada método se establece el nivel de
visibilidad
¿Qué instrucciones podemos incluir en el
cuerpo de un método?
Asignación
Estructuras condicionales
Iteración
Invocación a otro método = Mensajes
Creación de objetos
42. Sentencias de control de flujo
switch(expresión) {
case valor1:
if( expresión-booleana )
sentencias;
{
break;
sentencias;
} case valor2:
[else { sentencias;
sentencias; break;
}] [default:
sentencias;]
}
43. Ejemplos
int saldo;
…
if (saldo<0)
estadoCuenta = Estado.NUMEROS_ROJOS;
int dia;
…
switch (dia){
case 1: System.out.println(“Lunes”); break;
case 2: System.out.println(“Martes”); break;
…
case 7: System.out.println(“Domingo”); break;
}
44. Ejemplo
Método reintegro teniendo en cuenta el estado de la
cuenta:
public boolean reintegro (double cantidad){
switch (estadoCuenta) {
case INMOVILIZADA:
case NUMEROS_ROJOS: return false;
case OPERATIVA: if (puedoSacar(cantidad))
saldo = saldo - cantidad;
return true;
default: return false;
}
}
49. Sobrecarga de métodos
Java soporta sobrecarga de métodos
el mismo nombre pero con DIFERENTE lista de tipos de
argumentos.
No pueden diferenciarse únicamente en el tipo de retorno.
//Pago de una compra en una vez
public boolean cobrar(Compra ticket){
return reintegro(ticket.getTotal());
}
//Pago a plazos devuelve el número de plazos
public int cobrar(Compra ticket, boolean aplazado){
…
}
50. Paso de parámetros
Sea el método
met (T1 p1,…, Tn pn)
Donde p1 … pn son los parámetros formales
y la invocación (mensaje)
obj.met (a1,…,an)
Donde a1 … an son los parámetros reales
Debemos responder a las siguientes preguntas:
¿Cuál es la correspondencia entre parámetros reales y
formales?
¿Qué operaciones se permiten sobre los parámetros formales?
¿Qué efecto tendrán las operaciones aplicadas sobre los
parámetros formales sobre los parámetros reales
correspondientes?
51. Paso de parámetros
El efecto del paso de parámetros es una asignación
pi = ai
En el caso de las referencias, el argumento formal referencia al
mismo objeto referenciado por el argumento real
En el caso de los tipos primitivos pi es una copia de ai
Paso de parámetros siempre por valor
Al parámetro real no le afectan los cambios en el parámetro
formal
Cuando trabajamos con referencias el efecto de una
operación sobre el parámetro formal implica que se
modifique el estado del parámetro real.
52. Paso de parámetros
No existe ninguna restricción sobre las
operaciones aplicables sobre los parámetros
formales
Es posible modificar el parámetro formal
El parámetro real no se cambia porque el
parámetro formal era una copia de la
referencia o del tipo primitivo.
53. Paso de parámetros
public void transferencia(Cuenta emisor, Cuenta receptor,
double cantidad) {
emisor.reintegro(cantidad); Cambia el estado
receptor.ingreso(cantidad); de los dos objetos
emisor = null;
}
No afectaría a la
variable cuenta1
…
banco.transferencia(cuenta1, cuenta2, 3000.0);
54. Instancia actual
Cada operación de una computación OO es
relativa a cierto objeto, la instancia actual,
en el momento de la ejecución de la operación
¿A qué objeto Cuenta se refiere el texto de la
rutina reintegro?
El cuerpo de una rutina se refiere a la instancia
sobre la que se aplica
La instancia actual es el receptor de la llamada
actual, el objeto receptor del mensaje
55. Ejemplo: c1.reintegro(300)
c1
titular J. Gomez nombre
codigo 123456 87654321 dni
saldo-300 saldo 600 Objeto Persona
ultimasOperaciones -5000 10000
Objeto Array
public double reintegro (double cantidad) {
if (puedoSacar(cantidad))
saldo = saldo – cantidad;
}
56. Instancia actual
Si se aplica un método y no se especifica
el objeto receptor, se asume que es la
instancia actual.
public double reintegro (double cantidad) {
if (puedoSacar(cantidad))
saldo = saldo – cantidad;
}
El objeto receptor de puedoSacar será
el objeto receptor del reintegro
57. Referencia this
El lenguaje Java proporciona la palabra clave
this que referencia a la instancia actual.
Utilidad:
Distinguir los atributos de los parámetros y variables
locales dentro de la implementación de un método.
Aplicar un mensaje a otro objeto estableciendo como
parámetro la referencia al objeto actual.
58. Referencia this
public void trasladar(Sucursal sucursal){
this.sucursal.eliminar(this);
sucursal.añadir(this);
}
Se refiere al parámetro Se refiere a la instancia actual, la cuenta
que se va a trasladar
Se refiere al atributo de la clase
59. Creación de Objetos
La declaración de una variable cuyo tipo sea
una clase no implica la creación del objeto.
Se necesita un mecanismo explícito de creación
de objetos: new
¿Por qué?
Evitar cadena de creaciones antes de empezar a
hacer nada útil
Estructuras recursivas
Los objetos se crean cuando se necesitan
(referencias vacías, compartir objeto)
60. Declaración vs. Creación
Cuenta c; //declaración
c Estado null
c = new Cuenta(…) //creación explícita
• Estado “conectado”
c • c contiene la referencia al objeto
• c almacena el oid asignado al
objeto CUENTA
objeto al crearse
61. Constructores
Método encargado de inicializar correctamente los
objetos
Métodos con el mismo nombre de la clase pero sin valor
de retorno
No se pueden invocar una vez que el objeto se ha
creado
Permite sobrecarga para especificar formas distintas
de inicializar los objetos
Toda clase tiene que tener al menos un constructor
Si no se define ningún constructor, el compilador crea
uno por defecto sin argumentos, vacío, que inicializa
los atributos a los valores por defecto.
62. Inicialización por defecto
Tipo Valor Inicial
boolean false
char Carácter 0 (‘u000’)
byte,short,int, 0
long
float +0.0f
double +0.0d
Referencia a objeto null
63. Constructores para la clase Cuenta
public Cuenta(Persona quien){
//Utilizamos this para invocar al otro constructor
// reutilización de código
this(quien, 100);
}
public Cuenta(Persona quien, double saldoInicial){
titular = quien;
saldo = saldoInicial;
ultimasOperaciones = new double[20];
}
El array hay que crearlo!!!
64. Creación de objetos
La construcción de un objeto consta de tres
etapas:
Se reserva espacio en memoria para la estructura de
datos que define la clase.
Inicializa los campos de la instancia con los valores
por defecto
Garantiza que cada atributo de una clase tenga un valor
inicial antes de la llamada al constructor
Se aplica sobre la instancia el constructor que se
invoca
65. Creación de objetos
Cuenta cta = new Cuenta (persona, 300.0);
cta Objeto
titular null
Persona
saldo 300.0
0.0
codigo 01
ultimasOperaciones null …
66. Atributos finales
Java permite especificar que el valor de un
atributo no podrá variar una vez construido el
objeto
Un atributo se declara de sólo consulta
anteponiendo el modificador final a su
declaración
Los atributos finales sólo pueden ser
inicializados en la declaración o en el
constructor
67. Atributo final
public class Cuenta {
//Los atributos se pueden inicializar
//en el momento de la declaración
private double saldo = 100;
private final Persona titular;
public Cuenta(Persona persona) {
titular = persona;
}
Error en tiempo de compilación
…
public void setTitular(Persona persona){
titular = persona;
}
}
68. Atributos de clase
Representa una propiedad cuyo valor es
compartido por todos los objetos de una misma
clase
Ejemplo:
Añadimos a las cuentas un atributo para el código de
cuenta.
Es necesario una variable que almacene el último
código de cuenta asignado.
En un lenguaje imperativo se declararía una
variable global.
Java es un lenguaje OO puro que no permite
declaraciones fuera del ámbito de una clase.
69. Atributos de clase
public class Cuenta {
private static int ultimoCodigo = 0;
private int codigo;
private double saldo;
private final Persona titular;
private double [] ultimasOperaciones;
public Cuenta(Persona nombre, double saldoInicial) {
codigo = ++ultimoCodigo;
titular = nombre;
saldo = saldoInicial;
ultimasOperaciones = new double[20];
}
…
A los atributos de clase se tiene acceso desde cualquier método de la clase
70. Constantes
En Java no hay una declaración específica
para las constantes.
Se consigue el mismo resultado definiendo un
atributo de clase y final.
Las constantes no pueden ser modificadas.
No tiene sentido definir métodos de acceso y
modificación.
El nivel de acceso es controlado por su
visibilidad.
71. Constantes
public class Cuenta {
private static final int MAX_OPERACIONES = 20;
private static final double SALDO_MINIMO = 100;
private static int ultimoCodigo = 0;
private int codigo;
private double saldo;
private final Persona titular;
private double[] ultimasOperaciones;
public Cuenta(Persona persona) {
codigo = ++ultimoCodigo;
titular = persona;
saldo = SALDO_MINIMO;
ultimasOperaciones = new double[MAX_OPERACIONES];
}…
}
Tema 2 Clases y Objetos 68
72. Métodos de clase
¿Cómo definimos operaciones que manejan
atributos de clase?
Un método se define de clase anteponiendo el
identificador static a su declaración
En el cuerpo del método de clase sólo se
puede acceder a los atributos de clase
Para la aplicación de un método de clase no
se hace uso de ningún objeto receptor, sino del
nombre de la clase
73. Métodos de clase
public class Cuenta {
private static int ultimoCodigo = 0;
…
public static int getNumeroCuentas() {
return ultimoCodigo;
}
}
Cuenta.getNumeroCuentas();
74. Destrucción de objetos
En Java los objetos no se destruyen
explícitamente
Recolección automática de memoria de los
objetos no referenciados (Garbage Collector)
Existe un método finalize()
Este método se invocará justo antes de la
recolección de basura
Interesa para liberar recursos (ej. conexión bases de
datos).
75. Modelo de ejecución OO
Para obtener un código ejecutable se deben ensamblar
las clases para formar sistemas (cerrado).
Un sistema viene dado por:
Un conjunto de clases
La clase raíz
El procedimiento de creación de la clase raíz.
La ejecución de un programa OO consiste en:
Creación dinámica de objetos
Envío de mensajes entre los objetos creados, siguiendo un
patrón impredecible en tiempo de compilación
76. Modelo de ejecución OO
¿Cómo empieza la ejecución de un programa OO?
Creación de un “objeto raíz”
Aplicar mensaje sobre “objeto raíz”
En tiempo de ejecución, el flujo de ejecución siempre
se encuentra:
aplicando una operación sobre un objeto (instancia actual) o
ejecutando una operación que no es un mensaje (asignación,
creación).
En un instante dado bien se aplica un mensaje sobre la
instancia actual o sobre un objeto accesible desde él.
Un mensaje siempre formará parte del cuerpo de una
rutina de una clase
78. El método main
Debemos proporcionar el nombre de la clase
que conduzca la aplicación
Cuando ejecutamos un programa, el sistema
localizará esta clase y ejecutará el main que
contenga
El método main es un método de clase que
recibe como parámetro un array de cadenas de
texto que son los parámetros del programa
79. El método main
Definición del método main
public class Eco{
public static void main(String[] args){
for(int i=0; i < args.length; i++)
System.out.println(args[i]+” ”);
}
}
Parámetros del programa:
c: java Eco estamos aquí --> SALIDA: estamos aquí
80. Principios de diseño de clases
Favorecer la legibilidad del código:
Asignar nombres significativos para los identificadores de
atributos, variables y métodos
Inicializar los atributos
Favorecer la extensibilidad:
Utilizar constantes simbólicas significativas
Seguir los principios de diseño modular
81. Principios de diseño de clases
Ocultación de la Información
Los atributos de una clase deben ser privados y ofrecer los métodos
de consulta necesarios dependiendo de su nivel de acceso (set y/o
get)
Diferenciar entre métodos públicos (interfaz de la clase) y métodos
privados (métodos auxiliares)
Para acceder a una constante, ésta debe ser pública en lugar de
ofrecer un método de consulta.
Alta Cohesión
Fragmentar clases que tengan demasiadas responsabilidades
Bajo Acoplamiento
Ley de Demeter: “Habla sólo con tus amigos” para un método m de
una clase C sólo deberían invocarse los métodos: de la clase C, de
los parámetros que recibe el método m, de cualquier objeto creado
en el método m, de cualquier atributo (variable de instancia) de la
clase C