0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Definición de Clases y Variables de referencia.
Programación Interactiva Fundamentos de Java. 2 Ejecución de un programa Para Java una clase ejecutable es aquella que es pública y tiene un método main()
Herencia en C#.
22/11/2005 E.T.S de Ingenieros de Telecomunicación - UPNA.1 Clases y Objetos Silvia Larrayoz Leire Urriza.
Lenguaje de programación Java
Clases Extendidas La clase extendida hereda los campos y métodos de la clase de la cual extiende. La clase original se conoce como superclase y la clase.
Tipos de Datos Abstractos Vector de Racionales
Programación Orientada a Objetos
El proceso de desarrollo de software
El Proceso de desarrollo de software
El proceso de desarrollo de software
Abstracciones y Modelos
El proceso de desarrollo de software
Lección 1 Introducción a la POO
Aplicación del paradigma orientado a objetos
Diseño y programación de
Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.
Rosalía Laza Fidalgo Reyes Pavón Rial Curso
Encapsulamiento y Abstracción
Abstracción de Datos La abstracción es un recurso fundamental en la programación orientada a objetos y está además fuertemente ligado a reusabilidad.
Programación Orientada a Objetos en Java
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Modificadores.
Lic. Rosemary Torrico Bascopé
El patrón de diseño Proxy Raúl Heras Alberto Blasco José Manuel Arévalo.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
6. Herencia. Clases abstractas. Genericidad
SCJP Sun Certified Programmer for Java 6
Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Patrones Creacionales
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Clases.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Estructuras.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Genericidad.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Colección.
Introducción a la Programación Orientada a Objetos Una clase que modela los atributos y el comportamiento de una colección de objetos, define un tipo de.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Clases.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Polimorfismo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Abstracción.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
Abstracción El concepto de abstracción es esencial en ciencias de la computación. Un programa es en sí mismo una abstracción, un modelo de la resolución.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
Programación orientada a objetos La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos.
Diferencia entre implementar en RPA e IPOO - Diseño En.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Asociación.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Dependencia.
Introducción a la Programación Orientada a Objetos Sonia Rueda Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD.
Introducción a la Programación Orientada a Objetos Sonia Rueda Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD.
IPOO 2 cuatrimestre 2015 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Transcripción de la presentación:

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento y Abstracción Caso de estudio: Círculo y Punto Dr. Luciano H. Tamargo Depto. de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur, Bahía Blanca 2015

Introducción a la Programación Orientada a Objetos IPOO TEMARIO Tipo de dato abtracto (TDA). Caso de estudio: Círculo y Punto. Círculo y Punto. Cambio en la estructura.

TIPO DE DATO ABSTRACTO (TDA) Un tipo de dato define un conjunto de operaciones que se aplican sobre un conjunto de valores. Un tipo de dato abstracto es un tipo de dato en el cual la representación del conjunto de valores y la implementación del conjunto de operaciones está encapsulada. Cuando un tipo de dato es abstracto, es posible crear instancias del tipo y usar las operaciones conociendo qué hacen, pero no cómo lo hacen. Introducción a la Programación Orientada a Objetos IPOO

TDA EN JAVA En Java una clase puede usarse para definir un tipo de dato a partir del cual es posible crear instancias en ejecución. Cada servicio provisto por la clase corresponde a una operación definida por el tipo. Los modificadores de acceso permiten definir un tipo de dato abstracto, encapsulando la representación de los datos de modo que solo sea accesible a través de las operaciones. Una clase que define un TDA es una clase Proveedora, sus Clientes crean instancias del tipo, sin conocer la estructura del estado interno. Introducción a la Programación Orientada a Objetos IPOO

Introducción a la Programación Orientada a Objetos IPOO TEMARIO Tipo de dato abtracto (TDA). Caso de estudio: Círculo y Punto. Círculo y Punto. Cambio en la estructura.

6 Circulo > pi: real > radio: real centro: Punto > Circulo(r: real, p: Punto) > trasladar(p: Punto) escalar(r: real) copy (c: Circulo) > obtenerCentro(): Punto obtenerRadio(): real area(): real perimetro(): real pertenece(p: Punto): boolean equals(c: Circulo): boolean clone(): Circulo El comando trasladar modifica el centro con el valor del parámetro. El comando escalar modifica el valor de radio de acuerdo al parámetro.

7 Circulo > pi: real > radio: real centro: Punto > Circulo(r: real, p: Punto) > trasladar(p: Punto) escalar(r: real) copy (c: Circulo) > obtenerCentro(): Punto obtenerRadio(): real area(): real perimetro(): real pertenece(p: Punto): boolean equals(c: Circulo): boolean clone(): Circulo Punto > x,y:real > Punto(X,Y:real) > copy (p:Punto) establecerX(x:real) establecerY(y:real) > obtenerX():real obtenerY():real equals(p:Punto):boolean clone():Punto toString():String distancia(p:Punto):real

8 Circulo > pi: real > radio: real centro: Punto > Circulo(r: real, p: Punto) > trasladar(p: Punto) escalar(r: real) copy (c: Circulo) > obtenerCentro(): Punto obtenerRadio(): real area(): real perimetro(): real pertenece(p: Punto): boolean equals(c: Circulo): boolean clone(): Circulo Punto > x,y:real > Punto(X,Y:real) > copy (p:Punto) establecerX(x:real) establecerY(y:real) > obtenerX():real obtenerY():real equals(p:Punto):boolean clone():Punto toString():String distancia(p:Punto):real Las clases Circulo y Punto están relacionadas por asociación. La clase Circulo tiene un atributo de clase Punto.

9 Circulo > pi: real > radio: real centro: Punto > Circulo(r: real, p: Punto) > trasladar(p: Punto) escalar(r: real) copy (c: Circulo) > obtenerCentro(): Punto obtenerRadio(): real area(): real perimetro(): real pertenece(p: Punto): boolean equals(c: Circulo): boolean clone(): Circulo Punto > x,y:real > Punto(X,Y:real) > copy (p:Punto) establecerX(x:real) establecerY(y:real) > obtenerX():real obtenerY():real equals(p:Punto):boolean clone():Punto toString():String distancia(p:Punto):real Existe también una relación de dependencia entre Circulo y Punto. -El constructor de Circulo y el método trasladar reciben un parámetro de clase Punto. -El método obtenerCentro () retorna como resultado un objeto de clase Punto.

10 Circulo > pi: real > radio: real centro: Punto > Circulo(r: real, p: Punto) > trasladar(p: Punto) escalar(r: real) copy (c: Circulo) > obtenerCentro(): Punto obtenerRadio(): real area(): real perimetro(): real pertenece(p: Punto): boolean equals(c: Circulo): boolean clone(): Circulo Punto > x,y:real > Punto(X,Y:real) > copy (p:Punto) establecerX(x:real) establecerY(y:real) > obtenerX():real obtenerY():real equals(p:Punto):boolean clone():Punto toString():String distancia(p:Punto):real La clase Circulo usa a la clase Punto como una “caja negra”, esto es, sabiendo qué hace sin saber cómo lo hace.

CASO DE ESTUDIO: CÍRCULO Y PUNTO class Punto{ //Atributos de Instancia private float x, y; //Constructores public Punto (float x, float y){ this.x = x; this.y = y; } public void establecerX(float x){ this.x = x; } public void establecerY(float y){ this.y = y; } public void copy(Punto p){ x = p.obtenerX(); y = p.obtenerY(); } 11

CASO DE ESTUDIO: CÍRCULO Y PUNTO //Consultas public float obtenerX(){ return x;} public float obtenerY(){ return y;} public boolean equals (Punto p){ return x == p.obtenerX() && y == p.obtenerY(); } public Punto clone(){ return new Punto(x,y); } public String toString(){ return "("+x+","+y+")"; } } 12

CASO DE ESTUDIO: CÍRCULO Y PUNTO public double distancia(Punto p) { float dx = x - p.obtenerX(); float dy = y - p.obtenerY(); return Math.sqrt(dx*dx+dy*dy); } 13 y x p 2 (x 2,y 2 ) p 1 (x 1,y 1 ) x2x2 x1x1 dx = x 2 -x 1 y1y1 y2y2 dy = y 2 - y 1

CASO DE ESTUDIO: CÍRCULO Y PUNTO La clase Punto define un tipo de dato abstracto. El conjunto de valores del tipo son todos los pares de números reales. El conjunto de operaciones del tipo corresponden a los servicios provistos por la clase. La clase Punto puede ser construida y verificada sin saber quienes son las clases clientes. Las clases cliente crean instancias de la clase Punto sin conocer cómo es la representación de los valores ni la implementación de las operaciones. Introducción a la Programación Orientada a Objetos IPOO

CASO DE ESTUDIO: CÍRCULO Y PUNTO Introducción a la Programación Orientada a Objetos IPOO Circulo > pi: real > radio: real centro: Punto > Circulo(r: real, p: Punto) > trasladar(p: Punto) escalar(r: real) copy (c: Circulo) … class Circulo { //Atributo de clase private static final float pi=3.1415; //Atributos de Instancia private float radio; private Punto centro; //Constructor public Circulo (float r, Punto p){ radio = r; centro = p; } //Comandos public void trasladar(Punto p){ centro = p; } public void escalar(float r){ radio = r; }

CASO DE ESTUDIO: CÍRCULO Y PUNTO 16 Circulo > pi: real > radio: real centro: Punto … > obtenerCentro(): Punto obtenerRadio(): real area(): real perimetro(): real pertenece(p:Punto): boolean //Consultas public Punto obtenerCentro(){ return centro; } public float obtenerRadio(){ return radio; } public double area(){ return pi * radio * radio; } public double perimetro(){ return pi * 2 * radio; } public boolean pertenece(Punto p){ float d = centro.distancia(p); float dif = Math.abs(d - radio); return dif < 0.01; } No comparamos con 0 sino con un valor cercano a 0.

CASO DE ESTUDIO: CÍRCULO Y PUNTO class Geometria{ … public void Figuras(){ Punto p1,p2; Circulo c1,c2,c3; p1=new Punto(1,2); p2=new Punto(1,2); c1=new Circulo(7.5,p1); c2=new Circulo(7.5,p2); c3=new Circulo(7.5,p2); } } Introducción a la Programación Orientada a Objetos IPOO c1 :Circulo radio = 7.5 centro c2 :Circulo radio = 7.5 centro c3 :Circulo radio = 7.5 centro :Punto x = 1 y = 2 :Punto x = 1 y = 2 p1 p2

CASO DE ESTUDIO: CÍRCULO Y PUNTO La clase Punto es una clase proveedora, una de sus clases cliente es la clase Circulo. La clase Geometría es también cliente de la clase Punto. La clase Circulo también cumple el rol de proveedora, cuando es usada desde otra clase cliente que declara variables de clase Circulo. La clase Geometría no conoce la representación interna de cada objeto de clase Punto o de clase Circulo. Introducción a la Programación Orientada a Objetos IPOO

CASO DE ESTUDIO: CÍRCULO Y PUNTO class Geometria{ … public void Figuras(){ Punto p1,p2; Circulo c1,c2,c3; p1=new Punto(1,2); p2=new Punto(1,2); c1=new Circulo(7.5,p1); c2=new Circulo(7.5,p2); c3=new Circulo(7.5,p2); if (c3.equals(c1)) System.out.println(“c3 igual a c1”); if (c3.equals(c2)) System.out.println(“c3 igual a c2”); } Introducción a la Programación Orientada a Objetos IPOO

CASO DE ESTUDIO: CÍRCULO Y PUNTO p1=new Punto(1,2); c2=new Circulo(7.5,p1); c3=new Circulo(7.5,p1); if (c3.equals(c2)) System.out.println(“c3 igual a c2”); 20 public boolean equals(Circulo c){ return radio == c.obtenerRadio() && centro == c.obtenerCentro(); } El estado interno de c3 y c2 mantienen una misma referencia

CASO DE ESTUDIO: CÍRCULO Y PUNTO p1=new Punto(1,2); p2=new Punto(1,2); c1=new Circulo(7.5,p1); c3=new Circulo(7.5,p2); if (c3.equals(c1)) System.out.println(“c3 igual a c1”); 21 public boolean equals(Circulo c){ return radio == c.obtenerRadio() && centro == c.obtenerCentro(); } p1 y p2 tiene el mismo estado interno pero distinta identidad. Igualdad superficial, el operador relacional compara referencias.

CASO DE ESTUDIO: CÍRCULO Y PUNTO p1=new Punto(1,2); p2=new Punto(1,2); c1=new Circulo(7.5,p1); c3=new Circulo(7.5,p2); if (c3.equals(c1)) System.out.println(“c3 igual a c1”); 22 public boolean equals(Circulo c){ return radio == c.obtenerRadio() && centro.equals(c.obtenerCentro()); } NOTEMOS QUE NO ES UNA LLAMADA RECURSIVA Igualdad profundidad, compara los estados internos.

CASO DE ESTUDIO: CÍRCULO Y PUNTO 23 public void copy (Circulo c){ radio = c.obtenerRadio(); centro = c.obtenerCentro(); } Copy superficial, asigna referencias.

CASO DE ESTUDIO: CÍRCULO Y PUNTO 24 public void copy (Circulo c){ radio = c.obtenerRadio(); centro.copy(c.obtenerCentro()); } Copy en profundidad, el punto tiene el mismo estado interno que el punto del círculo que pasó como parámetro, pero no la misma identidad.

CASO DE ESTUDIO: CÍRCULO Y PUNTO 25 public Circulo clone (){ return new Circulo(radio,centro); } Clone superficial, asigna referencias.

CASO DE ESTUDIO: CÍRCULO Y PUNTO 26 public Circulo clone (){ return new Circulo (radio, centro.clone()); } Clone en profundidad, crea un nuevo círculo con el centro con el mismo estado interno que el objeto que recibe el mensaje, pero otra identidad.

CASO DE ESTUDIO: CÍRCULO Y PUNTO class Geometria{ … public void movimiento(){ Punto p1,p2; Circulo c; p1 = new Punto(1,2); p2 = new Punto(-1,2.5); c = new Circulo(5,p1); System.out.println(c.toString()); c.escalar(10); System.out.println(c.toString()); c.trasladar(p2); System.out.println(c.toString()); } } 27

Introducción a la Programación Orientada a Objetos IPOO TEMARIO Tipo de dato abtracto (TDA). Caso de estudio: Círculo y Punto. Círculo y Punto. Cambio en la estructura.

CASO DE ESTUDIO: CÍRCULO Y PUNTO (CAMBIO EN LA ESTRUCTURA) La clase Circulo encapsula sus atributos, define entonces un tipo de dato abstracto a partir del cual es posible crear instancias. La representación del conjunto de valores y la implementación de las operaciones queda escondida dentro de la clase. Es decir, los atributos centro y radio están encapsulados, la estructura del estado interno puede cambiar y el cambio no es visible para las clases que usan a Circulo. Introducción a la Programación Orientada a Objetos IPOO Por ejemplo, un círculo queda representado por su centro y un punto cualquiera de la circunferencia.

CASO DE ESTUDIO: CÍRCULO Y PUNTO (CAMBIO EN LA ESTRUCTURA) Introducción a la Programación Orientada a Objetos IPOO Circulo > pi: real > centro: Punto punto: Punto > Circulo(r: real, p: Punto) … La interface no cambia. Todos los servicios mantienen la signatura. Las clases que usan a Circulo no perciben el cambio en el diseño.

CASO DE ESTUDIO: CÍRCULO Y PUNTO (CAMBIO EN LA ESTRUCTURA) 31 y x p r El constructor sigue recibiendo como parámetro el punto que denota el centro y el radio, pero no almacena el radio sino que lo usa para computar un punto de la circunferencia. public Circulo (float r, Punto p){ punto = new Punto(p.obtenerX()+r,p.obtenerY()); centro = p; } Circulo > pi: real > centro: Punto punto: Punto > Circulo(r: real, p: Punto) …

CASO DE ESTUDIO: CÍRCULO Y PUNTO (CAMBIO EN LA ESTRUCTURA) 32 Circulo > pi: real > centro: Punto punto: Punto > Circulo(r: real, p: Punto) > trasladar(p: Punto) escalar(r: real) El comando trasladar modifica el atributo centro, pero también tiene que modificar punto, para que el círculo mantenga el mismo radio. El comando escalar recibe el radio y debe computar nuevamente el valor del atributo punto. Introducción a la Programación Orientada a Objetos IPOO

CASO DE ESTUDIO: CÍRCULO Y PUNTO (CAMBIO EN LA ESTRUCTURA) 33 Circulo > pi: real > centro: Punto punto: Punto > Circulo(r: real, p: Punto) > trasladar(p:Punto) escalar(r:real) copy (c: Circulo) > obtenerCentro():Punto obtenerRadio():real area():real perimetro():real equals(c:Circulo):boolean clone():Circulo El radio ya no es un atributo, se computa a partir de la distancia entre dos puntos. Cuando un objeto de clase Circulo recibe el mensaje obtenerRadio() envía el mensaje distancia al atributo de instancia centro. //Consultas public float obtenerRadio(){ return centro.distancia(punto); }

CASO DE ESTUDIO: CÍRCULO Y PUNTO (CAMBIO EN LA ESTRUCTURA) 34 Circulo > pi: real > centro: Punto punto: Punto > Circulo(r: real, p: Punto) > trasladar(p:Punto) escalar(r:real) copy (c: Circulo) > obtenerCentro():Punto obtenerRadio():real area():real perimetro():real equals(c:Circulo):boolean clone():Circulo El radio debe computarse cada vez que se usa. //Consultas public Punto obtenerCentro(){ return centro; } public double perimetro(){ return pi*2*obtenerRadio(); } public double area(){ float r = obtenerRadio(); return pi*r*r; }

CASO DE ESTUDIO: CÍRCULO Y PUNTO (CAMBIO EN LA ESTRUCTURA) Si los atributos no estuvieran encapsulados, las clases Clientes podrían acceder directamente al radio. Al cambiar la representación del círculo, sería necesario cambiar el código de todas las clases cliente. Complete la implementación de esta alternativa de diseño para la clase Circulo. Introducción a la Programación Orientada a Objetos IPOO