1 / 33

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.

chidi
Download Presentation

Abstracción

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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. Abstracción

  2. 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. Abstracción

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

  4. 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. Abstracción y POO

  5. 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. Abstracción y Encapsulamiento

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

  7. Punto <<atributos de instancia>> x,y:real Caso de Estudio: Punto <<Constructores>> Punto(X,Y:real) <<Comandos>> copy (p:Punto) establecerX(x:real) establecerY(y:real) <<Consultas>> obtenerX():real obtenerY():real equals(p:Punto):boolean distancia(p:Punto):real clone():Punto toString():String

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

  9. Punto <<atributos de instancia>> x,y:real Caso de Estudio: Punto <<Comandos>> copy (p:Punto) establecerX(x:real) establecerY(y:real) publicestablecerX (float x){ this.x = x; } publicestablecerY (float y){ this.x = Y; } publicvoidcopy (Punto p){ x = p.obtenerX(); y = p.obtenerY(); }

  10. Punto <<atributos de instancia>> x,y:real Caso de Estudio: Punto <<Consultas>> obtenerX():real obtenerY():real //Consultas publicfloatobtenerX(){ return x; } publicfloatobtenerY(){ return y; }

  11. Punto <<atributos de instancia>> x,y:real Caso de Estudio: Punto <<Consultas>> … distancia(p:Punto):real //Consultas … publicdouble distancia(Punto p) { floatdx= x - p.obtenerX(); floatdy= y - p.obtenerY(); returnMath.sqrt(dx*dx+dy*dy); }

  12. Punto <<atributos de instancia>> x,y:real Caso de Estudio: Punto <<Consultas>> … equals(p:Punto):boolean clone():Punto toString():String publicbooleanequals (Punto p){ return x==p.obtenerX() && y==p.obtenerY(); } public Punto clone(){ return new Punto(x,y); } publicStringtoString(){ 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. Circulo Punto <<atributos de clase>> pi:real <<atributos de instancia>> radio:real punto:Punto <<atributos de instancia>> x,y:real Caso de Estudio: Circulo <<Constructores>> Punto(X,Y:real) <<Comandos>> copy (p:Punto) establecerX(x:real) establecerY(y:real) <<Consultas>> obtenerX():real obtenerY():real equals(p:Punto):boolean distancia(p:Punto):real clone():Punto toString():String <<Constructores>> Circulo(r:real,p:Punto) <<Comandos>> trasladar(p:Punto) escalar(r:real) copy (c: Circulo) <<Consultas>> obtenerCentro():Punto obtenerRadio():real area():real perimetro():real equals(c:Circulo):boolean clone():Circulo

  15. Las clases Circulo y Punto están relacionadas por asociación. La clase Circulotiene 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 class Circulo { //Atributo de clase privatestatic final float pi=3.1415; //Atributos de Instancia privatefloat radio; private Punto centro; //Constructor publicCirculo (float r, Punto p){ radio = r; centro = p; } //Comandos publicvoid trasladar(Punto p){ centro = p; } publicvoid escalar(float r){ radio = r; } <<atributos de clase>> pi:real <<atributos de instancia>> radio:real punto:Punto Caso de Estudio: Circulo <<Constructores>> Circulo(r:real,p:Punto) <<Comandos>> trasladar(p:Punto) escalar(r:real) copy (c: Circulo)

  17. Circulo //Consultas public Punto obtenerCentro(){ return centro; } publicfloatobtenerRadio(){ return radio; } publicdoubleperimetro(){ returnpi * 2 *radio; } publicdoublearea(){ returnpi * radio * radio; } <<atributos de clase>> pi:real <<atributos de instancia>> radio:real punto:Punto Caso de Estudio: Circulo <<Constructores>> Circulo(r:real,p:Punto) <<Comandos>> trasladar(p:Punto) escalar(r:real) copy (c: Circulo) <<Consultas>> obtenerCentro():Punto obtenerRadio():real area():real perimetro():real

  18. Circulo //Consultas public Punto obtenerCentro(){ return centro; } publicfloatobtenerRadio(){ return radio; } publicdoubleperimetro(){ returnpi * 2 *radio; } publicdoublearea(){ returnpi * radio * radio; } <<atributos de clase>> pi:real <<atributos de instancia>> radio:real punto:Punto Caso de Estudio: Circulo <<Constructores>> Circulo(r:real,p:Punto) <<Comandos>> trasladar(p:Punto) escalar(r:real) copy (c: Circulo) <<Consultas>> obtenerCentro():Punto obtenerRadio():real area():real perimetro():real equals(c:Circulo):boolean clone():Circulo

  19. La clase Circulousa 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. classGeometria{ … publicvoid 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. Caso de Estudio: Circulo

  22. publicbooleanequals(Circulo c){ return radio == c.obtenerRadio() && centro ==c.obtenerCentro(); } Caso de Estudio: Circulo • 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 Igualdad superficial, el operador relacional compara referencias

  23. publicbooleanequals(Circulo c){ return radio == c.obtenerRadio() && centro.equals(c.obtenerCentro()); } Caso de Estudio: Circulo • 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 Igualdad profundidad, compara los estados internos.

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

  25. publicvoidcopy (Circulo c){ radio = c.obtenerRadio(); centro.copy(c.obtenerCentro()); } Caso de Estudio: Circulo 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. publicCirculo clone (){ return new Circulo (radio,centro); } Caso de Estudio: Circulo Clone superficial, asigna referencias.

  27. publicCirculo clone (){ return new Circulo (radio, centro.clone()); } Caso de Estudio: Circulo 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 Circulotambié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 La interface no cambia. Todos los servicios mantienen la signatura. Las clases que usan a Circulo no perciben el cambio en el diseño. <<atributos de clase>> pi:real <<atributos de instancia>> centro:Punto punto:Punto Caso de Estudio: Circulo <<Constructores>> 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.

  30. Circulo 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. <<atributos de clase>> pi:real <<atributos de instancia>> centro:Punto punto:Punto Caso de Estudio: Circulo <<Constructores>> Circulo(r:real,p:Punto) <<Comandos>> trasladar(p:Punto) escalar(r:real)

  31. Circulo //Consultas publicfloatobtenerRadio(){ returncentro.distancia(punto); } <<atributos de clase>> pi:real <<atributos de instancia>> centro:Punto punto:Punto Caso de Estudio: Circulo <<Constructores>> Circulo(r:real,p:Punto) <<Comandos>> trasladar(p:Punto) escalar(r:real) copy (c: Circulo) <<Consultas>> 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 los puntos.

  32. Circulo //Consultas public Punto obtenerCentro(){ return centro; } publicdoubleperimetro(){ returnpi*2*obtenerRadio(); } publicdoublearea(){ float r = obtenerRadio() return pi*r*r; } <<atributos de clase>> pi:real <<atributos de instancia>> centro:Punto punto:Punto Caso de Estudio: Circulo <<Constructores>> Circulo(r:real,p:Punto) <<Comandos>> trasladar(p:Punto) escalar(r:real) copy (c: Circulo) <<Consultas>> obtenerCentro():Punto obtenerRadio():real area():real perimetro():real equals(c:Circulo):boolean clone():Circulo 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

More Related