Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Modelos y Paradigmas de Programación Programación Orientada a Objetos (1) Juan Francisco Dı́az Frias Maestrı́a en Ingenierı́a, Énfasis en Ingenierı́a de Sistemas y Computación Universidad del Valle, Cali, Colombia Escuela de Ingenierı́a de Sistemas y Computación, home page: http://eisc.univalle.edu.co/ [email protected] Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Abstracción de datos Definición Una abstracción de datos es una manera de usar datos en forma abstracta, i.e., podemos usar los datos sin tener en cuenta su implementación. Ventajas Usar la abstracción suele ser mucho más sencillo Razonar sobre los datos puede ser más sencillo El sistema puede asegurar que los datos se utilicen de la manera correcta Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Abstracción de datos Definición Una abstracción de datos es una manera de usar datos en forma abstracta, i.e., podemos usar los datos sin tener en cuenta su implementación. Ventajas Usar la abstracción suele ser mucho más sencillo Razonar sobre los datos puede ser más sencillo El sistema puede asegurar que los datos se utilicen de la manera correcta Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Tipos Abstractos de datos (1) Definición TAD Un conjunto de valores junto con un conjunto de operaciones sobre esos valores. Puede ser abierto o seguro. Ejemplo: Pila abierta fun fun fun fun {PilaNueva} nil end {Colocar S E} E|S end {Sacar S E} case S of X|S1 then E=X S1 end end {EsVacı́a S} S==nil end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Tipos Abstractos de datos (2) Seguridad proc {NuevoEmpacador ?Envolver ?Desenvolver} Llave={NewName} in fun {Envolver X} {Chunk.new envolver(Llave:X)} end fun {Desenvolver W} try W.Llave catch _ then raise error(desenvolver(W)) end end end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Tipos Abstractos de datos (3) Ejemplo: Pila segura local Envolver Desenvolver in {NuevoEmpacador Envolver Desenvolver} fun {PilaNueva} {Envolver nil} end fun {Colocar S E} {Envolver E|{Desenvolver S}} end fun {Sacar S E} case {Desenvolver S} of X|S1 then E=X {Envolver S1} end end fun {EsVacı́a S} {Desenvolver S}==nil end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Otras maneras de organizar abstracciones Según caracterı́sticas . . . Del modelo declarativo: Abierto o Seguro. Del modelo con estado: Empaquetado o no, Con estado o no. Abierto, declarativo, y desempaquetado El estilo, abierto y declarativo, normal tal como se usa en Prolog y Scheme Seguro, declarativo, y desempaquetado El estilo TAD Seguro, declarativo, y empaquetado El estilo APD con objetos declarativos Seguro, con estado, y empaquetado El estilo APD con objetos con estado, tal como se usa en Smalltalk y Java Seguro, con estado, y desempaquetado El estilo TAD con ‘‘valores’’ con estado Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Pila declarativa, empaquetada, y segura local fun {ObjetoPila S} fun {Colocar E} {ObjetoPila E|S} end fun {Sacar ?E} case S of X|S1 then E=X {ObjetoPila S1} end end fun {EsVacı́a} S==nil end in pila(colocar:Colocar sacar:Sacar esVacı́a:EsVacı́a) end in fun {PilaNueva} {ObjetoPila nil} end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Pila con estado, empaquetada, y segura fun {PilaNueva} C={NewCell nil} proc {Colocar E} C:=E|@C end fun {Sacar} case @C of X|S1 then C:=S1 X end end fun {EsVacı́a} @C==nil end in pila(colocar:Colocar sacar:Sacar esVacı́a:EsVacı́a) end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Pila con estado, empaquetada, y segura (con procedimiento de despacho) fun {PilaNueva} C={NewCell nil} proc {Colocar E} C:=E|@C end fun {Sacar} case @C of X|S1 then C:=S1 X end end fun {EsVacı́a} @C==nil end in proc {$ Msj} case Msj of colocar(X) then {Colocar X} [] sacar(?E) then E={Sacar} [] esVacı́a(?B) then B={EsVacı́a} end end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Pila con estado, desempaquetada, y segura declare local Envolver Desenvolver {NuevoEmpacador Envolver Desenvolver} fun {PilaNueva} {Envolver {NewCell nil}} end proc {Colocar S E} C={Desenvolver S} in C:=E|@C end fun {Sacar S} C={Desenvolver S} in case @C of X|S1 then C:=S1 X end end fun {EsVacı́a S} @{Desenvolver S}==nil end in Pila=pila(nueva:PilaNueva colocar:Colocar sacar:Sacar esVacı́a:EsVacı́a) end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección El estilo Objeto Objeto Una abstracción de datos empaquetada se denomina abstracción procedimental de datos, o APD. Y define una entidad llamada objeto. Ejecución de un objeto Una operación se ejecuta invocando al objeto e informándole cuál operación realizar: “enviar un mensaje al objeto;” Ojo. No lo es, en el sentido que lo hemos estudiado. Una invocación a un objeto es sincrónica. Popularidad Modularidad y estructuración de programas. Facilidad con que el estilo objeto soporta polimorfismo y herencia. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección El estilo Objeto Objeto Una abstracción de datos empaquetada se denomina abstracción procedimental de datos, o APD. Y define una entidad llamada objeto. Ejecución de un objeto Una operación se ejecuta invocando al objeto e informándole cuál operación realizar: “enviar un mensaje al objeto;” Ojo. No lo es, en el sentido que lo hemos estudiado. Una invocación a un objeto es sincrónica. Popularidad Modularidad y estructuración de programas. Facilidad con que el estilo objeto soporta polimorfismo y herencia. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección El estilo Objeto Objeto Una abstracción de datos empaquetada se denomina abstracción procedimental de datos, o APD. Y define una entidad llamada objeto. Ejecución de un objeto Una operación se ejecuta invocando al objeto e informándole cuál operación realizar: “enviar un mensaje al objeto;” Ojo. No lo es, en el sentido que lo hemos estudiado. Una invocación a un objeto es sincrónica. Popularidad Modularidad y estructuración de programas. Facilidad con que el estilo objeto soporta polimorfismo y herencia. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Polimorfismo En lenguaje natural. . . Es la capacidad de una entidad de tomar varias formas. En el contexto de abstracción de datos Una operación es polimórfica si funciona correctamente con argumentos de diferentes tipos. Estilo Objeto vs TAD El polimorfismo es más fácil de expresar en el estilo Objeto. Aunque se puede expresar en el estilo TAD, es más incómodo pues requiere de módulos de primera clase. El estilo TAD ofrece mayor libertad para hacer implementaciones eficientes. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Polimorfismo En lenguaje natural. . . Es la capacidad de una entidad de tomar varias formas. En el contexto de abstracción de datos Una operación es polimórfica si funciona correctamente con argumentos de diferentes tipos. Estilo Objeto vs TAD El polimorfismo es más fácil de expresar en el estilo Objeto. Aunque se puede expresar en el estilo TAD, es más incómodo pues requiere de módulos de primera clase. El estilo TAD ofrece mayor libertad para hacer implementaciones eficientes. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Polimorfismo En lenguaje natural. . . Es la capacidad de una entidad de tomar varias formas. En el contexto de abstracción de datos Una operación es polimórfica si funciona correctamente con argumentos de diferentes tipos. Estilo Objeto vs TAD El polimorfismo es más fácil de expresar en el estilo Objeto. Aunque se puede expresar en el estilo TAD, es más incómodo pues requiere de módulos de primera clase. El estilo TAD ofrece mayor libertad para hacer implementaciones eficientes. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Ejemplo: un tipo Colección Tipo Colección Tres operaciones: agregar para añadir un elemento, extraer para sacar un elemento, y esVacı́a para comprobar si la colección está vacı́a. Implementación En estilo TAD, y en estilo Objeto. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Ejemplo: un tipo Colección Tipo Colección Tres operaciones: agregar para añadir un elemento, extraer para sacar un elemento, y esVacı́a para comprobar si la colección está vacı́a. Implementación En estilo TAD, y en estilo Objeto. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Implementación tipo Colección en estilo TAD (1) Usando una pila con estado, desempaquetada. . . local Envolver Desenvolver {NuevoEmpacador Envolver Desenvolver} fun {NuevaColección} {Envolver {Pila.nueva}} end proc {Agregar C X} S={Desenvolver C} in {Pila.colocar S X} end fun {Extraer C} S={Desenvolver C} in {Pila.sacar S} end fun {EsVacı́a C} {Pila.esVacı́a {Desenvolver C}} end in Colección=colección(nueva:NuevaColección agregar:Agregar extraer:Extraer esVacı́a:EsVacı́a) end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Implementación tipo Colección en estilo TAD (2) Ejemplo de uso C={Colección.nueva} {Colección.agregar C 1} {Colección.agregar C 2} {Browse {Colección.extraer C}} {Browse {Colección.extraer C}} Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Implementación tipo Colección en estilo Objeto Usando una pila con estado, empaquetada. . . fun {NuevaColección} S={PilaNueva} proc {Agregar X} {S.colocar X} end fun {Extraer} {S.sacar} end fun {EsVacı́a} {S.esVacı́a} end in colección(agregar:Agregar extraer:Extraer esVacı́a:EsVacı́a) end Ejemplo de uso C={NuevaColección} {C.agregar 1} {C.agregar 2} {Browse {C.extraer}} {Browse {C.extraer}} Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Extensión tipo Colección en estilo TAD (1) Operación unión {Colección.unión C1 C2}:todos los elementos de C2 se agregan a C1, dejando C2 vacı́a. Abstracción de control DoUntil proc {DoUntil BF S} if {BF} then skip else {S} {DoUntil BF S} end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Extensión tipo Colección en estilo TAD (1) Operación unión {Colección.unión C1 C2}:todos los elementos de C2 se agregan a C1, dejando C2 vacı́a. Abstracción de control DoUntil proc {DoUntil BF S} if {BF} then skip else {S} {DoUntil BF S} end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Extensión tipo Colección en estilo TAD (2) Implementación de unión local Envolver Desenvolver ... proc {Unión C1 C2} S1={Desenvolver C1} S2={Desenvolver C2} in {DoUntil fun {$} {Pila.esVacı́a S2} end proc {$} {Pila.colocar S1 {Pila.sacar S2}} end} end in Colección=colección(... unión:Unión) end Esta implementación utiliza tanto la representación interna de C1 como la de C2 Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Extensión tipo Colección en estilo TAD (3) Implementación de unión usando sólo las interfaces local Envolver Desenvolver ... proc {Unión C1 C2} {DoUntil fun {$} {Colección.esVacı́a C2} end proc {$} {Colección.agregar C1 {Colección.extraer C2}} end} end in Colección=colección(... unión:Unión) end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Extensión tipo Colección en estilo TAD (4) Ejemplo de uso C1={Colección.nueva} C2={Colección.nueva} for I in [1 2 3] do {Colección.agregar C1 I} end for I in [4 5 6] do {Colección.agregar C2 I} end {Colección.unión C1 C2} {Browse {Colección.esVacı́a C2}} {DoUntil fun {$} {Colección.esVacı́a C1} end proc {$} {Browse {Colección.extraer C1}} end} En resumen Rep. interna ⇒ Eficiencia ∧ No polimorfismo Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Extensión tipo Colección en estilo Objeto (1) Operación unión {C1.unión C2}:todos los elementos de C2 se agregan a C1, dejando C2 vacı́a. Implementación fun {NuevaColección} S1={PilaNueva} ... proc {Unión C2} {DoUntil C2.esVacı́a proc {$} {S1.colocar {C2.extraer}} end} end in colección(... unión:Unión) end Se usa la representación C1, pero la interfaz externa de Juan Franciscointerna Dı́az Frias de Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Extensión tipo Colección en estilo Objeto (1) Operación unión {C1.unión C2}:todos los elementos de C2 se agregan a C1, dejando C2 vacı́a. Implementación fun {NuevaColección} S1={PilaNueva} ... proc {Unión C2} {DoUntil C2.esVacı́a proc {$} {S1.colocar {C2.extraer}} end} end in colección(... unión:Unión) end Se usa la representación C1, pero la interfaz externa de Juan Franciscointerna Dı́az Frias de Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Extensión tipo Colección en estilo Objeto (2) Implementación de unión usando sólo las interfaces fun {NuevaColección} ... proc {Unión C2} {DoUntil C2.esVacı́a proc {$} {This.agregar {C2.extraer}} end} end This=colección(... unión:Unión) in This end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección ¿Cómo escoger entre los estilos TAD y objeto? Eficiencia El estilo TAD puede ser más eficiente porque permite acceder a ambas representaciones internas. Única alternativa Algunas veces el estilo TAD es el único que funciona: Suma de enteros. Polimorfismo en Objeto es “gratis” Si D es un objeto colección con la misma interfaz de C, aunque condiferente implementación, {C unión(D)} funciona. ¿Por qué? Concurrencia El estilo objeto no está limitado a objetos secuenciales: Objetos flujo, puerto y activos. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección ¿Cómo escoger entre los estilos TAD y objeto? Eficiencia El estilo TAD puede ser más eficiente porque permite acceder a ambas representaciones internas. Única alternativa Algunas veces el estilo TAD es el único que funciona: Suma de enteros. Polimorfismo en Objeto es “gratis” Si D es un objeto colección con la misma interfaz de C, aunque condiferente implementación, {C unión(D)} funciona. ¿Por qué? Concurrencia El estilo objeto no está limitado a objetos secuenciales: Objetos flujo, puerto y activos. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección ¿Cómo escoger entre los estilos TAD y objeto? Eficiencia El estilo TAD puede ser más eficiente porque permite acceder a ambas representaciones internas. Única alternativa Algunas veces el estilo TAD es el único que funciona: Suma de enteros. Polimorfismo en Objeto es “gratis” Si D es un objeto colección con la misma interfaz de C, aunque condiferente implementación, {C unión(D)} funciona. ¿Por qué? Concurrencia El estilo objeto no está limitado a objetos secuenciales: Objetos flujo, puerto y activos. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección ¿Cómo escoger entre los estilos TAD y objeto? Eficiencia El estilo TAD puede ser más eficiente porque permite acceder a ambas representaciones internas. Única alternativa Algunas veces el estilo TAD es el único que funciona: Suma de enteros. Polimorfismo en Objeto es “gratis” Si D es un objeto colección con la misma interfaz de C, aunque condiferente implementación, {C unión(D)} funciona. ¿Por qué? Concurrencia El estilo objeto no está limitado a objetos secuenciales: Objetos flujo, puerto y activos. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección ¿Cómo escoger entre los estilos TAD y objeto? (2) Polimorfismo en TAD implica módulos de primera clase proc {Unión C1 Colección2 C2} {DoUntil fun {$} {Colección2.esVacı́a C2} end proc {$} {Colección.agregar C1 {Colección2.extraer C2}} end} end Colección=colección(... unión:Unión) La implementación de unión tiene que asegurarse que C2 siempre utilice una operación de Colección2. Interoperabilidad en TAD Si utilizamos el estilo TAD sin módulos de primera clase, entonces debemos escribir código nuevo para que los tipos puedan interoperar. Tenemos que escribir una operación unión que conozca ambas representaciones internas. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección ¿Cómo escoger entre los estilos TAD y objeto? (2) Polimorfismo en TAD implica módulos de primera clase proc {Unión C1 Colección2 C2} {DoUntil fun {$} {Colección2.esVacı́a C2} end proc {$} {Colección.agregar C1 {Colección2.extraer C2}} end} end Colección=colección(... unión:Unión) La implementación de unión tiene que asegurarse que C2 siempre utilice una operación de Colección2. Interoperabilidad en TAD Si utilizamos el estilo TAD sin módulos de primera clase, entonces debemos escribir código nuevo para que los tipos puedan interoperar. Tenemos que escribir una operación unión que conozca ambas representaciones internas. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Otras clases de polimorfismo, distinto al universal Polimorfismo ad-hoc Se ejecuta código diferente para argumentos de tipos diferentes. Por ejemplo el operador de sobrecarga. Polimorfismo por subtipos Se ejecuta el mismo código para todos los argumentos cuyo tipo sea un subtipo del tipo más general. Por ejemplo, Registros, tuplas y listas. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección Otras clases de polimorfismo, distinto al universal Polimorfismo ad-hoc Se ejecuta código diferente para argumentos de tipos diferentes. Por ejemplo el operador de sobrecarga. Polimorfismo por subtipos Se ejecuta el mismo código para todos los argumentos cuyo tipo sea un subtipo del tipo más general. Por ejemplo, Registros, tuplas y listas. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Principios de la POO El modelo de computación El modelo de computación de la POO es el modelo con estado. ¿Qué es un programa? Los programas son colecciones de abstracciones de datos que interactúan entre ellas. Dos principios para construirlas: Las abstracciones de datos deben tener estado por defecto. El estilo objeto, por defecto, deberı́a ser el estilo APD, el cual fomenta el polimorfismo y la herencia. En resumen. . . La POO es la programación con abstracción de datos en forma de objetos, estado explı́cito, polimorfismo, y herencia. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Principios de la POO El modelo de computación El modelo de computación de la POO es el modelo con estado. ¿Qué es un programa? Los programas son colecciones de abstracciones de datos que interactúan entre ellas. Dos principios para construirlas: Las abstracciones de datos deben tener estado por defecto. El estilo objeto, por defecto, deberı́a ser el estilo APD, el cual fomenta el polimorfismo y la herencia. En resumen. . . La POO es la programación con abstracción de datos en forma de objetos, estado explı́cito, polimorfismo, y herencia. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Principios de la POO El modelo de computación El modelo de computación de la POO es el modelo con estado. ¿Qué es un programa? Los programas son colecciones de abstracciones de datos que interactúan entre ellas. Dos principios para construirlas: Las abstracciones de datos deben tener estado por defecto. El estilo objeto, por defecto, deberı́a ser el estilo APD, el cual fomenta el polimorfismo y la herencia. En resumen. . . La POO es la programación con abstracción de datos en forma de objetos, estado explı́cito, polimorfismo, y herencia. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Herencia Observación Muchas abstracciones de datos tienen mucho en común, v. gr. los conjuntos. ¿Podemos implementarlas sin duplicar las partes comunes? Problema: duplicación de código Programas más largos. Se dificulta el mantenimiento: modificación de todas las copias. Copias ligeramente diferentes: relacion entre cambios no obvia. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Herencia Observación Muchas abstracciones de datos tienen mucho en común, v. gr. los conjuntos. ¿Podemos implementarlas sin duplicar las partes comunes? Problema: duplicación de código Programas más largos. Se dificulta el mantenimiento: modificación de todas las copias. Copias ligeramente diferentes: relacion entre cambios no obvia. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Herencia ¿Para qué el concepto de herencia? Para reducir el problema de la duplicación de código y para clarificar las relaciones entre las abstracciones de datos. ¿Cómo? Una abstracción “hereda” de otra(s), teniendo esencialmente la misma funcionalidad que las otras, posiblemente con algunas extensiones y modificaciones. Sólo se especifican las diferencias entre la abstracción de datos y sus ancestros. A tal definición incremental de una abstracción de datos se le denomina una clase. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Herencia ¿Para qué el concepto de herencia? Para reducir el problema de la duplicación de código y para clarificar las relaciones entre las abstracciones de datos. ¿Cómo? Una abstracción “hereda” de otra(s), teniendo esencialmente la misma funcionalidad que las otras, posiblemente con algunas extensiones y modificaciones. Sólo se especifican las diferencias entre la abstracción de datos y sus ancestros. A tal definición incremental de una abstracción de datos se le denomina una clase. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Herencia: clase ¿Cómo se define una clase? Por combinación de una o más clases existentes con una descripción de las extensiones y modificaciones requeridas. ¿Concepto nuevo? NO! Abstracción lingüı́stica. Manipulación sintáctica, donde la sintaxis de la clase nueva se deriva a partir de las clases originales. Función que recibe como entrada valores de tipo clase y devuelve como salida la clase nueva. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Herencia: clase ¿Cómo se define una clase? Por combinación de una o más clases existentes con una descripción de las extensiones y modificaciones requeridas. ¿Concepto nuevo? NO! Abstracción lingüı́stica. Manipulación sintáctica, donde la sintaxis de la clase nueva se deriva a partir de las clases originales. Función que recibe como entrada valores de tipo clase y devuelve como salida la clase nueva. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Use la herencia con cuidado (1) Conocimiento profundo de las clases ancestro Pues ellas pueden romper fácilmente un invariante de clase. Interfaz adicional a mantener La capacidad de extender una clase se puede ver como una manera adicional de interactuar con esa clase. Esta interfaz tiene que mantenerse a lo largo de la vida del componente. ⇒ Las clases son finales (no se pueden extender) por defecto. Para extenderlas, se requiere la acción explı́cita del programador. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Use la herencia con cuidado (1) Conocimiento profundo de las clases ancestro Pues ellas pueden romper fácilmente un invariante de clase. Interfaz adicional a mantener La capacidad de extender una clase se puede ver como una manera adicional de interactuar con esa clase. Esta interfaz tiene que mantenerse a lo largo de la vida del componente. ⇒ Las clases son finales (no se pueden extender) por defecto. Para extenderlas, se requiere la acción explı́cita del programador. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Use la herencia con cuidado (2) Factorización de una aplicación vs. dispersión de la implementación La implementación no existe en un sitio; todas las abstracciones de las que se hereda tienen que considerarse juntas. Esto dificulta entender la abstracción, y, paradójicamente, puede dificultar su mantenimiento. Lección La herencia debe utilizarse en “pequeñas cantidades.” Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Use la herencia con cuidado (2) Factorización de una aplicación vs. dispersión de la implementación La implementación no existe en un sitio; todas las abstracciones de las que se hereda tienen que considerarse juntas. Esto dificulta entender la abstracción, y, paradójicamente, puede dificultar su mantenimiento. Lección La herencia debe utilizarse en “pequeñas cantidades.” Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Alternativa a la herencia. . . Programación Basada en componentes La idea es definir un componente que encapsula a otro componente y provee una funcionalidad modificada. Compromiso Herencia - Componentes La herencia es más flexible pero puede romper un invariante de clase, mientras que la composición de componentes es menos flexible pero no puede romper un invariante de componente. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Alternativa a la herencia. . . Programación Basada en componentes La idea es definir un componente que encapsula a otro componente y provee una funcionalidad modificada. Compromiso Herencia - Componentes La herencia es más flexible pero puede romper un invariante de clase, mientras que la composición de componentes es menos flexible pero no puede romper un invariante de componente. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Conjunto de conceptos para definir clases Para construir abstracciones de datos completas Los métodos, los atributos, y las propiedades. Mensajes de primera clase y atributos de primera clase: para lograr formas poderosas de polimorfismo. Para construir abstracciones de datos incrementalmente Los conceptos relacionados con la herencia, i.e., los que definen cómo se relaciona una clase con las clases existentes. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Conjunto de conceptos para definir clases Para construir abstracciones de datos completas Los métodos, los atributos, y las propiedades. Mensajes de primera clase y atributos de primera clase: para lograr formas poderosas de polimorfismo. Para construir abstracciones de datos incrementalmente Los conceptos relacionados con la herencia, i.e., los que definen cómo se relaciona una clase con las clases existentes. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Un ejemplo de clase: sintaxis Supuestos class Contador attr val meth inic(Valor) val:=Valor end meth browse {Browse @val} end meth inc(Valor) val:=@val+Valor end end class: constructor nuevo. Las clases son valores de primera clase. class es una abstracción lingüı́stica. Sintácticamente: Juan Francisco Dı́az Frias Nombre Contador (podrı́a ser anónima). Atributos: val. Métodos: inic, browse, e inc. Operadores: := y @. Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Un ejemplo de clase: sintaxis Supuestos class Contador attr val meth inic(Valor) val:=Valor end meth browse {Browse @val} end meth inc(Valor) val:=@val+Valor end end class: constructor nuevo. Las clases son valores de primera clase. class es una abstracción lingüı́stica. Sintácticamente: Juan Francisco Dı́az Frias Nombre Contador (podrı́a ser anónima). Atributos: val. Métodos: inic, browse, e inc. Operadores: := y @. Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Un ejemplo de clase: sintaxis Supuestos class Contador attr val meth inic(Valor) val:=Valor end meth browse {Browse @val} end meth inc(Valor) val:=@val+Valor end end class: constructor nuevo. Las clases son valores de primera clase. class es una abstracción lingüı́stica. Sintácticamente: Juan Francisco Dı́az Frias Nombre Contador (podrı́a ser anónima). Atributos: val. Métodos: inic, browse, e inc. Operadores: := y @. Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales ¿Es la diferencia con otros lenguajes sólo sintáctica? Las apariencias engañan La declaración se ejecuta en tiempo de ejecución: se crea un valor de tipo clase y se liga a la variable Contador. La declaración al principio del programa se comporta familiarmente. Pero, la declaración puede colocarse en cualquier sitio donde pueda ir una declaración. Por ejemplo, si se coloca la declaración dentro de un procedimiento, se creará una clase nueva, distinta, cada vez que se invoca el procedimiento. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Ejemplo de uso C={New Contador inic(0)} {C inc(6)} {C inc(6)} {C browse} local X in {C inc(X)} X=5 end {C browse} Juan Francisco Dı́az Frias declare S in local X in thread {C inc(X)} S=listo end X=5 end {Wait S} {C browse} Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Un ejemplo de clase: semántica (1) local proc {Inic M S} inic(Valor)=M in (S.val):=Valor end proc {Browse2 M S} {Browse @(S.val)} end proc {Inc M S} inc(Valor)=M in (S.val):=@(S.val)+Valor end in Contador=c(atrbs:[val] métodos:m(inic:Inic browse:Browse2 inc:Inc)) end Juan Francisco Dı́az Frias Detalles Una clase es un registro: nombres de atributos; métodos. Nombre de atributo: literal. Método: procedimiento de dos argumentos: mensaje y estado. Asignación val:= y acceso @val. Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Un ejemplo de clase: semántica (1) local proc {Inic M S} inic(Valor)=M in (S.val):=Valor end proc {Browse2 M S} {Browse @(S.val)} end proc {Inc M S} inc(Valor)=M in (S.val):=@(S.val)+Valor end in Contador=c(atrbs:[val] métodos:m(inic:Inic browse:Browse2 inc:Inc)) end Juan Francisco Dı́az Frias Detalles Una clase es un registro: nombres de atributos; métodos. Nombre de atributo: literal. Método: procedimiento de dos argumentos: mensaje y estado. Asignación val:= y acceso @val. Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Un ejemplo de clase: semántica (2) fun {New Clase Inic} Fs={Map Clase.atrbs fun {$ X} X#{NewCell _} end} S={List.toRecord estado Fs} proc {Obj M} {Clase.métodos.{Label M} M S} end in {Obj Inic} Obj end Juan Francisco Dı́az Frias La función New Crea el estado del objeto. Define Obj que es de hecho el objeto. Inicializa el objeto antes de devolverlo. Estado: registro S, oculto dentro de Obj. Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Un ejemplo de clase: semántica (2) fun {New Clase Inic} Fs={Map Clase.atrbs fun {$ X} X#{NewCell _} end} S={List.toRecord estado Fs} proc {Obj M} {Clase.métodos.{Label M} M S} end in {Obj Inic} Obj end Juan Francisco Dı́az Frias La función New Crea el estado del objeto. Define Obj que es de hecho el objeto. Inicializa el objeto antes de devolverlo. Estado: registro S, oculto dentro de Obj. Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Sintaxis de clase (1) hdeclaracióni ::= class hvariablei { hdescriptorClasei } { meth hcabezaMétodoi [ ´=´ hvariablei ] ( hexpresiónEni | hdeclaraciónEni ) end } | | | | end lock [ hexpresióni then ] hdeclaraciónEni end hexpresióni ´:=´ hexpresióni hexpresióni ´,´ hexpresióni ... Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Sintaxis de clase (2) hexpresióni ::= class ´$´ { hdescriptorClasei } { meth hcabezaMétodoi [ ´=´ hvariablei ] ( hexpresiónEni | hdeclaraciónEni ) end } end | lock [ hexpresióni then ] hexpresiónEni end | hexpresióni ´:=´ hexpresióni | hexpresióni ´,´ hexpresióni | ´@´ hexpresióni | self | ... Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Sintaxis de clase (3) hdescriptorClasei ::= from { hexpresióni }+ | prop { hexpresióni }+ | attr { hinicAtrbi }+ hinicAtrbi ::= ( [ ´!´ ] hvariablei | hátomoi | unit | true | false ) [ ´:´ hexpresióni ] hcabezaMétodoi ::= ( [ ´!´ ] hvariablei | hátomoi | unit | true | false ) [ ´(´ { hargMétodoi } [ ´...´ ] ´)´ ] [ ´=´ hvariablei ] hargMétodoi ::= [ hfeaturei ´:´ ] ( hvariablei | ´_´ | ´$´ ) [ ´<=´ hexpresióni ] Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Sintaxis de clase (4) Caracterı́sticas Número de objetos ilimitado. Objeto ≡ instancia. Cada instancia tiene identidad única. ¿Qué es una clase? Una clase es una estructura de Cada objeto se comporta según la datos que define un estado definición de clase. interno de un objeto (atributos), su Creación, invocación comportamiento (métodos), MiObj={New MiClase Inic} las clases de las cuales hereda, y otras propiedades y crea un objeto MiObj, de la clase MiClase operaciones. e invoca el objeto con el mensaje Inic. Con la sintaxis {MiObj M} se invoca el objeto. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Sintaxis de clase (4) Caracterı́sticas Número de objetos ilimitado. Objeto ≡ instancia. Cada instancia tiene identidad única. ¿Qué es una clase? Una clase es una estructura de Cada objeto se comporta según la datos que define un estado definición de clase. interno de un objeto (atributos), su Creación, invocación comportamiento (métodos), MiObj={New MiClase Inic} las clases de las cuales hereda, y otras propiedades y crea un objeto MiObj, de la clase MiClase operaciones. e invoca el objeto con el mensaje Inic. Con la sintaxis {MiObj M} se invoca el objeto. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Sintaxis de clase (4) Caracterı́sticas Número de objetos ilimitado. Objeto ≡ instancia. Cada instancia tiene identidad única. ¿Qué es una clase? Una clase es una estructura de Cada objeto se comporta según la datos que define un estado definición de clase. interno de un objeto (atributos), su Creación, invocación comportamiento (métodos), MiObj={New MiClase Inic} las clases de las cuales hereda, y otras propiedades y crea un objeto MiObj, de la clase MiClase operaciones. e invoca el objeto con el mensaje Inic. Con la sintaxis {MiObj M} se invoca el objeto. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Miembros de una clase (1) Atributos: palabra reservada “attr” O variables de instancia: celda que contiene parte del estado de la instancia. Operaciones: hexpri1 :=hexpri2 @hexpri hexpri3 =hexpri1 :=hexpri2 . Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Miembros de una clase (2) Métodos: palabra reservada “meth” Procedimiento que se invoca en el contexto de un objeto particular y que tiene acceso a los atributos del objeto. Consta de una cabeza y un cuerpo. La cabeza consta de una etiqueta, la cual debe ser un átomo o un nombre, y de un conjunto de argumentos. Los argumentos deben ser variables diferentes; de otra manera serı́a un error de sintaxis. Cabeza≡Patrón y Mensaje≡Registro. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Miembros de una clase (3) Propiedades: palabra reservada “prop” Una propiedad modifica cómo se comporta un objeto: La propiedad locking crea un candado nuevo con cada instancia de objeto. La propiedad final hace que la clase sea una clase final Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Miembros de una clase (4) Atributos como átomos o como identificadores Las etiquetas de los atributos y de los métodos son literales. Si se definen utilizando la sintaxis de átomo, entonces son átomos. Si se definen con la sintaxis de identificadores (e.g., en mayúscula), entonces el sistema creará nombres nuevos para ellos, cuyo alcance es la definición de la clase. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Inicialización de atributos (1) Inicialización por instancia Un atributo puede tener un valor inicial diferente para cada instancia. Esto se logra no inicializándolos en la definición de clase. Ejemplo class UnApart attr nombreCalle meth inic(X) @nombreCalle=X end end Apt1={New UnApart inic(pasoancho)} Apt2={New UnApart inic(calleQuinta)} Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Inicialización de atributos (2) Inicialización por clase Un atributo puede tener un valor que sea el mismo para todas las instancias de la clase. Esto se hace, inicializándolo con “:” en la definición de clase. Ejemplo class ApartQuinta attr nombreCalle:calleQuinta númeroCalle:100 colorPared:_ superficiePiso:madera meth inic skip end end Apt3={New ApartQuinta inic} Apt4={New ApartQuinta inic} Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Inicialización de atributos (3) Inicialización por marca Esta es otra manera de utilizar la inicialización por clase. Una marca es un conjunto de clases relacionadas de alguna manera, pero no por herencia. Ejemplo L=linux class RedHat attr tiposo:L end class SuSE attr tiposo:L end class Debian attr tiposo:L end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Mensajes de primera clase (1) Principio Los mensajes son registros y las cabezas de los métodos son patrones que reconocen un registro. Invocación de objeto {Obj M} Registro estático como mensaje. En el caso más sencillo, M es un registro que se conoce en tiempo de compilación, e.g., como en la invocación {Contador inc(X)}. Registro dinámico como mensaje. Es posible invocar {Obj M} donde M es una variable que referencia un registro que se calcula en tiempo de ejecución. Como el tipamiento es dinámico, es posible crear nuevos tipos de registros en tiempo de ejecución (e.g., con Adjoin o List.toRecord). Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Mensajes de primera clase (1) Principio Los mensajes son registros y las cabezas de los métodos son patrones que reconocen un registro. Invocación de objeto {Obj M} Registro estático como mensaje. En el caso más sencillo, M es un registro que se conoce en tiempo de compilación, e.g., como en la invocación {Contador inc(X)}. Registro dinámico como mensaje. Es posible invocar {Obj M} donde M es una variable que referencia un registro que se calcula en tiempo de ejecución. Como el tipamiento es dinámico, es posible crear nuevos tipos de registros en tiempo de ejecución (e.g., con Adjoin o List.toRecord). Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Mensajes de primera clase (2) Definición de un método (1) Lista fija de argumentos: meth foo(a:A b:B c:C) % Cuerpo del método end Lista flexible de argumentos: meth foo(a:A b:B c:C ...) % Cuerpo del método end Referencia variable a la cabeza del método: meth foo(a:A b:B c:C ...)=M % Cuerpo del método end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Mensajes de primera clase (3) Definición de un método (2) Argumento opcional:valor por defecto, se usa sólo si el argumento no viene en el mensaje. meth foo(a:A b:B<=V) % Cuerpo del método end foo(a:1 b:2) ignora V, foo(a:1) ≡ foo(a:1 b:V) Etiqueta privada de método: A se liga a un nombre fresco cuando se define la clase. meth A(bar:X) % Cuerpo del método end Etiqueta dinámica de método: meth !A(bar:X) % Cuerpo del método end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Mensajes de primera clase (4) Definición de un método (3) Etiqueta dinámica de método: meth !A(bar:X) % Cuerpo del método end La etiqueta del método debe ser conocida en el momento en que la definición de clase sea ejecutada. El método otherwise: acepta cualquier mensaje para el cual no exista ningún otro método. meth otherwise(M) % Cuerpo del método end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales ¿Cómo hace el compilador con la invocación {Obj M}? Estáticamente . . . Determinar Obj y M. Si puede, compila a una instrucción muy rápida y especializada. Si no puede . . . Compila a un instrucción general de invocación de un objeto. La instrucción general utiliza el ocultamiento. La primera invocación es lenta, pero las subsiguientes son casi tan rápidas como las invocaciones especializadas. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Plan 1 Recorderis: Abstracción de datos TADs El estilo Objeto Polimorfismo Ejemplo: un tipo Colección 2 Principios de la POO 3 Herencia 4 Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Tres conjuntos de conceptos para la herencia: Grafo de herencia Define cuáles clases preexistentes se extenderán. Se permitirá tanto herencia sencilla como herencia múltiple. Control de acceso a los métodos Define cómo se accede a los métodos en particular, tanto en la clase nueva como en las clases preexistentes. Esto se logra con ligaduras estática y dinámica y con el concepto de self. Control de la encapsulación Define qué parte de un programa puede ver los atributos y métodos de una clase. Otros conceptos . . . Reenvı́o, delegación, y reflexión. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Tres conjuntos de conceptos para la herencia: Grafo de herencia Define cuáles clases preexistentes se extenderán. Se permitirá tanto herencia sencilla como herencia múltiple. Control de acceso a los métodos Define cómo se accede a los métodos en particular, tanto en la clase nueva como en las clases preexistentes. Esto se logra con ligaduras estática y dinámica y con el concepto de self. Control de la encapsulación Define qué parte de un programa puede ver los atributos y métodos de una clase. Otros conceptos . . . Reenvı́o, delegación, y reflexión. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Tres conjuntos de conceptos para la herencia: Grafo de herencia Define cuáles clases preexistentes se extenderán. Se permitirá tanto herencia sencilla como herencia múltiple. Control de acceso a los métodos Define cómo se accede a los métodos en particular, tanto en la clase nueva como en las clases preexistentes. Esto se logra con ligaduras estática y dinámica y con el concepto de self. Control de la encapsulación Define qué parte de un programa puede ver los atributos y métodos de una clase. Otros conceptos . . . Reenvı́o, delegación, y reflexión. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Tres conjuntos de conceptos para la herencia: Grafo de herencia Define cuáles clases preexistentes se extenderán. Se permitirá tanto herencia sencilla como herencia múltiple. Control de acceso a los métodos Define cómo se accede a los métodos en particular, tanto en la clase nueva como en las clases preexistentes. Esto se logra con ligaduras estática y dinámica y con el concepto de self. Control de la encapsulación Define qué parte de un programa puede ver los atributos y métodos de una clase. Otros conceptos . . . Reenvı́o, delegación, y reflexión. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (1) Disponibilidad de métodos y atributos La herencia es una forma de construir clases nuevas a partir de clases existentes. La herencia define qué atributos y métodos están disponibles en la clase nueva. Relación de precedencia: Relación de anulación Un método (atributo) en la clase C anula cualquier método (atributo) con la misma etiqueta (el mismo nombre) en todas las superclases de C. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (1) Disponibilidad de métodos y atributos La herencia es una forma de construir clases nuevas a partir de clases existentes. La herencia define qué atributos y métodos están disponibles en la clase nueva. Relación de precedencia: Relación de anulación Un método (atributo) en la clase C anula cualquier método (atributo) con la misma etiqueta (el mismo nombre) en todas las superclases de C. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (2) Tipos de herencia Herencia sencilla (se hereda de una sola clase) o Herencia múltiple (se hereda de varias clases. Sintácticamente: from. Superclases Una clase B es una superclase de la clase A si B aparece en la parte from de la declaración de A, o B es una superclase de una clase que aparece en la parte from de la declaración de A. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (2) Tipos de herencia Herencia sencilla (se hereda de una sola clase) o Herencia múltiple (se hereda de varias clases. Sintácticamente: from. Superclases Una clase B es una superclase de la clase A si B aparece en la parte from de la declaración de A, o B es una superclase de una clase que aparece en la parte from de la declaración de A. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (3) Jerarquı́a de clases Grafo dirigido de la relación de superclase cuya raı́z es la clase actual. Las aristas son dirigidas hacia las subclases. Legalidad de la herencia La relación de herencia es dirigida y acı́clica. class A from B ... end class B from A ... end Cada método (salvo los anulados) debe tener una etiqueta única y debe estar definido en una sola clase en la jerarquı́a. class class class class class A1 meth m(...) ... end end B1 meth m(...) ... end end A from A1 end B from B1 end C from A B end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (3) Jerarquı́a de clases Grafo dirigido de la relación de superclase cuya raı́z es la clase actual. Las aristas son dirigidas hacia las subclases. Legalidad de la herencia La relación de herencia es dirigida y acı́clica. class A from B ... end class B from A ... end Cada método (salvo los anulados) debe tener una etiqueta única y debe estar definido en una sola clase en la jerarquı́a. class class class class class A1 meth m(...) ... end end B1 meth m(...) ... end end A from A1 end B from B1 end C from A B end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (4) Método m A1 m A B1 m B A1 A C m m B1 B C Jerarquía de clases ilegal Jerarquía de clases legal (dos ‘‘m’’ visibles desde C) (un ‘‘m’’ visible desde C) También es ilegal . . . class A meth m(...) ... end end class B meth m(...) ... end end class C from A B end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (4) Método m A1 m A B1 m B A1 A C m m B1 B C Jerarquía de clases ilegal Jerarquía de clases legal (dos ‘‘m’’ visibles desde C) (un ‘‘m’’ visible desde C) También es ilegal . . . class A meth m(...) ... end end class B meth m(...) ... end end class C from A B end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (5) ¿Cuando se detecta un error de estos? fun {ClaseExtraña} class A meth foo(X) X=a end end class B meth foo(X) X=b end end class C from A B end in C end Principio:todo se hace en tiempo de ejecución ClaseExtraña se puede compilar y ejecutar exitosamente. Sólo se lanzará una excepción en la invocación {ClaseExtraña}. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Grafo de herencia (5) ¿Cuando se detecta un error de estos? fun {ClaseExtraña} class A meth foo(X) X=a end end class B meth foo(X) X=b end end class C from A B end in C end Principio:todo se hace en tiempo de ejecución ClaseExtraña se puede compilar y ejecutar exitosamente. Sólo se lanzará una excepción en la invocación {ClaseExtraña}. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (1) Búsqueda del método correcto ¿Cuando se invoca un método de un objeto: cuál método se ejecuta? Esto parece bastante sencillo, pero se vuelve ligeramente más complicado cuando está involucrada la herencia. Ligadura estática y dinámica La herencia se utiliza para definir una clase nueva que extiende una clase existente. Ambas clases pueden tener métodos con el mismo nombre, y la clase nueva puede querer invocar cualquiera de ellos. Se necesitan dos maneras de invocar: ligadura estática y ligadura dinámica. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (1) Búsqueda del método correcto ¿Cuando se invoca un método de un objeto: cuál método se ejecuta? Esto parece bastante sencillo, pero se vuelve ligeramente más complicado cuando está involucrada la herencia. Ligadura estática y dinámica La herencia se utiliza para definir una clase nueva que extiende una clase existente. Ambas clases pueden tener métodos con el mismo nombre, y la clase nueva puede querer invocar cualquiera de ellos. Se necesitan dos maneras de invocar: ligadura estática y ligadura dinámica. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (2) Ejemplo de clase: Cuenta class Cuenta attr saldo:0 meth transferir(Cant) saldo:=@saldo+Cant end meth pedirSaldo(Sal) Sal=@saldo end meth transferEnLote(CantList) for A in CantList do {self transferir(A)} end end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (3) Extensión de Cuenta class CuentaVigilada from Cuenta meth transferir(Cant) {LogObj agregueEntrada(transferir(Cant))} ... end end Creación e invocación CtaVig={New CuentaVigilada transferir(100)} ¿qué pasa cuando invocamos transferEnLote? ¿Se invoca transferir de Cuenta o transferir de CuentaVigilada? Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (3) Extensión de Cuenta class CuentaVigilada from Cuenta meth transferir(Cant) {LogObj agregueEntrada(transferir(Cant))} ... end end Creación e invocación CtaVig={New CuentaVigilada transferir(100)} ¿qué pasa cuando invocamos transferEnLote? ¿Se invoca transferir de Cuenta o transferir de CuentaVigilada? Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (4) ¿Cuál deberı́a invocarse? transferir de CuentaVigilada. Esto se denomina ligadura dinámica: {self transferir(A)}. Ligadura dinámica: necesidad Se conserva la funcionalidad de la anterior abstracción al tiempo que se añade una funcionalidad nueva. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (4) ¿Cuál deberı́a invocarse? transferir de CuentaVigilada. Esto se denomina ligadura dinámica: {self transferir(A)}. Ligadura dinámica: necesidad Se conserva la funcionalidad de la anterior abstracción al tiempo que se añade una funcionalidad nueva. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (5) Ligadura dinámica: limitación class CuentaVigilada from Cuenta meth transferir(Cant) {LogObj agregueEntrada(transferir(Cant))} Cuenta,transferir(Cant) end end Dentro del nuevo método transferir, tenemos que invocar el antiguo método transferir. ¿Podemos usar ligadura dinámica? Ligadura estática:necesidad Invocamos un método señalando la clase del método: Cuenta,transferir(Cant) Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (5) Ligadura dinámica: limitación class CuentaVigilada from Cuenta meth transferir(Cant) {LogObj agregueEntrada(transferir(Cant))} Cuenta,transferir(Cant) end end Dentro del nuevo método transferir, tenemos que invocar el antiguo método transferir. ¿Podemos usar ligadura dinámica? Ligadura estática:necesidad Invocamos un método señalando la clase del método: Cuenta,transferir(Cant) Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (6) Ligadura dinámica y estática La ligadura dinámica permite a la clase nueva extender correctamente la clase antigua dejando que los métodos antiguos invoquen los métodos nuevos, aunque los métodos nuevos no existan en el momento en que los métodos antiguos se definen. La ligadura estática permite que los nuevos métodos invoquen los métodos antiguos cuando tengan que hacerlo. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (7) Resumen ligadura dinámica Se escribe {self M}. Este tipo de ligadura escoge el correspondiente método M visible en el objeto actual, tomando en cuenta la anulación que haya sido realizada. Resumen ligadura estática Se escribe C, M (con una coma), donde C es una clase donde se define el correspondiente método M. Este tipo de ligadura escoge el método M visible en la clase C, tomando en cuenta las anulaciones de métodos desde la clase raı́z hasta la clase C, pero no más. Si el objeto es de una subclase de C que ha anulado el método M de nuevo, entonces ésta anulación no es tenida en cuenta. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de acceso a los métodos (7) Resumen ligadura dinámica Se escribe {self M}. Este tipo de ligadura escoge el correspondiente método M visible en el objeto actual, tomando en cuenta la anulación que haya sido realizada. Resumen ligadura estática Se escribe C, M (con una coma), donde C es una clase donde se define el correspondiente método M. Este tipo de ligadura escoge el método M visible en la clase C, tomando en cuenta las anulaciones de métodos desde la clase raı́z hasta la clase C, pero no más. Si el objeto es de una subclase de C que ha anulado el método M de nuevo, entonces ésta anulación no es tenida en cuenta. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (1) Principio Limitar el acceso a los miembros de la clase, a saber, atributos y métodos, de acuerdo a los requerimientos de la arquitectura de la aplicación. Alcance de un miembro Cada miembro se define con un alcance: El alcance es la parte del texto del programa en el cual el miembro es visible, i.e., donde, al mencionar su nombre, se accede a él. Tipos de alcance Por defecto, o modificado por palabras reservadas como public, private, y protected. Cada lenguaje usa estos alcances con significados ligeramente diferentes. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (1) Principio Limitar el acceso a los miembros de la clase, a saber, atributos y métodos, de acuerdo a los requerimientos de la arquitectura de la aplicación. Alcance de un miembro Cada miembro se define con un alcance: El alcance es la parte del texto del programa en el cual el miembro es visible, i.e., donde, al mencionar su nombre, se accede a él. Tipos de alcance Por defecto, o modificado por palabras reservadas como public, private, y protected. Cada lenguaje usa estos alcances con significados ligeramente diferentes. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (1) Principio Limitar el acceso a los miembros de la clase, a saber, atributos y métodos, de acuerdo a los requerimientos de la arquitectura de la aplicación. Alcance de un miembro Cada miembro se define con un alcance: El alcance es la parte del texto del programa en el cual el miembro es visible, i.e., donde, al mencionar su nombre, se accede a él. Tipos de alcance Por defecto, o modificado por palabras reservadas como public, private, y protected. Cada lenguaje usa estos alcances con significados ligeramente diferentes. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (2) Alcance privado Un miembro privado es aquel que sólo es visible en la instancia correspondiente al objeto. Esta instancia puede ver todos los miembros definidos en su clase y en sus superclases. Visibilidad vertical. Alcance público Un miembro público es aquel que es visible en cualquier parte del programa. ¿Qué es lo natural? Que los atributos sean privados y los métodos sean públicos, como en Oz y Smalltalk. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (2) Alcance privado Un miembro privado es aquel que sólo es visible en la instancia correspondiente al objeto. Esta instancia puede ver todos los miembros definidos en su clase y en sus superclases. Visibilidad vertical. Alcance público Un miembro público es aquel que es visible en cualquier parte del programa. ¿Qué es lo natural? Que los atributos sean privados y los métodos sean públicos, como en Oz y Smalltalk. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (2) Alcance privado Un miembro privado es aquel que sólo es visible en la instancia correspondiente al objeto. Esta instancia puede ver todos los miembros definidos en su clase y en sus superclases. Visibilidad vertical. Alcance público Un miembro público es aquel que es visible en cualquier parte del programa. ¿Qué es lo natural? Que los atributos sean privados y los métodos sean públicos, como en Oz y Smalltalk. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (3) Atributos privados Los atributos son internos a la abstracción de datos y deben ser invisibles desde el exterior. Métodos públicos Los métodos conforman la interfaz externa de la abstracción de datos, por lo tanto deberı́an ser visibles para todas las entidades que referencian la abstracción. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (3) Atributos privados Los atributos son internos a la abstracción de datos y deben ser invisibles desde el exterior. Métodos públicos Los métodos conforman la interfaz externa de la abstracción de datos, por lo tanto deberı́an ser visibles para todas las entidades que referencian la abstracción. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (4) Dos conceptos básicos para controlar la encapsulación Alcance léxico y valores de tipo nombre. Con ellos se implementa: Alcane público. Alcance privado. Alcance privado y protegido de C++ y Java. Técnica fundamental La técnica fundamental es permitir que las cabezas de los métodos sean valores de tipo nombre en lugar de átomos. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (4) Dos conceptos básicos para controlar la encapsulación Alcance léxico y valores de tipo nombre. Con ellos se implementa: Alcane público. Alcance privado. Alcance privado y protegido de C++ y Java. Técnica fundamental La técnica fundamental es permitir que las cabezas de los métodos sean valores de tipo nombre en lugar de átomos. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (5) Métodos privados (en el sentido de C++ y Java) = Jerarquía de clases C Región de visibilidad para el objeto I3: todos los atributos privados en esta región son visibles para I3 ‘‘private’’ de acuerdo a Smalltalk and Oz SubC SubSubC ... Instancias I1 I2 I3 ... Juan Francisco Dı́az Frias In ‘‘private’’ de acuerdo a C++ and Java Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (6) Implementación vı́a nombres (1) Utilizando un identificador de variable como la cabeza del método. class C meth A(X) % Cuerpo del método end end Implementación vı́a nombres (2) local A={NewName} in class C meth !A(X) % Cuerpo del método end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (6) Implementación vı́a nombres (1) Utilizando un identificador de variable como la cabeza del método. class C meth A(X) % Cuerpo del método end end Implementación vı́a nombres (2) local A={NewName} in class C meth !A(X) % Cuerpo del método end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (7) Métodos protegidos (en el sentido de C++) En C++, un método protegido solamente es accesible desde la clase donde fue definido o en las clases descendientes (y en todas las instancias de objetos de esas clases). Implementación class C attr pa:A meth A(X) skip end meth foo(...) {self A(5)} end end class C1 from C meth b(...) A=@pa in {self A(5)} end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (7) Métodos protegidos (en el sentido de C++) En C++, un método protegido solamente es accesible desde la clase donde fue definido o en las clases descendientes (y en todas las instancias de objetos de esas clases). Implementación class C attr pa:A meth A(X) skip end meth foo(...) {self A(5)} end end class C1 from C meth b(...) A=@pa in {self A(5)} end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (8) Átomos o nombres como cabezas de métodos Los átomos son visibles a través de todo el programa y los nombres sólo son visibles en el alcance léxico de su creación. Use nombres para métodos internos, y use átomos para métodos externos. ¿Cómo lo hacen los lenguajes más populares? Smalltalk, C++, y Java sólo soportan átomos como cabezas de métodos; no tienen soporte para los nombres. El enfoque basado en nombres no es popular todavı́a. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (8) Átomos o nombres como cabezas de métodos Los átomos son visibles a través de todo el programa y los nombres sólo son visibles en el alcance léxico de su creación. Use nombres para métodos internos, y use átomos para métodos externos. ¿Cómo lo hacen los lenguajes más populares? Smalltalk, C++, y Java sólo soportan átomos como cabezas de métodos; no tienen soporte para los nombres. El enfoque basado en nombres no es popular todavı́a. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Control de encapsulación (9) Sencillez de los átomos Los átomos se identifican únicamente por sus representaciones impresas. Con los nombres esto es más difı́cil: el programa mismo tiene que pasar de alguna manera el nombre a quien desea invocar el método. Ventajas de los nombres Imposible tener conflictos con la herencia (sencilla o múltiple). La encapsulación se puede manejar mejor, pues una referencia a un objeto no da necesariamente derecho a invocar los métodos del objeto. Los nombres pueden tener soporte sintáctico para simplificar su uso. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (1) Herencia Delegación Reenvío definida sobre clases definida sobre objetos definida sobre objetos self común self común self no es común Relación estrecha entre el objeto/clase original Relación menos estrecha y el objeto/clase derivado Enfoque ‘‘estático’’: al momento de la definición de la clase Juan Francisco Dı́az Frias Enfoques ‘‘dinámicos’’: al momento de la creación del objeto Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (2) Reenvı́o - Implementación local class MezclarReenvı́o attr Reenvı́o:ninguno meth asgnReenvı́o(F) Reenvı́o:=F end meth otherwise(M) if @Reenvı́o==ninguno then raise métodoIndefinido end else {@Reenvı́o M} end end end in fun {NewF Clase Inic} {New class $ from Clase MezclarReenvı́o end Inic} end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (3) Reenvı́o - Utilización class C1 meth inic skip end meth cubo(A B) B=A*A*A end end class C2 meth inic skip end meth cuadrado(A B) B=A*A end end Obj1={NewF C1 inic} Obj2={NewF C2 inic} {Obj2 asgnReenvı́o(Obj1)} Invocar {Obj2 cubo(10 X)} llevará a Obj2 a reenviar el mensaje a Obj1. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (4) Delegación Jerarquı́a entre objetos y no entre clases. Un objeto no hereda de una clase, sino que delega a otro objeto. Los mismos efectos de la herencia, pero la jerarquı́a se puede cambiar en cualquier momento. {Obj2 asgnDelegado(Obj1)} configura a Obj2 para delegar en Obj1. Obj1 se comporta como la “superclase” de Obj2. El self se preserva siempre: es el self del objeto original que inició la cadena de delegación. Entonces, el estado del objeto (los atributos) también es el estado del objeto original. Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (5) Delegación - Implementación (1) local AsgnSelf={NewName} class MezclarDelegación attr this Delegado:ninguno meth !AsgnSelf(S) this:=S end meth asgn(A X) A:=X end meth obt(A ?X) X=@A end meth asgnDelegado(D) Delegado:=D end meth Del(M S) SS in SS=@this this:=S try {self M} finally this:=SS end end ... end in ... Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (6) Delegación Implementación (2) local AsgnSelf={NewName} class MezclarDelegación ... meth invcr(M) SS in SS=@this this:=self try {self M} finally this:=SS end end meth otherwise(M) if @Delegado==ninguno then raise métodoIndefinido end else {@Delegado Del(M @this)} end end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (7) Delegación Implementación (3) local AsgnSelf={NewName} class MezclarDelegación ... end in fun {NewD Clase Inic} Obj={New class $ from Clase MezclarDelegación end Inic} in {Obj AsgnSelf(Obj)} Obj end end Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (8) Delegación - Utilización (1) Operación Invocación de objeto Invocación de Self Consulta atributo Modificación atributo Definición del delegado Sintaxis original {hobji M} Sintaxis de delegación {hobji invcr(M)} {self M} @hattri hattri:=X {@this M} {@this obt(hattri $)} {@this asgn(hattri X)} {hobji1 asgnDelegado(hobji2 )} Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (9) Delegación - Utilización (2) class C1 attr i:0 meth inic skip end meth inc(I) {@this asgn(i {@this obt(i $)}+I)} end meth browse {@this inc(10)} {Browse c1#{@this obt(i $)}} end meth c {@this browse} end end Obj1={NewD C1 inic} Juan Francisco Dı́az Frias Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (9) Delegación - Utilización (3) class C2 attr i:0 meth inic skip end meth browse {@this inc(100)} {Browse c2#{@this obt(i $)}} end end Obj2={NewD C2 inic} {Obj2 asgnDelegado(Obj1)} Juan Francisco Dı́az Frias Delegación - Utilización (4) {Obj2 invcr(c)} {Obj1 invcr(c)} Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (9) Delegación - Utilización (3) class C2 attr i:0 meth inic skip end meth browse {@this inc(100)} {Browse c2#{@this obt(i $)}} end end Obj2={NewD C2 inic} {Obj2 asgnDelegado(Obj1)} Juan Francisco Dı́az Frias Delegación - Utilización (4) {Obj2 invcr(c)} {Obj1 invcr(c)} Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (10) Delegación - Utilización (5) class C2b attr i:0 meth inic skip end end ObjX={NewD C2b inic} {ObjX asgnDelegado(Obj2)} Juan Francisco Dı́az Frias Delegación - Utilización (6) {ObjX asgnDelegado(Obj1)} {ObjX invcr(c)} Modelos y Paradigmas de Programación Recorderis: Abstracción de datos Principios de la POO Herencia Un modelo OO Clases como abstracciones de datos completas Clases como abstracciones de datos incrementales Otros conceptos ligados a la herencia (10) Delegación - Utilización (5) class C2b attr i:0 meth inic skip end end ObjX={NewD C2b inic} {ObjX asgnDelegado(Obj2)} Juan Francisco Dı́az Frias Delegación - Utilización (6) {ObjX asgnDelegado(Obj1)} {ObjX invcr(c)} Modelos y Paradigmas de Programación