Abstracción y Encapsulación de en la programación Orientada a objetos
1. Introducción a la Programación Orientada a Objetos
Los lenguajes de programación han evolucionado
para brindar mecanismos que le permitan al
programador abstraerse del funcionamiento de los
dispositivos físicos que conforman una
computadora.
En esta evolución un concepto fundamental es el
de encapsulamiento.
Encapsulamiento y Abstracción
El encapsulamiento es un mecanismo que permite
la definición de módulos de software que pueden
ser utilizados como “cajas negras”, esto es,
sabiendo qué hacen sin saber cómo lo hacen.
2. Introducción a la Programación Orientada a Objetos
El encapsulamiento permite esconder los detalles de
la implementación de un módulo, de modo que sus
clientes sólo conozcan su funcionalidad.
Si cambian la implementación de un módulo, en
tanto no cambie su funcionalidad, los módulos que
lo usan no se verán afectados.
Se reducen así las dependencias entre diferentes
unidades de software, de modo que estos son más
fáciles de leer, verificar y modificar.
Encapsulamiento y Abstracción
3. Introducción a la Programación Orientada a Objetos
Un lenguaje que soporta encapsulamiento debe
brindar algún mecanismo para que el programador
pueda definir módulos de software independientes.
En Java una clase define un módulo y los
modificadores de acceso permiten establecer el
nivel de encapsulamiento. Los miembros de una
clase que se declaran privados quedan escondidos
y no son visibles desde el exterior.
Cuando un lenguaje permite definir clases y soporta
encapsulamiento el programador puede definir
tipos de datos abstractos.
Encapsulamiento y Abstracción
4. Introducción a la Programación Orientada a Objetos
Un tipo de dato es un conjunto de valores y un
conjunto de operaciones definidas para estos
valores.
Cuando la representación de los datos y la
implementación de las operaciones están
encapsuladas, el tipo de dato es abstracto.
Un tipo de dato abstracto (TDA) define patrón a
partir del cual es posible crear instancias sin
conocer la representación interna de los valores ni
la implementación de las operaciones.
Tipo de Dato Abstracto
5. Introducción a la Programación Orientada a Objetos
Float (tipo elemental) y String (tipo clase)
son tipos de datos abstractos, el programador
los usa sin conocer la representación interna de
los valores del tipo ni la implementación (el
código) de las operaciones.
Las variables declaradas de clase String
mantienen una referencia a una cadena de
caracteres.
Tipo de Dato Abstracto
6. Introducción a la Programación Orientada a Objetos
Diseñe e implemente un tipo de dato abstracto que
permita representar números racionales.
Racional
num : entero
den : entero
Una alternativa es representar a cada número
racional como un par, en donde el primer elemento
es el numerador y el segundo el denominador.
¿Todo número racional puede representarse de
esta manera? ¿Todo par de enteros representan a
un número racional?
Caso de Estudio: TDA Racional
7. Introducción a la Programación Orientada a Objetos
Caso de Estudio: TDA Racional
Racional
num : entero
den : entero
Requiere d > 0
<<constructor>>
Racional (n,d : entero)
<<comandos>>
establecerNum (n : entero)
establecerDen (d : entero)
El comentario asociado al constructor establece la
responsabilidad de la clase cliente de controlar el valor de un
atributo antes de crear un racional o modificar su
denominador
copy(r : Racional)
8. Introducción a la Programación Orientada a Objetos
Caso de Estudio: TDA Racional
Racional
num : entero
den : entero
…
<<consultas>>
obtenerNum() : entero
obtenerDen() : entero
equals (r: Racional) :boolean
toString() :String
clone () : Racional
Métodos generales
9. Introducción a la Programación Orientada a Objetos
Caso de Estudio: TDA Racional
Racional
num : entero
den : entero
…
<<consultas>>
...
suma (rac : Racional) :Racional
resta (rac : Racional) :Racional
producto (rac : Racional) :Racional
cociente (rac : Racional) :Racional
Métodos específicos
10. Introducción a la Programación Orientada a Objetos
class Racional {
private int num;
private int den;
Caso de Estudio: TDA Racional
11. Introducción a la Programación Orientada a Objetos
class Racional {
…
// CONSTRUCTOR
public Racional(int n, int d ) {
//Requiere d > 0
num = n;
den = d;
}
Caso de Estudio: TDA Racional
12. Introducción a la Programación Orientada a Objetos
// COMANDOS
public void establecerNum(int n ) {
num = n;
}
public void establecerDen(int d ) {
//Requiere d > 0
den = d;
}
Caso de Estudio: TDA Racional
13. Introducción a la Programación Orientada a Objetos
// COMANDOS
…
public void copy(Racional r ) {
num = r.obtenerNum();
den = r.obtenerDen();
}
Caso de Estudio: TDA Racional
14. Introducción a la Programación Orientada a Objetos
// CONSULTAS
public int obtenerNum() {
return num;
}
public int obtenerDen() {
return den;
}
Caso de Estudio: TDA Racional
15. Introducción a la Programación Orientada a Objetos
// CONSULTAS
public boolean equals(Racional r){
int rnum = r.obtenerNum();
int rden = r.obtenerDen();
int rmcd = MCD (rnum,rden);
int mcd = MCD (num,den)
return num/mcd == rnum/rmcd &&
den/mcd == rden/rmcd;
}
Caso de Estudio: TDA Racional
16. Introducción a la Programación Orientada a Objetos
// CONSULTAS
…
public String toString() {
return ( num + "/" + den );
}
public Racional clone (){
Racional r = new Racional(num,den);
return r;
}
public Racional clone (){
return new Racional(num,den);
}
Caso de Estudio: TDA Racional
17. Introducción a la Programación Orientada a Objetos
public Racional suma( Racional op ) {
int n = num*op.obtenerDen()
+den*op.obtenerNum();
int d = den * op.obtenerDen();
return( new Racional(n, d ) );
}
public Racional resta( Racional op ) {
int n = num*op.obtenerDen()
- den*op.obtenerNum();
int d = den * op.obtenerDen();
Racional s = new Racional(n,d);
return s;
}
Caso de Estudio: TDA Racional
18. Introducción a la Programación Orientada a Objetos
public Racional resta( Racional op ) {
int n = num*op.obtenerDen()
- den*op.obtenerNum();
int d = den * op.obtenerDen();
return( new Racional(n, d ) );
}
Caso de Estudio: TDA Racional
19. Introducción a la Programación Orientada a Objetos
public Racional producto( Racional op ) {
return
new Racional(num*op.obtenerNum(),
den*op.obtenerDen());
}
Caso de Estudio: TDA Racional
20. Introducción a la Programación Orientada a Objetos
Un tipo de dato es un modelo matemático que
especifica un conjunto de valores y un conjunto de
operaciones sobre esos valores.
El encapsulamiento es un mecanismo que permite
dividir los programas en módulos que pueden ser
usados conociendo sólo su interfaz.
Un tipo de dato es abstracto si la representación de
su estado interno y la implementación de sus
operaciones queda encapsulada.
La clase Racional define un tipo de dato abstracto a
partir del cual es posible crear instancias.
Caso de Estudio: TDA Racional
21. Introducción a la Programación Orientada a Objetos
Antes de usar el TDA Racional en una aplicación
específica debemos verificar que cumple con lo
especificado.
Podemos probar las operaciones en forma interactiva
o definir una clase tester que use a la clase Racional
para verificar sus servicios.
El mismo problema podría diseñarse de manera
diferente, sin modificar la interface ni la funcionalidad
de los servicios. En este caso el mismo tester permite
verificar las dos implementaciones.
Caso de Estudio: TDA Racional
22. Introducción a la Programación Orientada a Objetos
Caso de Estudio: TDA Racional
Racional
num : entero
den : entero
num y den no
tienen factores
primos comunes
Requiere d > 0
<<constructor>>
Racional (n,d : entero)
<<comandos>>
establecerNum (n : entero)
establecerDen (d : entero)
El comentario asociado al constructor establece un
compromiso respecto a la representación de un racional que
afecta a los comandos
copy(r : Racional)
23. Introducción a la Programación Orientada a Objetos
Caso de Estudio: TDA Racional
Racional
num : entero
den : entero
…
<<consultas>>
obtenerNum() : entero
obtenerDen() : entero
equals (r: Racional) :boolean
toString() :String
clone () : Racional
Métodos generales
24. Introducción a la Programación Orientada a Objetos
Caso de Estudio: TDA Racional
Racional
num : entero
den : entero
…
<<consultas>>
...
suma (rac : Racional) :Racional
resta (rac : Racional) :Racional
producto (rac : Racional) :Racional
cociente (rac : Racional) :Racional
Métodos específicos
25. Introducción a la Programación Orientada a Objetos
class Racional {
private int num;
private int den;
/*num y den no tienen factores primos
comunes*/
// CONSTRUCTOR
public Racional(int n, int d ) {
//Requiere d > 0
int MCD = mcd (n,d);
num = n/MCD;
den = d/MCD;
}
Caso de Estudio: TDA Racional
26. Introducción a la Programación Orientada a Objetos
// COMANDOS
public void establecerNum(int n ) {
int MCD = mcd (n,den);
num = n/MCD;
den = den/MCD;
}
public void establecerDen(int d ) {
int MCD = mcd (num,d);
num = num/MCD;
den = d/MCD;
}
Caso de Estudio: TDA Racional
27. Introducción a la Programación Orientada a Objetos
// COMANDOS
…
public void copy(Racional r ) {
num = r.obtenerNum();
den = r.obtenerDen();
}
Caso de Estudio: TDA Racional
28. Introducción a la Programación Orientada a Objetos
// CONSULTAS
public int obtenerNum() {
return num;
}
public int obtenerDen() {
return den;
}
Caso de Estudio: TDA Racional
29. Introducción a la Programación Orientada a Objetos
// CONSULTAS
public boolean equals(Racional r){
return num == r.obtenerNum()&&
den == r.obtenerDen();
}
public String toString() {
return ( num + "/" + den );
}
public Racional clone (){
Racional r =
new Racional(num,den);
return r;
}
Caso de Estudio: TDA Racional