La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

1 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 y Abstracción Caso de estudio: Círculo y Punto Dr. Luciano H. Tamargo http://cs.uns.edu.ar/~lt Depto. de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur, Bahía Blanca 2015

2 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 IPOO - 2015 2 TEMARIO Tipo de dato abtracto (TDA). Caso de estudio: Círculo y Punto. Círculo y Punto. Cambio en la estructura.

3 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 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 - 2015 3

4 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 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 - 2015 4

5 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 IPOO - 2015 5 TEMARIO Tipo de dato abtracto (TDA). Caso de estudio: Círculo y Punto. Círculo y Punto. Cambio en la estructura.

6 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 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 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 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 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.

11 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 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

12 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 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

13 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 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

14 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 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 - 2015 14

15 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 CASO DE ESTUDIO: CÍRCULO Y PUNTO Introducción a la Programación Orientada a Objetos IPOO - 2015 15 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; }

16 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 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.

17 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 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 - 2015 17 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

18 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 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 - 2015 18

19 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 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 - 2015 19

20 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 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

21 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 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.

22 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 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.

23 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 CASO DE ESTUDIO: CÍRCULO Y PUNTO 23 public void copy (Circulo c){ radio = c.obtenerRadio(); centro = c.obtenerCentro(); } Copy superficial, asigna referencias.

24 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 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.

25 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 CASO DE ESTUDIO: CÍRCULO Y PUNTO 25 public Circulo clone (){ return new Circulo(radio,centro); } Clone superficial, asigna referencias.

26 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 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.

27 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 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

28 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 IPOO - 2015 28 TEMARIO Tipo de dato abtracto (TDA). Caso de estudio: Círculo y Punto. Círculo y Punto. Cambio en la estructura.

29 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 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 - 2015 29 Por ejemplo, un círculo queda representado por su centro y un punto cualquiera de la circunferencia.

30 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 CASO DE ESTUDIO: CÍRCULO Y PUNTO (CAMBIO EN LA ESTRUCTURA) Introducción a la Programación Orientada a Objetos IPOO - 2015 30 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.

31 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 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) …

32 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 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 - 2015

33 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 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); }

34 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 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; }

35 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 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 - 2015 35


Descargar ppt "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."

Presentaciones similares


Anuncios Google