La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


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

1 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 de un problema. Un lenguaje de programación es también una abstracción; la computadora no ejecuta directamente las instrucciones escritas en un lenguaje como Java, el repertorio de instrucciones que brinda la máquina es mucho más simple y reducido. El lenguaje de programación brinda una visión abstracta de la computadora y de los dispositivos que la conforman, en particular la memoria.

2 Abstracción Todo lenguaje de programación de alto nivel soporta cierto nivel de abstracción en el concepto de tipo de dato. Cuando un lenguaje brinda, por ejemplo, el tipo de dato float, el programador puede usar un conjunto de facilidades sin acceder a la implementación concreta. Conoce el rango de valores que una variable de tipo float puede tomar, conoce las operaciones provistas por el tipo, pero no conoce la representación interna en memoria de una variable, ni el código específico de cada operación.

3 Abstracción y POO En la programación orientada a objetos el mecanismo de modularización es la clase. En la etapa de implementación, una clase es una unidad de programación. Las clases se vinculan entre sí través de relaciones de asociación, dependencia y herencia. Un lenguaje que soporta abstracción debe brindar algún mecanismo para que el programador pueda, no sólo utilizar, sino también definir módulos de software independientes.

4 Abstracción y POO Una clase puede usarse para definir un tipo de dato a partir del cual es posible crear instancias en ejecución. Si la representación de los atributos está encapsulada, el tipo de dato es abstracto, porque las instancias se crean sin conocer cómo es la representación del estado interno ni la implementación de las operaciones. El concepto de abstracción está entonces fuertemente ligado al de encapsulamiento.

5 Abstracción y Encapsulamiento El encapsulamiento es mecanismo que permite esconder los detalles de la implementación de un módulo, de modo que sus clientes sólo conozcan su funcionalidad. Cada módulo es utilizado como una “caja negra”, esto es, sabiendo qué hace sin saber cómo lo hace. Se reducen así las dependencias entre diferentes módulos de software, cada uno de los cuales es más fácil de leer, verificar y modificar.

6 TDA Un tipo de dato define un conjunto de operaciones que se aplican sobre un conjunto de valores. Un tipo de dato abstracto (TDA) es un tipo de dato en el cual la representación de los datos y la implementación de las operaciones está encapsulada. Es posible crear instancias del tipo y usar las operaciones conociendo qué hacen, pero no cómo lo hacen.

7 Caso de Estudio: Punto 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 distancia(p:Punto):real clone():Punto toString():String

8 Caso de Estudio: Punto Punto > x,y:real > Punto(x,y:real) class Punto{ //Atributos de Instancia private float x,y; //Constructores public Punto (float x,float y){ this.x = x; this.y = y; }

9 Caso de Estudio: Punto Punto > x,y:real > copy (p:Punto) establecerX(x:real) establecerY(y:real) public establecerX (float x){ this.x = x; } public establecerY (float y){ this.x = Y; } public void copy (Punto p){ x = p.obtenerX(); y = p.obtenerY(); }

10 Caso de Estudio: Punto Punto > x,y:real > obtenerX():real obtenerY():real //Consultas public float obtenerX(){ return x; } public float obtenerY(){ return y; }

11 Caso de Estudio: Punto Punto > x,y:real > … distancia(p:Punto):real //Consultas … public double distancia(Punto p) { float dx= x - p.obtenerX(); float dy= y - p.obtenerY(); return Math.sqrt(dx*dx+dy*dy); }

12 Caso de Estudio: Punto Punto > x,y:real > … equals(p:Punto):boolean clone():Punto toString():String 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+")"; }

13 Las clases Punto define un tipo de dato abstracto. Define un conjunto de valores, todos los pares de números reales y un conjunto de operaciones que corresponden a los servicios provistos por la clase. La clase Punto va a ser construida y verificada sin necesidad de conocer a sus clases cliente. Caso de Estudio: Punto

14 Caso de Estudio: Circulo Circulo > pi:real > radio:real 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 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 distancia(p:Punto):real clone():Punto toString():String

15 Las clases Circulo y Punto están relacionadas por asociación. La clase Circulo tiene un atributo de clase 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. Existe también una relación de dependencia entre Circulo y Punto. Caso de Estudio: Circulo

16 Circulo > pi:real > radio:real punto: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; }

17 Caso de Estudio: Circulo Circulo > pi:real > radio:real punto:Punto > Circulo(r:real,p:Punto) > trasladar(p:Punto) escalar(r:real) copy (c: Circulo) > obtenerCentro():Punto obtenerRadio():real area():real perimetro():real //Consultas public Punto obtenerCentro(){ return centro; } public float obtenerRadio(){ return radio; } public double perimetro(){ return pi * 2 *radio; } public double area(){ return pi * radio * radio; }

18 Caso de Estudio: Circulo Circulo > pi:real > radio:real 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 //Consultas public Punto obtenerCentro(){ return centro; } public float obtenerRadio(){ return radio; } public double perimetro(){ return pi * 2 *radio; } public double area(){ return pi * radio * radio; }

19 La clase Circulo usa los servicios provistos por la clase Punto sin conocer la representación del conjunto de valores ni la implementación de las operaciones. Caso de Estudio: Circulo

20 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”); } } Caso de Estudio: Circulo

21

22 public boolean equals(Circulo c){ return radio == c.obtenerRadio() && centro == c.obtenerCentro(); } Igualdad superficial, el operador relacional compara referencias 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); p1 y p2 tiene el mismo estado interno pero distinta identidad

23 Caso de Estudio: Circulo public boolean equals(Circulo c){ return radio == c.obtenerRadio() && centro.equals(c.obtenerCentro()); } Igualdad profundidad, compara los estados internos. 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); NOTEMOS QUE NO ES UNA LLAMADA RECURSIVA

24 Caso de Estudio: Circulo public void copy (Circulo c){ radio = c.obtenerRadio(); centro = c.obtenerCentro(); } Copy superficial, asigna referencias.

25 Caso de Estudio: Circulo 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.

26 Caso de Estudio: Circulo public Circulo clone (){ return new Circulo (radio,centro); } Clone superficial, asigna referencias.

27 Caso de Estudio: Circulo 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.

28 La clase Circulo también define 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. El diseño y la implementación pueden cambiar y el cambio no será visible para las clases cliente, en tanto la interface siga siendo la misma. Caso de Estudio: Circulo

29 Circulo > pi:real > centro:Punto punto:Punto > Circulo(r:real,p:Punto) El constructor sigue recibiendo como parámetro el punto que denota el centro y el radio. El código del constructor cambia, asigna el segundo parámetro al atributo centro y computa el atributo punto, calculando un punto cualquiera de la circunferencia con radio r. La interface no cambia. Todos los servicios mantienen la signatura. Las clases que usan a Circulo no perciben el cambio en el diseño.

30 Caso de Estudio: Circulo Circulo > pi:real > centro:Punto punto:Punto > Circulo(r:real,p:Punto) > trasladar(p:Punto) escalar(r:real) El comando trasladar modifica el 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.

31 Caso de Estudio: Circulo 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 //Consultas public float obtenerRadio(){ return centro.distancia(punto); } El radio ya no es un atributo, se computa a partir de la distancia entre los puntos.

32 Caso de Estudio: Circulo 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 //Consultas public Punto obtenerCentro(){ return centro; } public double perimetro(){ return pi*2*obtenerRadio(); } public double area(){ float r = obtenerRadio() return pi*r*r; } El radio debe computarse cada vez que se usa

33 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 círculo. Caso de Estudio: Circulo


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

Presentaciones similares


Anuncios Google