46
Facultad de Ingeniería Universidad de Buenos Aires 75-08 Sistemas Operativos Lic. Ing. Osvaldo Clúa 2007 Introducción a la Orientación a Objetos

Introducción a la Programación Orientada a Objetosmaterias.fi.uba.ar/7508/Teoria-2007/OOIntro.pdf · 75-08 Sistemas Operativos FIUBA 2007 Prof. Lic. Ing. Osvaldo Clíúa 2 El paradigma

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Facultad de IngenieríaUniversidad de Buenos 

Aires

75-08 Sistemas OperativosLic. Ing. Osvaldo Clúa

2007

Introducción a la Orientación a Objetos

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 2

El paradigma de la Orientación a Objetos

● Las metodologías estructuradas no resolvieron el cuello de botella del mantenimiento.– Las técnicas clásicas son orientadas a operaciones o

a datos, pero no a ambos.– Esto se ve en los menús clásicos de los sistemas de

esa época.– La orientación a objetos da igual importancia a los

datos que a las operaciones.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 3

Definición de las operaciones

● Ingeniería de código– Pre y Post condición con sus formalismos (

lógica de Hoare o Floyd).– Variantes e invariantes de algoritmos.– Cifras de mérito (acople y cohesión).

● Para el usuario de la operación solo es necesario conocer los estados anterior y posterior de la operación.

● Los algoritmos deben permanecer ocultos al usuario de la operación.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 4

Definición de los Datos

● Ingeniería de Código– Estructuras de Datos estáticas, dinámicas y genéricas.– Persistencia, seguridad, coherencia.

● Encapsulado de datos– Se conoce su diagrama de estados.– Se conoce el efecto de cada operación en función de su

diagrama de estados.● El usuario no precisa conocer los detalles de la

implementación de los datos.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 5

Tipo Abstracto de Datos (TAD)

● Estructura y operaciones en la misma construcción de programación.– Una parte expuesta: operaciones y cambios de

estados producidos.– Una parte oculta: la implementación de datos y

operaciones. (Lógica de separación)● Este principio se conoce como Ocultamiento de

la Información (Information hiding - Parnas )

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 6

Operaciones sobre los TAD

● Las operaciones sobre un TAD pueden clasificarse como:– Construcción de una nueva instancia del TAD– Producción de un TAD a partir de otro u otros.– Mutación del estado de un TAD.– Observación del estado de un TAD.

● Es buena ingeniería de código que las operaciones sean de un solo tipo.

● Ver MIT - Laboratory on Software Engineering, (Curso 6-170 MIT)

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 7

Invariantes de Representación

• El comportamiento de un TAD es independiente de su representación (Invariante de representación).

● Su desarrollo histórico abarca:– Built-in types (integer, boolean ...) El compilador controla las

operaciones que se pueden hacer sobre ellos.– User defined types (Wirth). Permiten al programador

definir tipos en función de tipos ya existentes.– Abstract Data Types. Juntan la definición del tipo con sus

operaciones en una misma construcción del lenguaje.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 8

Función de Abstracción

● El conjunto de valores que debe soportar un tipo de datos se conoce como valores abstractos.

● Sigue un desarrollo histórico paralelo al del invariante de representación. (Built-in, User defined, TAD).

● La función de abstracción relaciona los valores abstractos con los reales de TAD.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 9

Especificación de un TAD

● Invariante de Representación: Indica si un TAD está bien formado.– Permite un razonamiento modular acerca del TAD.– Conviene escribirlo, aunque sea informalmente. De los

contrario deben leerse todas las operaciones para entender un TAD.

● Función de abstracción: indica como un determinado valor del TAD se corresponde con un valor abstracto.– A veces el esfuerzo de escribirla no ayuda demasiado al

diseño.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 10

Orientación a Objetos● Hay Orientación a Objetos cuando hay:

– Tipos Abstractos de Datos.– Herencia.– Polimorfismo.

● Se llaman Basados en Objetos los lenguajes que solo soportan los TAD.

● Los TAD se llaman Clases.● Las Instancias de las Clases se llaman Objetos.● Las operaciones se llaman Métodos.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 11

Relaciones entre las Clases

• Uso de un objeto de una clase (servidor) por parte de un objeto de otra clase (cliente).

• Composición (agregación) de clases para crear una nueva. (has_a).

• Generalización o especialización de las clases. (is_a).

• Ver por ejemplo el libro de Champeaux

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 12

Relación de Uso● El diagrama de la Relación de Uso puede

tener una forma de:– Árbol.– Capas.– Ciclos.

● Conocer un diagrama de uso permite:– Hacer un análisis de Impacto de un cambio.– Identificar oportunidades de reuso de código.– Determinar un orden de construcción.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 13

Reuso

● Se pensó que la cohesión funcional permitiría el reuso. Sin embargo los módulos del modelo clásico no eran autocontenidos.

● La cohesión de un TAD u Objeto bien diseñado se conoce como Informacional.

● Si el TAD modela correctamente todos los aspectos de una entidad (real o abstracta) y oculta los detalles de su implementación, hace mas fácil su reuso.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 14

Casos de Reuso

● Puede haber Reuso del Diseño, Reuso de la Implementación o situaciones intermedias. – Design Patterns Los patrones son soluciones generales a problemas

recurrentes. Dan una guía para el desarrollo de las relaciones entre objetos.

– Architecture: describe la estructura de la estructura de una aplicación. Da una guía para el desarrollo global de la aplicación.

– Framework: Se reusa la lógica de control de un diseño. El desarrollador solo se ocupa de las operaciones específicas del producto a construir (hot spots).

– Component: se basa en desarrollar clases que luego se integren a una Arquitectura por medio de un Framework.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 15

Clases● La unidad de definición de datos y Comportamiento.

– Convención Java: se escriben con la primer letra en mayúsculas.

UML

Class Fraccion {private int numerador;private int denominador;public Fraccion (int num, int den){…}public int getNum(){…}public int getDen(){…}

}

Java

"+" public"#" protected"-" private"~" package Convenciones del Diagrama de Clases UML

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 16

Atributos y métodos

Atributos, Variables de Instancia, Miembros de datos, campos.

Class Fraccion {private int numerador;private int denominador;public Fraccion (int num, int den){…}public int getNum(){…}public int getDen(){…}

}

Métodos, Miembros funcionales, Mensajes.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 17

Atributos

● Conservan el estado de un objeto.– Variables de instancia (cambian con cada

objeto).– Variables de clase (tienen el mismo valor para

todos los objetos).– Convención Java: se escriben con la primer

letra en minúscula.– Constantes.

● Convención Java: se escriben todo en mayúscula.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 18

Atributos

• static– Es la forma de

indicar que se mantiene su valor para toda la clase.

• final– Es la forma de

indicar que es inmutable.

Public class Ejemplo{

private int variable_de_instancia;

private static int variable_de_clase;

public static final int CONSTANTE=360;

. . .

}

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 19

Métodos

● Son los que hacen las operaciones.– Construcción de un Objeto.– Mutación del estado de un objeto.– Producción de un Objeto a partir de otro.– Observación del estado de un objeto.

● Pueden ser de instancia o de clase.● Se invocan en el ambiente de un objeto o de

una clase.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 20

public class Fraccion{

private int num;

private int den;

Fraccion (int n, int d){

num=n;den=d;}

public int getNum(){return num;}

public int getDen(){return den;}

public void setNum(int n){

num=n;}

public void setDen(int n){

den=n;}

public boolean esMayor

(Fraccion f){..}

public static Fraccion max

(Fraccion f1, Fraccion f2)

{..}

private int static mcd (int u, int d)

{..}

public void simplificar(){..};

}

Métodos

Constructor

Observador

Mutador

Productor

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 21

public class PruebaFraccion{

public statc void main

(String args a[]) {

Fraccion f1;

f1=new Fraccion (5,2);

Fraccion f2=new Fraccion (6,8);

Fraccion f3;

System.out.println (“f1=“+

f1.getNum()+”/”+f1.getDen());

f1.setNum(7);

f2.simplificar();

f3=Fraccion.max(f1,f2);

}

}

Invocación de métodos

El método por donde comienza la ejecución.

Construcción de f1.

Observación de estado.

Mutación de estado.

Producción de f3.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 22

Ambiente de miembros(Scope)

● Los miembros deben denotar el ambiente de un objeto.

● Si se trata de un elemento estático deben incluir el ambiente de la clase.…

Fraccion f1=new Fraccion (6,8);

Fraccion f2=new Fraccion (7,5);

int i1= f1.getNum();

Fraccion f2= Fraccion.max(f1,f2);

getNum no es estático, se invoca en ambiente de f1.

max es estático, se invoca en ambiente de Fraccion.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 23

Visibilidad de los miembros

● Privados, solo pueden usarse en esa clase.

● Públicos, los puede usar cualquiera

● ¿Debe ser privado o público?– Invariante de

representación– Función de

abstracción.

public class Fraccion{

private int num;

private int den;

Fraccion (int n, int d){

num=n;den=d;}

public int getNum(){return num;}

public int getDen(){return den;}

public void setNum(int n){

num=n;}

public void setDen(int n){

den=n;}

public boolean esMayor

(Fraccion f){..}

public static Fraccion max

(Fraccion f1, Fraccion f2)

{..}

private int static mcd (int u, int d)

{..}

public void simplificar(){..};

}

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 24

Refinando la clase Fracción

● Función de Abstracción: – Números racionales.

● Invariante de representación– 1/2=2/4=3/6 etc. …

public class Fraccion{

private int num;

private int den;

Fraccion (int n, int d){

num=n;den=d; simplificar()}

public int getNum(){return num;}

public int getDen(){return den;}

public void setNum(int n){

num=n; simplificar();}

public void setDen(int n){

den=n; simplificar();}

public boolean esMayor

(Fraccion f){..}

public static Fraccion max

(Fraccion f1, Fraccion f2)

{..}

private int static mcd (int u, int d)

{..}

private void simplificar(){..};

}

•Se oculta la representación.

•Se asegura la coherencia de la representación.

•¿Este método pertenece a ésta clase?

•¿Se puede pasar de punto flotante a fracción?

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 25

Herencia

● Es una forma de obtener nuevas clases a partir de clases existentes.– Super Clase y Sub Clase.

● Una SubClase adquiere todos los métodos de la SuperClase (herencia).

● Puede cambiar alguno de los métodos heredados (especialización).

● Puede agregar nuevos campos o métodos (extensión).

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 26

Herencia en UML

● UML es un lenguaje de modelado.– La herencia es una

característica de la Programación OO.

– UML no modela la herencia sino la relación que le da origen.

SubClase.

SuperClase.

Relación is_a (generalización).

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 27

Herencia en Javapublic class Fraccion{

private int num;private int den;Fraccion (int n, int d){..} . . .}

public class FraccionOper extends Fraccion {

FraccionOper(){super();}

public FraccionOper mas(Fraccion f){. . .}

}

•SuperClase.

•La SubClase extiende a la SuperClase.

•Se llama al constructor de la SuperClase.

•Toda FraccionOper es una Fraccion.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 28

Uso de la Herencia en Javapublic class PruebaFraccionOp{

public statc void main (String args a[]) {Fraccion f1=new Fraccion (5,2);FraccionOper f2=new FraccionOper (7,8);FraccionOper f3=new FraccionOper(5,4);

FraccionOper f4=f2.mas(f3);

FraccionOper f5=f2.mas(f1);

FraccionOper f6=f1.mas(f2);}

}

Suma de dos FraccionOper.

Suma de una FraccionOper

con una Fracción.

Una Fracción NO PUEDE invocar al método mas.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 29

Visibilidad de los miembrosen Java

• protected indica que el miembro es accesible solo a los de su clase y a sus descendientes.

● Las clases se agrupan en paquetes (package)● Si no se pone modificador de visibilidad, los

miembros son accesibles a todas las clases del mismo paquete.

● Los paquetes se definen durante el Design Workflow del USDP (Unified Software Development Process ).

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 30

Sobre la noción de herencia

● Ver artículo de Antero Taivalsaari. (Hay copia en la página de la materia)

● Es un ejemplo de programación incremental.– R=P+ΔR. ΔR puede extender, heredar, cancelar

o especializar propiedades de P.● Es una forma de reusar código.● Modela una relación entre clases.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 31

Herencia múltiple.

Class Fraccion {private int numerador;private int denominador;public Fraccion (int num, int den){…}public int getNum(){…}public int getDen(){…}

}

Class Ordenable {public boolean esMayor(Ordenable a){…}public boolean esIgual(Ordenable a){…}

}

Class Operable {public Operable mas

(Operable a){…}public Operable menos

(Operable a){…}}

•¿De que clase conviene hacer descender a la clase Fraccion?– Ambas candidatas son útiles (sirven de base para algoritmos).– Java no admite herencia múltiple. (Ver el Problema del diamante)

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 32

Herencia y Contratos

● El diseño indica que relación debe modelar la herencia.

● La SuperClase puede usarse para obligar a las subclases a implementar un método (Contrato).– Pero aun no se conoce como implementar el

método.– Se pueden hacer entonces clases abstractas.

(Java).

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 33

Clases Abstractas (Java)

● Se diseñan únicamente para ser SuperClases.● Pueden tener métodos enunciados y sin programar

(métodos abstractos).● Pueden tener variables de instancia y métodos

programados.● No pueden instanciarse (no existen objetos

derivados de clases abstractas).● Pueden usarse como parámetros.● Las SubClases deben programar los métodos

abstractos.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 34

Uso de Clases Abstractas (Java)public abstract class Ordenable{

public boolean esMayor(Ordenable a);public boolean esIgual(Ordenable a);

}

public class Fraccion extends Ordenable{

...

boolean esMayor(Ordenable a){

. . . }

oolean esIgual(Ordenable a){

. . .}

}

public class Util {

...

static Ordenable max

(Ordenable a, Ordenable b){

if ( a.esMayor(b) )

return a;

else return b;

}

. . .

Se obliga a programar estos métodos.Se pueden usar en algoritmos.

public abstract class Ordenable{

boolean esMayor(Ordenable a);

boolean esIgual(Ordenable a);

}

No es un productor!!

Fraccion f3= (Fraccion) Util.max (new Fraccion (3,4), new Fraccion (7,8))

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 35

Uso de Clases Abstractas (Java)

Se obliga a programar estos métodos.Se pueden usar en algoritmos.

No es un productor!!

Fraccion f3= (Fraccion) Util.max (new Fraccion (3,4), new Fraccion (7,8))

public abstract class Ordenable{

boolean esMayor(Ordenable a);

boolean esIgual(Ordenable a);

}

public class Fraccion extends Ordenable{

...

boolean esMayor(Ordenable a){

. . . }

oolean esIgual(Ordenable a){

. . .}

}

public class Util {

...

static Ordenable max

(Ordenable a, Ordenable b){

if ( a.esMayor(b) )

return a;

else return b;

}

. . .

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 36

Interface (Java- Ada 2005)

● Es un contrato para programar ciertos métodos.

● Las clases pueden implementar una o varias interfaces.

● No pueden tener datos ni métodos programados ni static.

● Es una solución al problema de la falta herencia múltiple en Java.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 37

Uso de las Interfaces (Java)public abstract class Ordenable{

public boolean esMayor(Ordenable a);public boolean esIgual(Ordenable a);

}

public class Fraccion implements Ordenable{...boolean esMayor(Ordenable a){. . . }oolean esIgual(Ordenable a){

. . .}}

public Interface Ordenable{boolean esMayor(Ordenable a);boolean esIgual(Ordenable a);

}

public class Util {...static Ordenable max

(Ordenable a, Ordenable b){if ( a.esMayor(b) )

return a;else return b;

} . . .

Se obliga a programar estos métodos.Se pueden usar en algoritmos.

No es un productor!!

Fraccion f3= (Fraccion) Util.max (new Fraccion (3,4), new Fraccion (7,8))

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 38

¿Interfaces o Clases Abstractas?(Java, Ada 2005)

● Una interface:– Define el borde de comunicación entre dos clases.– Se refiere a una abstracción que una entidad provee de sí

misma al exterior.● Las distintas clases que implementan una interface

comparten un protocolo.● Las clases abstractas (Ada 2005):

– Permiten implementaciones parciales.– Permiten poner la funcionalidad en el nivel correspondiente.

● Se decide en el Design Workflow del USDP.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 39

Polimorfismo (Java)

class PoliA extends Poli{String uno(){

return “uno() de PoliA “;}}

Class Poli{String uno(){

return “uno() de Poli “;}

class PoliB extends Poli{String uno(){

return “uno() de PoliB “;}}

class Util{. . .static String uso (Poli p){

return p.uno();}}

. . .System.out.println(

Util.uso(new PoliA() );

¿Cuál es el usado?

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 40

#include <iostream>using namespace std;class Poli{public: virtual void a(){cout<<"Metodo

a(), Poli"<<endl;}};class Uno :public Poli {public: void a(){cout<<"Metodo

a(), Uno"<<endl;}};class Dos: public Poli{public: void a(){cout<<"Metodo a()

de Dos"<<endl;}};

Polimorfismo (C++)

class Uso {

public:

void usa(Poli &x){x.a();}

};

int main(){

Poli p;

Uno u; Dos d;

Uso s;

cout<<"s.usa(p) "; s.usa(p); cout<<"s.usa(u) "; s.usa(u);

cout<<"s.usa(d) "; s.usa(d);

}

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 41

Dispatching Operations(Ada 95) a

package polis istype Poli is tagged recordnull;end record;

procedure a(p:Poli);

type Uno is new Poli withrecord null;end record;

procedure a (u:Uno);

type Dos is new Poli withrecord null;end record;

procedure a (d:Dos);end polis;

with Ada.Text_IO, Ada.Integer_Text_IO;use Ada.Text_IO, Ada.Integer_Text_IO;

package body polis isprocedure a(p:Poli) isbegin

put_line("Metodo a(p) de Poli");end;procedure a(u:Uno) isbegin

put_line("Metodo a(u) de Uno");end;procedure a(d:Dos) isbegin

put_line("Metodo a(d) de Dos");end;

end polis;

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 42

Polimorfismo (Ada 95) bwith Ada.Text_IO, Ada.Integer_Text_IO,polis;use Ada.Text_IO, Ada.Integer_Text_IO,polis;

procedure prueba is procedure usa(p: Poli'class) is -- ~~~~~ esto implica polimorfismobegin

a(p);-- en ada 2005 p.a;end usa;

p:Poli;u:Uno;d:Dos;begin

put ("usa(p:Poli) ");usa(p);put ("usa(u:Uno) ");usa(u);put ("usa(d:Dos) ");usa(d);

end prueba;

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 43

Polimorfismo

● Principio de sustitución de Liskov.– Una clase puede reemplazarse por sus SubClases sin

alterar su corrección.● La habilidad de objetos de diferente clase de

responder a métodos del mismo nombre de acuerdo a su clase.

● El programador no tiene porque conocer el tipo de objeto por anticipado.– Run-time binding.

● El Artículo original de Liskov.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 44

Polimorfismo en los Lenguajes

● En Java todo método es polimórfico.● En C++ los métodos polimórficos deben

declararse como virtual.● En Ada los parámetros polimórficos deben

marcarse como de ámbito de clase.● Estas diferencias se deben a la

implementación de estos lenguajes.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 45

Polimorfismo vs Programación Genérica

● Polimorfismo– Uso algorítmico de

sub-clases intercambiables

– Conocido como polimorfismo de subtipos.

● Programación Genérica– Acepta argumentos de

diversos tipos no relacionados.– Conocida como polimorfismo

paramétrico.– Una comparación C# vs Java

● C++ templates (incluyendo STL de Stepanov) no genera código, es Pre-Procesamiento.

75-08 Sistemas OperativosProf. Lic. Ing. Osvaldo ClíúaFIUBA 2007 46

Orientación a Objetos● TAD+Herencia+Polimorfismo.● Con estos elementos pueden diseñarse:

– Programas extensibles brindando “clases bases” que el programador extiende (hereda), reusando código y datos.

– Algoritmos con “hot spots” donde el programador pone sus clases, reusando la lógica.

– Clases pre-diseñadas con protocolos de comunicación ya establecidos que el programador integra a su código.

– “Documentos” donde el programador puede desplegar sus objetos e interactuar con otros.