M�dulo 1 by HIEtfhWp

VIEWS: 15 PAGES: 202

									         Ingeniería del Software


TEMA 2


         Clases y Objetos


                             Jesús García Molina
                          Facultad de Informática
                           Universidad de Murcia
                         http://dis.um.es/~jmolina/
    Conceptos
•   Clase
•   Ocultación de la información
•   Objeto
•   Mensaje
•   Creación de objetos
•   Semántica referencia
•   Copia, igualdad e identidad de objetos
•   Genericidad
•   Metaclase
                         Clases y Objetos    2
Clases y Objetos

 Programa OO                         Colección estructurada
                                            de clases

    Clase                            Implementación de un TAD


   Objeto                       Una instancia de una clase


  Los objetos se comunican mediante mensajes

                  Clases y Objetos                            3
TAD y Clase


    Teoría                                        Software
    TAD                                            Clase
{Operaciones: Sintaxis                      {Elegir representación e
   y Semántica}                             implementar operaciones}




                         Clases y Objetos                         4
TAD y Clase

   Teoría                                Software
    TAD                                    Clase
   Funciones                           Atributos y Métodos
   Axiomas                                Asertos
   Precondiciones




                    Clases y Objetos                     5
Definición de Clase

  “Implementación total o parcial de un
  tipo abstracto de dato (TAD)”.
• Las clases son entidades sintácticas.
• Una clase describe objetos que van a tener la misma
  estructura y el mismo comportamiento.
• Un programa OO es una colección estructurada de
  clases.
                      Clases y Objetos             6
Clases: Doble naturaleza

• Una clase es un módulo y un tipo de dato
• Módulo (concepto sintáctico)
   – Mecanismo para organizar el software
   – Encapsula componentes software

• Tipo (concepto semántico)
   – Mecanismo de definición de nuevos tipos de datos:
     describe una estructura de datos (objetos) para representar
     valores de un dominio y las operaciones aplicables.
                          Clases y Objetos                   7
package CUENTAS_BANCARIAS                 Ada, Modula
  type Cuenta is private;
  procedure reintegro (c: in out CUENTA; in suma: INTEGER);
  procedure ingreso (c: in out CUENTA; in suma: INTEGER);
  procedure saldo (c: in CUENTA) return INTEGER;
  …
  private
                                        Tipo  Modulo
       type Cuenta is record
                       titular: PERSONA;
                       codigo: INTEGER;
                       saldo: INTEGER;
                       ult_operaciones: ARRAY [INTEGER];
       end;
end CUENTAS_BANCARIAS
Especificación separada de la implementación
package body CUENTAS_BANCARIAS

   procedure reintegro (c: in out CUENTA; in suma: INTEGER) is do
        if puedo_sacar (c, suma) then c.saldo:= c.saldo - suma
   end;
   procedure ingreso (c: in out CUENTA; in suma: INTEGER) is do
        c.saldo:= c.saldo + suma
   end;
   function saldo (c: in CUENTA) return INTEGER is do
        return c.saldo
   end;
   function puedo_sacar (c: in CUENTA; in suma: INTEGER)
                                   return BOOLEAN is do
        return (c.saldo >=suma)
   end;
   …
end CUENTAS_BANCARIAS
Clases: Ejemplo
• Al modelar un banco, encontramos objetos “cuenta”.
• Todos los objetos “cuenta” tienen unas propiedades
  comunes:
   – saldo, titular, código, reintegro, ingreso, …

• Definimos una clase Cuenta.
• Clases del dominio y clases de diseño/implementación
• Principio de Correspondencia Directa


                           Clases y Objetos          10
Componentes de una clase

• Las propiedades del objeto se pueden representar
  mediante

      espacio:     ATRIBUTOS
      cálculo:     RUTINAS (MÉTODOS)

   ¿cómo representamos el saldo de una cuenta?


                     Clases y Objetos                11
  Componentes de una clase

  • Atributos
     – Determinan una estructura de almacenamiento para
       cada objeto de la clase

                Ejemplo: saldo, titular, código..

  • Métodos
     – Operaciones aplicables a los objetos
     – Único modo de acceder a los atributos ¡A veces no!

                Ejemplo: reintegro, ingreso, saldo,..

Propiedades Estructurales vs. Propiedades de Comportamiento
Clases y Ocultación de Información

• Interface vs. Implementación.
   – Un cliente sólo conoce la interface.
   – Sólo los métodos de la clase deberían poder acceder a
     sus atributos.
• Cada lenguaje OO presenta diferencias en cuanto a
  la ocultación de información.




                         Clases y Objetos                    13
Clases en Eiffel

•   Lenguaje fuertemente tipado.
•   Buena legibilidad.
•   Características: Atributos y Rutinas
•   No incluye métodos y variables de clase.
•   No incluye metaclases




                       Clases y Objetos        14
Clases en Eiffel


                      Característica
                  Cálculo                 Memoria

                  Rutina                  Atributo

   No resultado             Retorna resultado

   Procedimiento Función
                       class CUENTA
                          creation abrir
                          feature                          Tipo = Modulo                  oc: Cuenta
Ejemplo Clase Eiffel            titular : PERSONA;
                                saldo : INTEGER;
                                codigo: INTEGER;

                               abrir (quien: PERSONA) is do
                                                                           Atributos
                                           saldo:=0;
                                           titular:=quien;
                                           codigo:= nuevo_codigo;
                                           !!ultOper
                               end;

                               reintegro (suma: INTEGER) is do
                                           if puedo_sacar(suma) then saldo:=saldo-suma;
                               end;

                               ingreso (suma: INTEGER) is do
                                          saldo:=saldo+suma
                               end;                                         Operaciones
                               ver_ult_oper (n: INTEGER) is do … end;
                               ….

                         feature { }
                              ultimas_Oper: ARRAY[INTEGER];
                              puedo_sacar (suma: INTEGER): BOOLEAN is do
                                       Result:= saldosuma
                              end;
                         end                       Clases y Objetos                           16
Eiffel y Ocultación de Información

• Características publicas, privadas o exportadas de
  forma selectiva a cierto conjunto de clases.

• Atributos

   – Exportados en modo consulta
   – Sólo son modificables por las rutinas de la
     propia clase




                      Clases y Objetos             17
Eiffel y la Ocultación de Información
class C
    feature
        …           -- características públicas
   feature {A, B}
        …           -- características exportadas sólo a A y B
   feature { }
        …           -- características privadas
end




                       Clases y Objetos                    18
Eiffel y la Ocultación de Información
class Una feature                            class Otra feature
   at1: Otra;                                   atributo: INTEGER
   at2: INTEGER;                                …
   una_rutina (p: INTEGER) is do             end
         at2:= p;
         at2:= at1.atributo;
         atributo:= p;         -- Error en compilación
         at1.atributo:= p;     -- Error en compilación
   end;
end



                          Clases y Objetos                   19
Definición de Objeto
  “Es una instancia de una clase, creada en
  tiempo de ejecución”

• Es una estructura de datos formada por tantos
  campos como atributos tiene la clase.
• Es una entidad de tiempo de ejecución.
• Cada objeto es instancia de una clase (¿incluso los
  objetos básicos: enteros, booleanos,caracteres,…?).
• Durante la ejecución de un programa OO se creará
  un conjunto de objetos.
                                                        20
Cada objeto es instancia de una
clase
                            Estructura de datos
           Código
                                       Objeto Cuenta
                                           Objeto Cuenta
 Clase Cuenta
                                               Objeto Cuenta
                Instanciación
                                                   Objeto Cuenta

                       Cuenta oc
                   oc = new Cuenta()

Cada objeto es instancia directa de una clase.
Una clase es una factoría de objetos
Objeto “Cuenta”

  titular                                  J. Gomez      nombre

  codigo    123456                        87654321       dni

  saldo     100000
                                        Objeto Persona
  ultOper



              -5000           10000      50000

                      Objeto Array

                     Clases y Objetos                     22
Tipos de campos

• Simples
  – Corresponden a atributos de tipos (clases) básicos
  – En Eiffel:
     INTEGER, REAL, DOUBLE, BOOLEAN,
     CHARACTER, STRING

• Compuestos
  – Sus valores son objetos de tipos no básicos.
  – Subobjetos o Referencias.

                        Clases y Objetos                 23
Referencias e Identidad de Objetos

• Una referencia es una forma de identificar a un objeto, un
  nombre abstracto para el objeto.
• Puede implementarse de distintas formas.
• Mientras exista, cada objeto posee una identidad única,
  independiente de sus valores (identificador de objeto,
  oid):
   – Dos objetos con diferentes oids pueden tener los
     mismos valores
   – Los valores de los campos de un objeto pueden
     cambiar, pero su oid es inmutable.
                         Clases y Objetos                 24
Identificador de objeto, oid
        oid
                   6114
         titular

         codigo           123456

         saldo            100000

         ultOper




 Existe una tabla que relaciona oid y posición de memoria
                                                     25
 Objeto: Correspondencia directa

 Objetos externos vs. objetos en el software

                                  titular
Cuenta:                           codigo    123456
 titular, saldo, código,
 lista últimas operaciones         saldo    100000

                                  ultOper




                         Clases y Objetos            26
Objetos dominio vs. Objetos software

1. Objetos externos: Modelado del Dominio
   – Existentes en el dominio de la aplicación:
         “cuenta”, “cliente”, “cajero”, “préstamo”,...

2. Objetos software:
    – Procedentes del ANALISIS: objetos del dominio
    – Procedentes del DISEÑO/IMPLEMENTACION:
       estructuras de datos, patrones de diseño y GUI


                        Clases y Objetos                 27
 Estado de un Objeto
• Dos significados relacionados:
  1) El estado de un objeto viene dado por la lista de
  pares atributo/valor del campo.
  2) “Un estado es una situación en la vida de un
  objeto en la que satisface una determinada condición,
  realiza alguna actividad o espera algún evento”:
     Estados Cajero Automático: Conectado, Desconectado,
                                Sin dinero, Sin papel,...

• Las rutinas permiten consultar y modificar el estado
  del objeto.
                                                      28
Algunas cuestiones

• No confundir los conceptos de clase y objeto
• Sistema de tipos uniforme: cada objeto es
  instancia de una clase
• Importante la manipulación de objetos sin conocer
  su representación
• ¿Es apropiado distinguir entre atributos y métodos
  cuando se accede a ellos?


                      Clases y Objetos             29
Clases Smalltalk

•   Tipado dinámicamente.
•   Poco legible.
•   Simple, pequeño pero muy potente
•   Variables de instancia y Variables de clase
•   Métodos de instancia y Métodos de clase
•   “Todo es un objeto”
•   Incluye metaclases: clases son objetos

                        Clases y Objetos          30
Variables de Clase

• Compartida por todas las instancias de una clase.
• Registrar valor común a todas las instancias
• Ejemplos para una clase Cuenta:
   – Interés, Coste tarjeta, Último código asignado
• ¿Cuándo se inicializa?
• Puede ser accedida por métodos de instancia y de
  clase


                         Clases y Objetos             31
     Variables de clase
                   UltimoCodigo
                                    11122


titular
codigo    123456

saldo      10000
                          titular
ultOper
                          codigo      348765

                          saldo        55500

                          ultOper
Smalltalk y Ocultación de Información

• Variables de instancia (atributos) son privadas
   – Accesibles por los métodos de instancia
• Variables de clase son privadas
   – Accesible por los métodos de clase e instancia
• Métodos de instancia y de clase son públicos.
• Métodos get y set para acceso a las variables de
  instancia.


                         Clases y Objetos             33
Ejemplo Smalltalk   Object subclass: #Cuenta
                        instanceVariableNames: 'titular codigo saldo ultimasOper'
                        classVariableNames: 'UltimoCodigo '
                        poolDictionaries: ''

                                    "Metodos de Clase"
                    abrir: unaPersona
                         ^self new abrir:unaPersona

                    inicializar
                              UltimoCodigo:=0

                                     "Metodos de Instancia"
                    ingreso: cantidadPts
                       " Ingresa en la cuenta, cantidadPts"

                        saldo:=saldo+cantidadPts


1/2                                       Clases y Objetos                  34
                    abrir: unaPersona
Ejemplo Smalltalk             "Inicializar una cuenta"
                         titular := unaPersona.
                         saldo:=0.
                         UltimoCodigo:= UltimoCodigo + 1.
                         codigo:= UltimoCodigo.
                         ultOper:= Array new:20.

                    reintegro: cantidadPts
                       " Retira si es posible de la cuenta, cantidadPts"

                        self puedoSacar:cantidadPts ifTrue: [saldo:=saldo-cantidadPts]
                                                        ifFalse: [^self error]
                    saldo
                      "Devuelve el saldo de la cuenta"
                         ^saldo
                    verUltOperaciones
                        “Visualiza operaciones en ultOper”
                         …
2/2                 puedoSacar: unaCantidad
                        ^(saldo>=cantidadPts) y Objetos
                                          Clases                               35
Clases C++

•   Tipado estáticamente
•   Poco legible
•   Muy grande y complejo
•   Fichero interfaz e implementación
•   Rutinas “inline”
    – No provocan una llamada: código “inline”
    – Su propósito es mejorar eficiencia
• Atributos y métodos de clase (“static”)
                         Clases y Objetos        36
C++ y Ocultación de Información

• Tres niveles de ocultación de información:
      Público, Privado, Protegido
• Un atributo (miembro dato) puede ser público:
   – ¡Un cliente puede consultarlo y modificarlo !
   – No se puede exportar un atributo en modo consulta
• Clases amigas (friend):
   – Existe un mecanismo para que explícitamente una clase le
     conceda a otra permiso para acceder a su implementación

                        Clases y Objetos                 37
              class Cuenta {
                 public:
                         Cuenta (Persona *quien)     {saldo=0; titular=quien;
                                           codigo = nuevoCodigo( ); ultOper = new lista<int>}
Ejemplo C++
                           void         reintegro(int suma);
                           void         ingreso(int suma);
                           int          verSaldo();
                           void         verUltOper(int n)
                private:
                           Persona      * titular;
                           int          saldo;
                           int          codigo;
                           lista<int>   * ultOper;
                           static int   ultimoCodigo;
                           static int   nuevoCodigo ( );
                           bool         puedoSacar(int suma) {return (saldo >=suma);}
                }

                void       cuenta :: reintegro (int suma) {
                               if puedoSacar(suma) saldo=saldo-suma;
                }
                void       cuenta :: ingreso (int suma) {
                               saldo=saldo+suma;
                }
                int        cuenta :: getSaldo () {return saldo}

                                                 Clases y Objetos                         38
C++ y la Ocultación de Información

• Forma de “saltar” la ocultación, manipulando
  punteros:
   – Conversión a (*int)

             Cuenta *oc
             int     * pint
             pint = (int*) oc




                           Clases y Objetos      39
Clases en Java
•   Lenguaje tipado estáticamente
•   Legible
•   No separación en fichero interfaz e implementación.
•   No hay métodos inline.
•   Lenguaje interpretado: Máquina Virtual Java
•   Atributos y variables de clase
•   Métodos de instancia y de clase
•   Incluye metaclases (Reflexión)
                       Clases y Objetos             40
Paquetes Java

Clases relacionadas pueden agruparse en paquetes

      package estructurasDatos;
           public class Lista {...}
      package estructurasDatos ;
                 class Nodo {...}
           ...


                     Clases y Objetos              41
Paquetes Java

• Espacio de nombres: evita conflictos de nombres
• Define un ámbito: propiedades ocultas al exterior
  pero accesibles a las clases del paquete.
• Jerarquías de paquetes: p1.p2.p3…pn
• Calificación de nombres: java.util.Date
• Importación de paquetes: import java.util.Date;
• Un fichero (unidad de compilación) no puede
  incluir más de una clase pública.
                     Clases y Objetos             42
               class Cuenta {
                        private String   titular;
                        private int      saldo;
Ejemplo Java
                        private int      codigo;
                        private int[]    ultOper;

                        private static int    ultimoCodigo = 0;
                        public static int nuevoCodigo () {return ++ultimoCodigo;}

                        public Cuenta (String quien) {
                             saldo=0; titular=quien;
                             codigo = nuevoCodigo(); ultOper = new int[100];}

                        public void reintegro (int suma) {
                             if (puedoSacar(suma)) saldo=saldo-suma;};

                        public void ingreso (int suma) {       saldo=saldo+suma;}

                        public int getSaldo () { return saldo; }
                        private boolean puedoSacar(int suma) {return (saldo >=suma);}
               }




                                            Clases y Objetos                        43
Clases Java y Ocultación de Información

 • “package”
    – accesible por las clases del paquete, no accesible a los
      clientes del paquete
 • public
    – accesible por todas las clases
 • private
    – sólo accesible por los métodos de la clase
 • protected
    – accesible por las clases del paquete y por las subclases
                           Clases y Objetos                      44
Clases Java y Ocultación de Información

  public class Una {             public class Otra {
    public int at1;                 Una obj;
    protected int at2;              public void metodo1() {
    private int at3;                   obj.at1 = 10;
            int at4;                   obj.at2 = 20;
    public void m1() {..};             obj.at3 = 30;
    protected void m2() {..};          obj.at4 = 40;
    private void m3() {..};      };
             void m4() {..} }


                                ¿Legales?
                                                              45
   Atributo inmutable (Java)

• Un atributo final es aquel que no se puede modificar
  una vez inicializado.
• Definición de propiedades inmutables: no cambian a lo
  largo de la vida de un objeto.
• Pueden existir variables de clase o atributos inmutables.
• Se debe conocer su valor al crear la clase o el objeto.

             private final String codigo;

                                                        46
Relaciones entre clases

Cliente
  Una clase A es cliente de una clase B, si A contiene una
  declaración en la que se establezca que cierta entidad
  (atributo, parámetro, variable local) e es de tipo B
   Ejemplo:
                             titular
               CUENTA                       PERSONA

                “Cuenta es cliente de Persona”

                         Clases y Objetos                    47
Relaciones entre clases

Herencia
    Una clase es una versión especializada de otra
    existente

   Ejemplo:
                       Cuenta

       CuentaAhorro                     CuentaCorriente


                     Clases y Objetos                48
Método
• Está compuesto por:
   – CABECERA: Identificador y Parámetros
   – CUERPO: Secuencia de instrucciones
Ejemplo en Eiffel:

reintegro (cantidad: INTEGER) is do
       if puedoSacar(cantidad) then saldo:= saldo - suma
end


                     Clases y Objetos              49
Métodos

• ¿Qué instrucciones podemos incluir en el cuerpo
  de un método?
   –   Asignación
   –   Creación de objetos
   –   Condicional
   –   Iteración
   –   Mensajes (invocación a otro método)



                         Clases y Objetos           50
Instrucciones Eiffel
Asignación
       ox:= oy
ox: una entidad (atributo, variable local, Result)
oy: una expresión (constante, mensaje, entidad, Current)

Iteración
from “inicialización until “condición terminación”
loop
   “Cuerpo”
end
                          Clases y Objetos                 51
Instrucciones Eiffel

Creación
              oc: Cuenta

 !! oc        -- crea un objeto de la clase Cuenta con los
              -- campos inicializados con los valores por
              -- defecto y lo conecta a la variable oc

 !!oc.crear         -- crear es una rutina que inicializa los
                    -- campos de oc

                        Clases y Objetos                 52
Instrucciones Eiffel
Condicional

if c1 then s1                 inspect var
elseif c2 then s2             when v1 then s1
….                            ….
elseif cn-1 then sn-1         when vn-1 then sn-1
else sn                       else sn
end;                          end;



                        Clases y Objetos            53
Mensaje
• Invocación de la aplicación de un método sobre un
  objeto.
• Mecanismo básico de la computación OO.
• La modificación o consulta del estado de un objeto
  se realiza mediante mensajes.
• Formado por tres partes
   – Objeto receptor
   – Selector o identificador del método a aplicar
   – Argumentos

                       Clases y Objetos              54
Sintaxis mensajes

• Notación Punto: Eiffel, Java

       receptor. selector(argumentos)


 Si c es de tipo Cuenta

             c: Cuenta

             c. reintegro (1000)
                      Clases y Objetos   55
Sintaxis mensajes

• Notación Punto: C++

   receptor -> selector(argumentos)


• Si c referencia a un objeto “Cuenta”
             Cuenta *c
             c -> reintegro (1000)

             (*c). reintegro (1000)
                      Clases y Objetos   56
Sintaxis mensajes

• Smalltalk
  – Mensajes unarios
            c saldo
  - Mensajes binarios
            suma + contador
  – Mensajes “keyword”
            c reintegro: 10000

                    Clases y Objetos   57
Semántica mensajes

• Sea el mensaje x.f, su significado es:

  “Aplicar el método f sobre el receptor x,
  efectuando el paso de parámetros”

• ¡NO CONFUNDIR CON LA INVOCACIÓN
  DE UN PROCEDIMIENTO!


                     Clases y Objetos         58
Regla de validez de un mensaje (No
es definitiva)

                 oc: C;
                 oc. f(x)

 “Sea la declaración oc: C en una clase B, el
 mensaje oc.f(x) es legal si y solo si la clase C
 incluye un método con nombre f, exportado a B, y
 el tipo del argumento es compatible con el del
 parámetro”.

                    Clases y Objetos            59
Diferencia entre mensaje e
invocación a un procedimiento
• Un mensaje parece una llamada a procedimiento en
  la que solo cambia el formato:
      unaCuenta.reintegro (100000)
      reintegro (unaCuenta,100000)

• En una invocación a procedimiento todos los
  argumentos se tratan del mismo modo.
• En un mensaje un argumento tiene una naturaleza
  especial: “objeto receptor”
                     Clases y Objetos               60
Instancia actual

  “Cada operación de una computación OO es
  relativa a cierto objeto, la instancia actual en el
  momento de la ejecución de la operación”.

• ¿A qué objeto “Cuenta” se refiere el texto de la
  rutina reintegro?

• El cuerpo de una rutina se refiere a la instancia
  actual sobre la que se aplica.
                       Clases y Objetos                 61
Instancia actual

             obj.met (arg1, arg2,…)

reintegro (cantidad: Integer) is do
   if puedoSacar(cantidad) then saldo:=saldo-cantidad
end

¿Cuál es el objeto receptor de puedoSacar(cantidad)?

¿A qué objeto se le decrementa el saldo?

                      Clases y Objetos                  62
Instancia actual

    oc1, oc2: CUENTA; os: INTEGER;
    !!oc1; !!oc2;
    …
    oc1. reintegro(1000);
    os := oc1.saldo;
    …
    oc2. reintegro(2000)

                   Clases y Objetos   63
Cliente de CUENTA
 class CAJERO feature -- clase Eiffel
    cuentaActual: CUENTA;
    …
    reintegro(cant: INTEGER) is
      do
                   ….
          if cantidadOK (cant) then cuentaActual.reintegro(cant)
          else print(“cantidad no válida”);
          ….
       end;
 end


                           Clases y Objetos                    64
Instancia actual

• Cuando un mensaje no especifica al objeto receptor
  la operación se aplica sobre la instancia actual.
• Es posible referenciar a la instancia actual
   – Eiffel:       Current
   – C++, Java:    this


• En Smalltalk es obligado indicar el objeto receptor;
  self referencia al objeto actual
                      Clases y Objetos              65
Mensajes y “objeto actual”
class ICE1 feature                  -- clase Eiffel
   at1: INTEGER;
   at2: ICE2;
   at3: ICE3;
   rut1(p: INTEGER) is do
         at1:= p;
         at2.una_rutina;
        rut2;                 -- ¿Quién es el objeto receptor?
  end;
  rut2 is do
        at3. otra_rutina(Current)
  end;
end
                                                           66
Combinación módulo-tipo

  “Los servicios proporcionados por una clase, vista
  como un módulo, son precisamente las operaciones
  disponibles sobre las instancias de la clase, vista
  como un tipo”.

• Como cada módulo es un tipo, cada operación del
  módulo es relativa a cierta instancia del tipo


                     Clases y Objetos              67
  Current
comprendidoEntre (min,max: MAGNITUD): BOOLEAN is do
     if (Current >=min) and (Current <=max)
     then Result:= true end
end;

distancia (p: PUNTO): REAL is do
   if p /= Current then
         Result:= sqrt((x-p.x)^2 + (y-p.y)^2)
   end
end
                            Clases y Objetos    68
Valor de retorno de una función

1) return expr     (C)

   – Código poco estructurado
   – Necesidad de variables auxiliares
   – ¿Qué sucede si no se retorna nada?


2) nombre de la función es un identificador de
   variable (Pascal)
   – Ambigüedad
                         Clases y Objetos        69
Result

• Evita los problemas anteriores
• Variable predefinida para denotar el resultado de
  la función
• Técnica válida si las rutinas no pueden anidarse
• Valores por defecto




                      Clases y Objetos                70
class PUNTO feature
   x,y: REAL;
   rho: REAL is do
          Result:= sqrt(x^2 + y^2)
   end;
   theta: REAL is do
          Result:= atan2(y,x)
   end;
   distancia (p: PUNTO): REAL is do
          if p /= Current then Result:= sqrt((x-p.x)^2 + (y - p.y)^2)
   end;
   trasladar (a, b: REAL) is do
          x:= x + a;
          y:= y + b
   end;
   escalar (factor: REAL) is do … end;
   rotar (p: PUNTO; angulo: REAL) is do … end;
end
Eiffel y la notación punto

• Posibilidad de declarar operadores
       class REAL feature
         infix “+” (other: REAL): REAL is do … end;
         infix “-” (other: REAL): REAL is do … end;
               …
       end


• Permiten usar la notación habitual para las expresiones, en
  vez de la notación punto.


                          Clases y Objetos                  72
Eiffel y Notación punto

• Concatenación de mensajes

  texto.parrafo(i).linea(j).palabra(k).set_font(“bold”)

• Se cumple el principio del acceso uniforme

      oc: Cuenta
      v:= oc.saldo           ¿atributo o función?


                       Clases y Objetos               73
Ocultación de Información y Clases
relacionadas
Situación común:
 Tenemos dos o más clases relacionadas, tal
 que algunas necesitan propiedades de las
 otras para sus implementaciones, pero esas
 propiedades deben ser privadas el resto.

 Por ejemplo la clase A necesita a la clase B
 para su implementación, pero B no debe
 exportar sus propiedades al resto de clases.
                   Clases y Objetos             74
  Ocultación de Información y Clases
  relacionadas
class ListaEntero                         class NodoEntero
   feature {}                                feature
        cabeza: NodoEntero                     siguiente: NodoEntero
   feature                                     valor: Entero
        put (v, p: Integer) is                 setSig (n: NodoEntero) is do
                 do .. end                        siguiente:= n
        remove (p: Integer) is                  end
                 do .. end                      setValor (v:Integer) is do
        …                                         valor:= v
end                                             end
                ¿Quién debe                  end
               tener acceso?

                                 Clases y Objetos                       75
  Ocultación de Información y Clases
  relacionadas
Soluciones:
   – Paquetes que agrupan clases            (Java)
   – Clases anidadas                        (C++, Java)
   – Exportación Selectiva                  (Eiffel)

• “Módulos y clases anidadas complican innecesariamente el
  lenguaje” (B. Meyer).



                         Clases y Objetos                 76
Paquetes Java

package EstructuraDeDatos;
class NodoEntero {//clase con visibilidad paquete
   int valor;
   NodoEntero siguiente;
   NodoEntero(int v) {valor = v; siguiente = null}
};
public class ListaEntero {
   private NodoEntero primero;
   public insertar (int pos, int valor) {..};
   ...}
                          Clases y Objetos           77
Clases amigas en C++

Mecanismo para declarar explícitamente que una clase
B le da permiso a otra A para acceder a sus detalles
de implementación (propiedades no públicas)
class B {                             class A {
       friend class A;
                                       ...
       private:
               int i;
                                      void metodo1() {
       public: ...                          B *ob = new B();
       }                                    ob -> i = 89;
                                            …}
                                        }

                         Clases y Objetos                      78
    Lista en C++ con clase amiga


class NodoEntero {
        friend class ListaEntero;
private:
         NodoEntero (int i)                  {valor = i; sig = 0}
         NodoEntero (int i, NodoEntero *n)   {valor = i; sig = n;}
         int valor;
         NodoEntero * sig;
}



                                                                79
Lista en C++ con clase amiga
 class ListaEntero {
          NodoEntero       * cabeza;
 public:
                 listaEntero()        {cabeza = new NodoEntero (0,0);}
          int    vacio ()             {return cabeza->sig == 0;}
          void   inserta(int);
          int    extrae ();
          ...
 };
 void ListaEntero :: inserta(int x) {
          NodoEntero *nuevo = new NodoEntero(x);
          ...
          nuevo -> sig = previo -> sig;
          };

                                                                   80
Lista en C++ con clase anidada
class ListaEntero {
private:                                                     No visible
          class NodoEntero { //clase anidada                 al exterior
          public:
               NodoEntero (int i, nodo *n) {valor=i; sig=n;}
          int valor;
          NodoEntero * sig;
          }
          NodoEntero *cabeza;

public:
          ListaEntero()            {cabeza = new NodoEntero (0,0);}
          int      vacio ()        {return primero>sig == 0;}
          void     inserta(int);
          int      extrae ();
          ...
                                                                      81
};
Clases anidadas en Java

• Clases anidadas estáticas
   – Reflejan una relación sintáctica entre dos clases
   – Una clase se declara dentro de otra clase
• Clases internas
   – Reflejan una relación entre instancias de dos clases
   – Una instancia de la clase interna puede existir dentro de
     una instancia de la clase que la incluye y tiene acceso
     directo a sus atributos y métodos de instancia


                         Clases y Objetos                    82
Clases anidadas en Java

class Externa {
  ...
  static class ClaseAnidadaEstatica {..}
  ...
  class Interna {..}
  ...
}

                    Clases y Objetos       83
Clase anidada estática

• Se usan para estructurar clases relacionadas.
• La clase anidada tiene visibilidad sobre todas las
  propiedades de objetos de la clase que la incluye.

public class Externa {
  private int at1;
  public static class Interna {
       void metodo1 (Externa obj) {obj.at1 = 10;}
}

                       Clases y Objetos                84
Lista en Java con clase anidada estática
class ListaEntero {
    private NodoEntero cabeza;
    static class NodoEntero {
          private int valor;
          private NodoEntero siguiente;
          public NodoEntero(int v, Nodo s) {
                    valor = v;
                    siguiente = s; }
    }
    public void insertar_frente (int v){
          cabeza = new NodoEntero (v,cabeza); }
    public int primero(){
          return cabeza.valor; }
...
}                                                 85
Clase interna

• Un objeto de la clase interna está asociado siempre con un
  objeto de la clase que la incluye.
• Las instancias de la clase interna tienen ven los atributos y
  métodos de la clase externa como propios.
• La clase interna puede ocultar propiedades de la clase externa.
• Los objetos de la clase interna deben ser creados dentro de
  algún método de instancia de la clase externa.
• El objeto queda ligado al objeto externo receptor del mensaje.



                                                            86
Ejemplo de clase interna
class CuentaBancaria{
    private long codigo;
    private long saldo;
    private Operacion ultimaOper;

    public class Operación {
           private String descripcion;
           private long cantidad;
           ...
           public String toString(){
             return numero + “: ”+ descripcion+” “+cantidad;
           }
    }
    ...
    public void reintegro(long cantidad){
           saldo -=cantidad;
           ultimaOp= new Operacion(“reintegro”, cantidad);
    }
}
                                                               87
Lista en Java como clase interna
class ListaEntero {
   private NodoEntero cabeza;
   private class NodoEntero {
        public int valor;
        public NodoEntero siguiente;
        ...};

    public int primero () {return cabeza.valor};
    public esVacia () {return cabeza == null}
    ...

}

                                Clases y Objetos   88
Exportación selectiva en Eiffel
class ListaEntero                 class NodoEntero
   feature {}                        feature {ListaEntero}
         cabeza: NodoEntero             siguiente: NodoEntero
   feature                              valor: Entero
         put (v, p: Integer) is        setSig (n: NodoEntero) is do ..
                  do .. end            setValor (v:Integer) is do ..
         remove (p: Integer) is   end
                  do .. end
         …
end

                                       Exportar sólo a un
   feature {A,B,..}                    conjunto de clases
Ejercicio

• Intenta escribir en C++ y Java la siguiente clase
  Eiffel,

  class CELOSO
      feature { }
            esposa: MUJER;
      feature {MECANICO}
            coche: AUTOMOVIL
      …
  end
                      Clases y Objetos                90
Ejercicio

• Intenta escribir en C++ y Java la siguiente clase
  Eiffel,

  class CELOSO
      feature {SUEGRA }
            esposa: MUJER;
      feature {MECANICO}
            coche: AUTOMOVIL
      …
  end
                      Clases y Objetos                91
Semántica Almacenamiento

• Variables en los lenguajes tradicionales



  Identificador              tipo               valor
                   TC                      TC
                                                memoria




                        Clases y Objetos                  92
  Tipo “puntero”

  • Variables tipo "puntero" en lenguaje tradicionales

                      Tipo
Identificador        punter
                TC      o         TC             TE
                                       Memoria
                                       (almacena
                                                      Memoria
                                       referencia)
                                                      (almacena valor)



                         Clases y Objetos                       93
   Semántica referencia


Identificador        tipo
                TC                                  TE
                                      Memoria
                                      (almacena          Objeto
                                      referencia)


  “Una variable denota una referencia a un objeto”


                            Clases y Objetos                      94
Semántica referencia vs. Punteros
• En C++, semántica referencia asociada al tipo "puntero”
                    Cuenta *oc
• En Smalltalk, semántica referencia para cualquier entidad.
• En Eiffel, tipos referencia y tipos expandidos

  oc: Cuenta          oc: expanded Cuenta

• En Java, semántica referencia para cualquier entidad asociada a
  una clase (Existen los tipos primitivos)

                      Cuenta oc
                                                               95
 Semántica referencia
              Cuenta oc


oc           Estado “No ligado”

      oc = new Cuenta()

       oc                                  0
                                          1234
                                          void
            Estado “conectado”
                                       objeto Cuenta

                    Clases y Objetos                   96
Tipos referencia
• Los posibles valores de una entidad (atributo, parámetro, …)
  son referencias a objetos potenciales que pueden ser creados
  en tiempo de ejecución a través, siempre, de instrucciones de
  creación explícitas.
• Una referencia puede encontrarse en uno de dos estados
  posibles
   – No ligada: Void (Eiffel) o null (Java)
   – Ligada a un objeto
• Las referencias son “punteros domesticados”.
• Void es un estado (null es un literal) mientras que “nil”
  (en Pascal) o “null” (en C) son valores de tipo puntero.

                         Clases y Objetos                   97
Estados de una referencia en Eiffel
                       !!ob
             ob:=oc (si oc está conectado)


    Estado                                Estado
     Void                                Conectado




                   ob:= Void
                ob:=oc (si c es void)
                      Clases y Objetos               98
Estados de una referencia en Java
                    ob:= new B ()
               ob = oc (si c está conectado)


    Estado                                 Estado
   no ligado                              Conectado




                    ob = null
                ob = oc (si c es null)
                       Clases y Objetos               99
Asignación
 oa                                          ob



                    oa:= ob
        oa                         ob



La asignación no implica copia de valores sino de
referencias
        ¡Cuidado con el Aliasing!             100
Consecuencia del aliasing
   -- P(b) es cierto
                 a:=b
                 rutina(a)         -- rutina no afecta a b
   -- P(b) puede ser falso

class C feature
   at1: BOOLEAN;
   …
   set_at1_false is do
        at1:= false
   end;
end
                             Clases y Objetos                101
Consecuencia del aliasing
Ejemplo 1.                         Ejemplo 2.

x,y: Integer;                      x, y: C

-- y>0                             -- y /= void and y.atrib = true
         x:=y;                              x:=y;
         x:= -1                             x.set_atrib_false;
-- y>0                             -- y.atrib = false

• “Aliasing” es peligroso pero inevitable.
• Con semántica referencia la asignación es más eficiente.

                             Clases y Objetos                        102
   Referencias y Compartición
           Objeto Cuenta                          Objeto Cuenta

titular                                                              titular

codigo        123456                                975310           codigo

saldo         100000                                300000           saldo
                                                                     ultOper
ultOper

               oc1                                    oc2
                              J. Gomez      nombre
          25000                                              -5000
                             87654321       dni
          -16000                                             10000
                           Objeto Persona
Autoreferencias

      nombre       “M. Martinez”

      categoria         “Fijo”

      salario       100000000

      director

                  Objeto Empleado




                      Clases y Objetos   104
Ventajas de los tipos referencia

• Más eficiente para manejar objetos complejos.
• Soporte para definir estructuras de datos recursivas.
• Soporte del polimorfismo.
• Los objetos son creados cuando son necesarios.
• Permite la compartición de un objeto (integridad semántica).


• DESVENTAJA: “Aliasing”

                        Clases y Objetos                  105
Tipos expandidos en Eiffel
• Los posibles valores de una entidad son los objetos mismos en
  vez de referencias; no necesitan instrucciones de creación

       expanded class PERSONA              p: expanded PERSONA
       …
       end;

• Justificados para
   – Modelar con realismo objetos del mundo real
   – Ganar en eficiencia
   – Para los valores de los tipos básicos

                        Clases y Objetos                     106
Objeto “Cuenta” (Subobjetos)

                 J. Gomez       nombre
     titular
                 87654321          dni

               Objeto Persona

     codigo          123456

     saldo           100000

                       -5000
     ultOper
                       10000
                    Objeto Array


                    Clases y Objetos     107
Objetos Compuestos (“Composite”)

• Un objeto compuesto, oc, es aquel que tiene uno o más
  campos que son objetos (sub-objetos).

       class COMPUESTO feature
             ref: C;
             sub: expanded C;
             ..
       end
                     oc: COMPUESTO

                        Clases y Objetos                  108
Semántica de las variables

    Eiffel                        C++        Java

c1: Cuenta               Cuenta *c1      Cuenta c1
c2: expanded Cuenta      Cuenta c2       int i




                      Clases y Objetos               109
Modelado del dominio

• Relaciones entre clases
   –   Atributos
   –   Asociaciones
   –   Parte-de
   –   Contiene
   –   Uso
• Los tipos expandidos modelan la relación parte-de


                      Clases y Objetos           110
class Coche
feature
-- Atributos
    color: String;
    peso: Real;                      Class EditorUML
    potencia: Real                   feature
    matricula: String                -- Contiene
-- Parte-De                              diagrama: List[Grafico]
    motor: MotorCoche                -- Uso
    chasis: ChasisCoche                  ventana: Window
    ruedaTrasera: RuedaCoche             …
-- Asociaciones                      end
    fabricado-por: FabricanteCoche
    propietario: Persona
    …
end
Paso de parámetros

Sea la rutina
       r (p1: T1 ,…, pn: Tn)
la invocación
        r (a1,...,an)
implica un “paso por valor”
       p1 := a1;
       …
       pn := an;
                      Clases y Objetos   112
Paso de parámetros en Eiffel

• Los parámetros pi están protegidos: no se pueden hacer
  modificaciones directas.
      pi:= …
      !!pi.make(..)

• Los objetos ligados a los parámetros (tipo referencia) si
  pueden ser modificados
      pi. r     -- r es una rutina pública en Ti

• Los argumentos pueden ser expresiones

                          Clases y Objetos                    113
Paso de parámetros en Java

• Paso “por valor”
• Se pueden realizar modificaciones directas sobre los
  parámetros
      void hacer_moroso (Cliente cli) {
             cli.tipo = “moroso”;
             cli = null;}
• Se puede evitar si se declara el parámetro como final

       void metodo (final Cliente cli) {..}


                         Clases y Objetos                 114
Lista de enteros en Pascal
        TYPE tipoLista= ^nodo;
             nodo= RECORD
                       valor: INTEGER;
                       sig: tipoLista
                      END

// Creación de una lista con elementos 1, 2,..,n

        p,q: tipoLista; n: INTEGER;
        readln(n);
        p:=nil;
        WHILE n>0 DO BEGIN
                 new(q); q^.sig:=p; p:=q;
                 q^.valor:=n; n:=n-1;
        END
 Lista de enteros en Eiffel
class NODO_ENTERO
feature {LISTA_ENTERO}
   valor: INTEGER;
   sig: NODO_ENTERO;

  set_valor (v: INTEGER) is do
       valor:= v;
  end;

  set_sig (s: NODO_ENTERO) is do
       sig:= s
  end;
end
                           Clases y Objetos   116
Lista de enteros en Eiffel
class LISTA_ENTERO
feature
   cabeza: NODO_ENTERO;
   num_elems: INTEGER;
   valor (i: INTEGER): INTEGER is do … end;
   cambiar_valor (i: INTEGER, v: INTEGER) is do … end;
   insertar (i: INTEGER, v: INTEGER) is do … end;
   eliminar (i: INTEGER) is do … end;
   buscar (v: INTEGER): INTEGER is do … end;
   ….
end

                           Clases y Objetos              117
insertar (i: INTEGER, v: INTEGER) is
    local nuevo, previo: NODO_ENTERO;
               j: INTEGER;
    do
            !!nuevo;
            nuevo.cambiar_valor(v);
            if i = 1 then
                        nuevo.cambiar_sig (cabeza);
                        cabeza:=nuevo;
            else
                        from j:=1; previo:=cabeza;
                        until j=i-1
                        loop
                                    j:= j+1;
                                    previo:=previo.sig
                        end
                        nuevo.cambiar_sig (previo.sig);
                        previo.cambiar_sig (nuevo);
            end
            num_elems:= num_elems + 1;
    end;
end;
                        objetos Nodo_Entero
numElems     3          11           22           33

  cabeza

       objeto Lista

                                15

           insertar (3,15)
                              nuevo

             !!nuevo; nuevo.cambiar_valor (15);
             j=1; previo:= cabeza;
             j=2; previo:= previo.sig;
             nuevo.cambiar_sig (previo.sig)
             previo.cambiar_sig (nuevo)
             num_elems:= num_Elems + 1
Creación de Objetos

• Mecanismo explícito de creación de objetos
   – Eiffel: instrucción de creación, !!
   – C++, Java: instrucción de creación, new
   – Smalltalk: método de clase new
• Recuperación de memoria
  – Smalltalk, Eiffel y Java: Recogida de basura
  – C++: Destructores
                                                   120
Inicialización de Objetos

• Creación establece valores por defecto para los
  atributos.
• Inicialización con valores consistentes:
          – Eiffel: rutinas de creación
          – C++, Java: constructores
          – Smalltalk: métodos de clase



                      Clases y Objetos              121
Creación de Objetos en Eiffel

              !tr! e.rc(..)
donde
  tr: tipo referencia                       (opcional)
  e: identificador de una entidad
  rc: rutina de creación                    (opcional)

Ejemplos:
  !!oc                         !!oc.abrir (p)
  !Cuenta_Ahorro!oc            !Cuenta_Ahorro!oc.abrir(p)
                         Clases y Objetos                   122
Creación de Objetos en Eiffel

              !!e
(supuesto e: T y T no tiene rutinas de creación)

1) Crea una nueva instancia de T
2) Inicializa los campos de la instancia con los valores por
   defecto
3) Conecta e a la instancia creada



                        Clases y Objetos                123
Creación de Objetos en Eiffel

              !!e.rc1(..)
(supuesto e: T y T tiene la rutina de creación rc1)

1) Crea una nueva instancia de T
2) Inicializa los campos de la instancia con los valores por
   defecto.
3) Se aplica sobre la instancia la rutina de creación rc1, de
   modo que quede en un estado consistente
3) Conecta e a la instancia creada

                        Clases y Objetos                124
Creación de Objetos en Eiffel
                            oc:Cuenta; op: Persona
class CUENTA
                              !!op
  creation abrir
                              !!oc.abrir(p)
  feature
    abrir (quien: PERSONA) is do .. end;
    ..
  end

Una rutina de creación puede ser privada.


                       Clases y Objetos              125
Tipos expandidos y creación
• Para entidades de tipo expandido no es necesario crear
  objetos.
• El espacio se asigna en tiempo de compilación.
• Sea la clase
       class X feature
               a: T1                -- T1 tipo referencia
               b: expanded T2       -- T2 tipo referencia
       …
       end
y la declaración ox:X, ¿cuál es el efecto de !!ox?
                         Clases y Objetos                   126
Tipos expandidos y Creación
           !!ox

              void               a
   ox
                                 b
            objeto T2


            objeto X


                  Clases y Objetos   127
Inicialización de objetos por defecto

   TIPO                            VALOR
 Referencia                        Void
 BOOLEAN                           False
 INTEGER                           0
 REAL, DOUBLE                      0
 CHARACTER                         carácter nulo
 Expandido                         mecanismo anterior

                Clases y Objetos                  128
Inicialización de objetos

• Sea la declaración Eiffel
           oc:Cuenta
siendo Cuenta un tipo referencia

  ¿por qué no se le asocia el objeto en tiempo de
   compilación, en vez de inicializarlo como void?



                      Clases y Objetos          129
Tipos expandidos y creación

¿Son válidas las siguientes declaraciones de clases?

class X feature             expanded class Y feature
   a1: REAL;                     a3: expanded X;
   a2: Y;                        a4: STRING;
   a3: Z;                        …
   …                        end
end


                      Clases y Objetos                 130
Constructores (C++ y Java)

• Realizan la inicialización de un objeto tras la
  creación.
• Un constructor
   – procedimiento especial con el mismo nombre que la clase.
   – Se debe invocar cuando se crea un objeto de la clase con
     el operador new
   – En C++ también cuando se declara una variable.
   – Pueden tener modificadores de acceso


                         Clases y Objetos                131
Constructores (C++ y Java)

Ejemplo:
      class Complejo {
        public:
          float real;
          float imag;
          Complejo ()                   {real = imag = 0.0;}
          Complejo (float pr)           {real = pr; imag = 0.0;}
          Complejo (float pr, float pi) {real = pr; imag = pi;}
...
}
                             Clases y Objetos                 132
Creación en C++
Ejemplo:
       Complejo *c
       …
       c = new Complejo (3.14159, 2.4)

       Complejo x, y(4.0), z(3.14159, 2.4)

• Constructores con valores por defecto para parámetros

       Complejo(float pr = 0.0; float pi = 0.0);

                         Clases y Objetos                 133
  Destructores en C++
• Posibilidad de definir DESTRUCTORES que se ejecutan
  automáticamente cada vez que se libera memoria.
   – Al acabar un procedimiento (variables automáticas)
   – Al aplicar el operador delete () (variables dinámicas)

       class Complejo {
              public:
                     ~Complejo () {...};
                      Complejo(float pr = 0.0; float pi = 0.0);
                     …
       }

                           Clases y Objetos                   134
  Destructores en C++
class pilaCar {
        int     tam;
        char* cima;
        char* elems;
public:
        pilaCar (int tm) { cima=elems=new char [tam=tm] }
        ~pilaCar ()     { delete [ ] elems };
   void push (char c) { *cima++=c };
   char pop () { return *-cima }
}


                           Clases y Objetos                 135
Destructores en C++

  pilaCar* p1 = new pilaCar(10);
  pilaCar* p2 = new pilaCar(100);

  delete p1;
  delete p1;    ¡ERROR: no se puede eliminar dos veces!
  delete p2;




                      Clases y Objetos              136
 Creación en Java

• Si una clase no proporciona constructores:
   – Constructor por defecto que inicializa los campos con los
     valores por defecto, no tiene argumentos.
   – Misma accesibilidad que la clase
• Posibilidad de invocar a otro constructor de la clase
      Ejemplo (String s, int i) {
            this() ;
            at1 = s;
            at2 = i;}
                           Clases y Objetos                  137
Creación en Smalltalk

• Método de clase new
              oc:= Cuenta new.
              nc:= Complejo new.

   – Crea una instancia de la clase, y los campos tienen valor nil.
   – Inicialización mediante métodos de instancia, invocados
     desde un método de clase de creación




                         Clases y Objetos                   138
Creación en Smalltalk: Inicialización
real: pr imag: pi               "método de clase"
  ^(Complejo new) real:pr imag:pi.

real: pr imag: pi                        "método de instancia"
       real:= pr.
       imag:= pi.

Ejemplo de mensaje de creación:

             c:= Complejo real:3.14159 imag:2.4

                      Clases y Objetos                      139
Asignación

• Semántica de la Asignación: x:= y
  – COMPARTICION
     • Cuando x e y tienen semántica referencia
  – COPIA
     • Cuando x e y tienen semántica almacenamiento

• Los lenguajes OO incorporan operaciones de
  copia para las variables con semántica de
  referencia.

                    Clases y Objetos            140
Copia de objetos

• Copia superficial
   – Se copian los valores de cada campo del objeto origen oy
     en el objeto destino ox; ox y oy comparten referencias.
   – Soportada por defecto y puede redefinirse para una clase
     concreta.
• Copia profunda
   – Se crea un objeto con una estructura idéntica al objeto
     origen.
   – No hay compartición de referencias
   – No suele ser soportada por defecto

                         Clases y Objetos                  141
Copia de una pila de enteros
class Pila
feature
   count: Integer
   elems: Array [Integer];
   put(v:Integer) is do .. end
   item: Integer is do .. end
   ..
end
             pila1, pila2: Pila;
             !!pila2;
             pila2. put(100); pila2. put(100); pila2. put(100)
             pila1.copy(pila2)

                              Clases y Objetos                   142
Copia de una pila de enteros


            3                           3
   pila2                                    pila1



             100              300     500




                   Clases y Objetos          143
Copia superficial en Eiffel

                                       8.1
                 "ABC"


             y   VOID

                  76
                                       -9.6
                  oy
x.copy (y)


                 "ABC"
                         ox e oy existen previamente
             x   VOID

                   76
                         x /= void e y /= void
                  ox
                                                 144
 Copia profunda en Eiffel
                                   8.1
                         "ABC"


                y       VOID

                         76
                                   -9.6
                          oy
 x.deep_copy(y)
                                     8.1

                         "ABC"

                x         VOID

                              76
                                     -9.6
                              ox
ox e oy existen previamente
                                            145
Copia profunda de una pila


            3
   pila2
                                   100   300   500


            3
   pila1
                                   100   300   500




                Clases y Objetos               146
Clone en Eiffel

           x:= clone (y)
           x:= deep_clone (y)

• Variante de la copia
• El objeto ox es creado por la asignación.
• ¿Ofrece alguna ventaja en relación a copy?




                    Clases y Objetos           147
Copia en Java

• La clase Object incluye el método
      protected Object clone( ) {..} ..}
que implementa una copia superficial.

• Para poder clonar objetos de una clase se debe
   – Declarar que implementa la interfaz Cloneable
   – Redefinir y hacer público el método clone()
   – Dejar la versión original (copia superficial) o bien hacer
     una copia de mayor profundidad.

                          Clases y Objetos                  148
Igualdad vs. Identidad

• Identidad
  – Dos variables referencian al mismo objeto
• Igualdad
  – Dos variables referencian objetos con valores iguales en
    sus campos
  – Un objeto referencia a otros objetos:
            ¿Cuándo dos objetos son iguales?

  Igualdad Superficial vs. Igualdad Profunda

                        Clases y Objetos                 149
  Identidad

    Eiffel        Java              C++         Smalltalk
   oa = ob      oa == ob          oa == ob      oa == ob


  Igualdad
   Eiffel           Java             C++         Smalltalk
equal (oa,ob)   oa. equals (ob)    *oa == *ob     oa = ob
Igualdad

• El significado de la igualdad depende de la clase
  de objeto:
   – ¿Cuándo son iguales dos cuentas bancarias o dos
     cadenas de texto?)
• Significado por defecto en la clase raíz (Object) y
  el programador puede redefinirlo.
• En C++ se puede sobrecargar el operador ==


                        Clases y Objetos               151
Igualdad superficial

• Dados dos objetos ox e oy de una misma clase se
  dice que son iguales superficialmente cuando cada
  campo de ox tiene el mismo valor o referencia que
  cada campo de oy.




                     Clases y Objetos            152
Igualdad de objetos
class Ejemplo                  oa, ob, oc, od: Ejemplo;
   at1: String;                !!oa
   at2: Integer;               oa.setA1(“uno”)
   setAt1 (s: String) is do    oa.setAt2(23)
        at1:= s                oc:=oa
   end                         !!ob
   setAt2 (i: Integer) is do   ob.setA1(“uno”)
      at2:= i                  ob.setAt2(23)
   end                         !!od
end                            ob.setA1(“dos”)
                               ob.setAt2(88)
                                                          153
     Igualdad de objetos
oa
          “uno”            “uno”              “dos”

           23               23                  88


oc                ob                     od
Identidad (Igualdad entre referencias)
   oa=oc {true}          oa=ob {false}   a = b  equal(a,b)
Igualdad entre objetos                    equal(a,b)  a=b
   equal(oa,ob) = true
   equal(oa,od) = false
   equal(oa,oc) = true                                154
Igualdad de objetos
                                   11
       ”ABC”
oy
        void
        89                         22




       ”ABC”
ox
       void
        89
                      ¿ox es igual a oy?
Igualdad de objetos
       ox1                 ox2
        ‘A’                ‘B’
       void
                           void


        ‘A’                    ‘B’
       void
                           void

       oy1                 oy2

        ¿ox1 es igual a oy1?
Igualdad Profunda en Eiffel

Igualdad profunda:
  Dos referencias x e y son iguales en profundidad si:
      1) x=y=void
      2) Están conectados a “objetos iguales en
      profundidad”




                       Clases y Objetos              157
Igualdad profunda en Eiffel
Dos objetos, ox y oy, son iguales en profundidad, si satisfacen
las siguientes cuatro condiciones:
1) Tienen el mismo tipo

2) Los objetos obtenidos al hacer void todos los campos-referencia de ox e oy
   son iguales.

3) Para cada campo-referencia de ox con valor void, el correspondiente
   campo de oy es void

4) Para cada campo-referencia de ox conectado a un objeto px, el
   correspondiente campo de oy está conectado a un objeto py, y es posible
   demostrar recursivamente que px y py son iguales en profundidad,
   asumiendo que ox e oy lo son.
                              Clases y Objetos                         158
Igualdad de objetos

       x:=clone(y)  equal (x,y)
       x.copy(y)  equal (x,y)
       x:= deep_clone(y)  deep_equal(x,y)

• ¿Una igualdad profunda implica una igualdad superficial?




                         Clases y Objetos                159
Genericidad

• ¿Cómo escribir una clase que represente una estructura de
  datos y que sea posible almacenar objetos de cualquier
  tipo?

   Pila-Enteros
   Pila_Libros                Pila de ?
   Pila_Figuras
   ….
• Necesidad de reconciliar reutilización con el uso
  de un lenguaje tipado.
                         Clases y Objetos                 160
Herencia
 ColeccionEntero                      ColeccionTarea


   ListaEntero                          GrafoTarea



ListaCircularEntero                      RedTarea


                   Clases y Objetos                    161
class ListaEntero inherit ColeccionEntero feature
   numElements: Integer is do ..
   añadir (i: Integer, v:Integer) is do ..
  iesimo (i:Integer): Integer is do ..
  buscar (v:Integer): Boolean is do ..
   ...
end




 ¿Cómo asociar a v un tipo pero sin hacer que
la clase sea dependiente del tipo de objeto
almacenado?
Sistema de tipos
miLista: ListaEnteros
unLibro: Libro; v: Integer; unPunto: Punto

miLista.añadir(3,86);
miLista.añadir(3,unLibro);                ¡Error!
v:= miLista.iesimo(3);
unPunto:= miLista.iesimo(3)               ¡Error!


             Fiabilidad y Legibilidad
                       Clases y Objetos             163
Genericidad
          Coleccion [G]


              Lista [G]



          ListaCircular [G]


                Clases y Objetos   164
class Lista [G] feature
   numElements. Integer is do ..
   añadir (i: Integer, v:G) is do ..
  iesimo (i:Integer): G is do ..
  buscar (v:G): Boolean is do ..
   ...
end



      miLista1: Lista [Integer]
      miLista2: Lista [Punto]
Genericidad

• Posibilidad de parametrizar las clases; los parámetros
  son tipos de datos.

• Facilidad útil para las clases que representan
  estructuras de datos generales: TIPO BASE ES UN
  PARAMETRO

  class ARRAY [G], class PILA [G], class LISTA [G], ...

• Orientada a los creadores de clases

                      Clases y Objetos              166
Genericidad

class PILA[G]        -- G es el "parámetro genérico formal”
   feature {all}
       count: INTEGER;
       empty: BOOLEAN is do .. end;
       full: BOOLEAN is do .. end;
       put (x:G) is do .. end;
       remove is do .. end;
       item: G is do .. end;
end.

                          Clases y Objetos                    167
Uso de una clase genérica
• El parámetro genérico actual puede ser:

1) Un tipo expandido
       pe: PILA [INTEGER]

2) Un tipo referencia

  pp: PILA [PUNTO] ;  ppp: PILA [PILA [PUNTO]] ;
  aac: ARRAY [ARRAY [CUENTA]]

3) Un paramétro genérico formal de la clase cliente
       class C[G] feature
               at: PILA [G];
               ....
       end
Genericidad y Control de tipos

 pp: PILA [PUNTO]; pc: PILA [CUENTA];
 p: PUNTO; c: CUENTA;


MENSAJES VALIDOS          MENSAJES NO VALIDOS
 pp.put (p)                   pp.put (c)
 pc.put (c)                   pc.put (p)
 p:= pp.item                  p:= pc.item



                    Clases y Objetos        169
Regla de validez de un mensaje (No
definitiva)


• Sea la clase C[G] con una operación r(p:G), y la
  declaración
             obj: C [V]
  el mensaje obj. r(a) que aparece en una clase B
  será legal si a es de tipo V y el método r está
  disponible para la clase B.


                      Clases y Objetos               170
Operaciones sobre entidades de tipos
genéricos

Sea la clase
               class C [G,H,..] feature
                     x:G
                     rut (p:H) is do .. end;
                     ...
               end
¿Qué operaciones podemos aplicar sobre las entidades cuyo
tipo es un párametro genérico?

  En una clase cliente, G, H,… pueden ser instanciados a
  cualquier tipo.
                         Clases y Objetos                   171
Operaciones sobre entidades de tipos
genéricos
• Cualquier operación sobre el atributo x debe ser
  aplicable a cualquier tipo.
• Cinco posibles operaciones:
  1) x:= y           (y es una expresión de tipo G)
  2) y:= x           (y es una entidad de tipo G)
  3) x=y ó x/=y      ( y es de tipo G)
  4) a.f(...,x,...)  (x actúa como argumento en un mensaje,
                     el correspondiente parámetro es de tipo G
                     o ANY.
  5) Receptor de un mensaje que invoca a una rutina de ANY.
Cuestiones sobre genericidad
• “Sin genericidad es imposible lograr una comprobación estática
  de tipos en un lenguaje OO realista”
                                                   [B. Meyer]
• ¿Cómo definimos sin genericidad las estructuras de datos sin
  repetir código?

• ¿Cómo podemos definir una estructura de datos que almacene
  objetos que sean tipos de figuras?

• ¿Es posible exigir que los parámetros genéricos actuales sean
  tipos que incluyan ciertas operaciones?
                         Clases y Objetos                  173
Arrays en Eiffel

class ARRAY[G] creation make
  feature
       make(minindex,maxindex: INTEGER) is do .. end;
       lower, upper, count: INTEGER;
       put (v:G; i: INTEGER) is do .. end;
       infix “@”, item (i:INTEGER): G is do .. end;
end.



                     Clases y Objetos            174
Genericidad en C++ (Templates)
template <class T>
class pila {
   T* v;
   T* p;
   int tam;
public:
   pila (int t) {v = p = new T [tam=t];}
   pila () {delete [] v;}
   void push(T a) {*p++ = a;}
   T pop () {return *--p;}
   int tamaño() const {return p-v;}
}
         pila<char> pc(100) // pila de caracteres
         pila<punto> pp(20)        // pila de puntos
Genericidad y Java

• Java no posee genericidad
• Necesidad de declaraciones de tipo Object
• Problemas:
   – Necesidad de conversiones de tipo
   – No se asegura homogeneidad
• Incluye genericidad para arrays
     private Cuenta[ ] cuentas = new Cuenta[100]
     private int[ ] valores = new int [4]
                        Clases y Objetos           176
Ejemplo “Correo Electrónico”
class BUZON_CORREO feature
   conj_carpetas: LIST [CARPETA];
   buscar (s: STRING): LIST [MENSAJE] is do .. end;
   …
end

class CARPETA feature
   conj_mensajes: LIST [MENSAJE];
   buscar (s: STRING): LIST [MENSAJE] is do .. end;
   ...
end

class MENSAJE feature
   contenido: STRING
   emisor: PERSONA;
   fecha: FECHA;
   buscar (s: STRING): BOOLEAN is do .. end;
   …
end
Ejemplo
Correo electrónico
  buzon. buscar(“unTema”)

buscar(s: STRING): LIST[MENSAJE]
 is do
    “Para cada carpeta c”
     c.buscar(“un tema”)
 end

buscar(s: STRING): LIST[MENSAJE]
 is do
    “Para cada mensaje m”

 end
     m.buscar(“un tema”)            buzon
buscar(s: STRING): BOOLEAN is
 do
   “¿Contiene el texto s?
 end

                                   Clases y Objetos   178
Metaclases
• Una clase puede ser considerada un objeto:
   – ¿Cuál es su clase?
• Metaclase
   – Clase que describe clases, sus instancias son clases.
   – Propiedades: lista de atributos, lista de variables de clase,
     lista de métodos, lista de métodos de clase.
• Java y Smalltalk tienen metaclases
• Útil en programación avanzada, cuando se manejan
  entidades software, p.e. depuradores, inspectores,
  browsers,..
                                                              179
Metaclases

• Metainformación
• Clases, atributos, métodos,.., son representados
  por clases.
• Posibilidades
   –   Crear o modificar clases en tiempo de ejecución.
   –   Parametrizar métodos por clases o métodos.
   –   Consultar estructura y comportamiento de una clase.
   –   ...

                          Clases y Objetos                   180
Metaclases

  void metodo1 (Class c) {
    “crear objeto clase c”
  }
  void metodo2 (String c) {
    “obtener instancia de metaclase para clase c”
    “crear objeto clase c”
  }
  void metodo3 (Metodo m) {
    “invocar m”
  }
                     Clases y Objetos               181
Reflexión o Instropección en Java
• La clase Class es el punto de arranque de la
  reflexión.
• Class representa clases, incluye métodos que
  retornan información sobre la clase:
   – getFields, getMethods, getSuperClass, getClasses,
     getConstructors, getModifiers, getInterfaces,...
• Field representa atributos (hereda de Member):
   – getType, getName, get, set,..
• Method representa métodos (hereda de Member):
   – getName, getReturnType, getParameterTypes,..
                                                         182
Reflexión o Instropección en Java
•   Existe una instancia de Class por cada tipo (interface o
    clase).
•   Cuatro formas de obtener un objeto Class

                 Cuenta oc; Class clase
    1)   clase = oc.getClass
    2)   clase = Cuenta.class
    3)   clase = Class.forName(“Cuenta”)
    4)   Utilizando un método que retorna objetos Class

Ejercicio: Escribe una clase que imprima los campos y métodos de una
clase dada.
                                                                       183
Reflexión o Instropección en Java
•   Crear una instancia de una clase de la que se
    conoce su nombre, nomClase:
      Class.forName(nomClase).newInstance()
•   Construir un mensaje (método invoke en Method)

    invoke(Object sobreEste, Object[] params)

    getMethod(nom, parametros) retorna el
    método con nombre nom de la clase.
                                                184
Modelo de ejecución

• La ejecución de un programa OO consiste en:
   – Creación dinámica de objetos
   – Envío de mensajes entre los objetos creados, siguiendo
     un patrón impredecible en tiempo de compilación
• Ausencia de programa principal
• ¿Cómo empieza la ejecución de un programa OO?
   – Creación de un “objeto raíz”
   – Aplicar mensaje sobre “objeto raíz”


                        Clases y Objetos                  185
Modelo de ejecución

• En tiempo de ejecución, el flujo de ejecución siempre
  se encuentra aplicando una operación sobre un
  objeto (instancia actual) o ejecutando una operación
  que no es un mensaje (asignación, creación).

• En un instante dado bien se aplica un mensaje sobre la
  instancia actual o sobre un objeto accesible desde él.



                      Clases y Objetos            186
Estructura de objetos en tiempo de
ejecución
                        obj2
RAIZ                                     obj7




                                             obj1



                               obj4
       Current
                                      obj5

                                                      obj9

                 obj3
                                               obj8
¿Cómo llega un mensaje a ser
ejecutado?

Dado el mensaje

             c. reintegro (cantidad)
formará parte del cuerpo de una rutina r de una clase.

1) La ejecución de todo elemento software es provocada
   por un mensaje
2) Cada mensaje tiene un receptor.

                      Clases y Objetos              188
Sistema (Eiffel)
• Un sistema viene dado
   – Un conjunto de clases
   – La clase raíz
   – El procedimiento de creación de la clase raíz
• Un sistema debe ser cerrado, debe contener todas
  las clases necesarias por la clase raíz.
• La ejecución de un sistema comienza creando un
  objeto de la clase raíz y aplicándole la rutina de
  creación.

                         Clases y Objetos              189
Sistema (Eiffel)
system pintar
  root Graficos (“aplicación_dibujar”)
  cluster
      biblioteca_basica: “\lib\base”
      biblioteca_graficos: ”\lib\vision”
      aplicación: “\usr\app”
end


                      Clases y Objetos     190
Estructuras de datos “Lista”
           Instancia de Linked_List[G]
      first_element

                           item right

  A           B               C          D


        Instancias de Linkable[G]



                      Clases y Objetos       191
  Lista “pasiva”
class LINKABLE[G] creation make
feature {LINKED_LIST}
   item:G
   right: LINKABLE[G];
   make(initial: G) is
         do put(initial) end;
   put (new:G) is
         do item:= new end;
   put_right (other: LINKABLE[G]) is
         do right:= other end;
end

                              Clases y Objetos   192
  Lista “pasiva”
class LINKED_LIST[G] feature -- Acceso
   count: INTEGER;
   empty: BOOLEAN is
          do Result:= (count = 0) end;
   item(i: INTEGER) is
          require 1<=i; i<=count                         // ejemplo precondición
          local elem: LINKABLE[G]; j: INTEGER;
          do
             from j:=1; elem:= first_element
             until j = i
             loop
                     j:= j + 1; elem := elem.right
             end;
             Result:= elem.item
          end;

                                      Clases y Objetos                         193
   Lista “pasiva”
feature             -- Acceso (continua)
   ocurrences (v:G): INTEGER is do .. end;
feature -- cambio de elementos
   put (v:G, i: INTEGER) is do .. end;
   replace (i:INTEGER, v: G) is do .. end;
feature -- eliminación
   prune (i: INTEGER) is do .. end;
feature {LINKED_LIST} -- Implementación
   first_element: LINKABLE[G]
invariant
   empty = (count = 0);
   empty = (first_element = Void)
end



                                   Clases y Objetos   194
   Lista “pasiva”
• Operaciones algo complicadas: “Iteraciones que manipulan una estructura
  basada en referencias”
• Importante incluir asertos.

• Inconvenientes:

        1) Redundancia de código entre los métodos

        2) Ineficiencia

        “Lista[G] es una clase mal diseñada”


                                 Clases y Objetos                      195
  Lista “pasiva”
                 ¿POSIBLES SOLUCIONES?

1) La función ocurrences() devuelve una referencia a un objeto Linkable o una
   referencia void
     Esta solución es contraria al ocultamiento de información

2) Proporcionar un conjunto de métodos suficiente para tratar con todas las
   posibles combinaciones de operaciones: buscar e insertar, buscar y eliminar,
   …
        - ¿Cuándo tenemos todas las variantes?
        - Hay que buscar clases estables.
        - Los métodos son muy similares


                                 Clases y Objetos                        196
Lista “activa”
         Debemos añadir elementos al estado:
              “Un cursor que lleve cuenta de la posición actual”

            Instancia de Linked_List[G]
          first_element
                              Instancias de Linkable[G]

   A                B               C                D
                                        Cursor
before                                                     after
                     back                        forth
                              Clases y Objetos                     197
  Lista “activa”
Comandos para manipular el cursor:
      - Moverlo a la primera o a la última posición
      - Avanzar o retroceder una posición
      - Moverlo a una posición dada

Consultas sobre el cursor
      - Comprobar si está al inicio o al final
      - Consultar elemento actual
      - Consultar posición actual
      - Comprobar si está a la izquierda del primer elemento
      - Comprobar si está a la derecha del último elemento


                               Clases y Objetos                198
  Lista “activa”
Comandos para manipular la lista
   – insertar, eliminar, sustituir, …
   – Todos actúan sobre la posición actual: MAS SIMPLES

         Lista “pasiva”           Lista “activa”

       unaLista.eliminar(i)                unaLista.go(i);
                                           unaLista. remove


Necesidad de establecer de forma precisa como afectan las
operaciones al cursor.

                              Clases y Objetos                199
  Lista “activa”
Invariante de representación
      0<=index; index <=count+1;
      before = (index=0);
      after = (index=count+1);
      empty = (count = 0);
      is_first = ((not empty) and (index=1));
      is _last = ((not empty) and index=count));
      empty implies (before or after)
      not(before and after)
      ….


                              Clases y Objetos     200
  Lista “activa”
Atributos

  count:INTEGER;                       -- número de elementos
  index: INTEGER;             -- posición actual
  active: LINKABLE;           -- nodo actual
  previous: LINKABLE;         -- nodo previo
  zeroth_element: LINKABLE;   -- nodo centinela




                          Clases y Objetos                      201
Uso de una lista “activa”
lista: LINKED_LIST[INTEGER];
m, n: INTEGER;
…
lista.start; lista.search(m);
if not after then lista.put_right(n) end;
…
lista.start; lista.search(m); lista.search(m); lista.search(m)
if not after then lista.remove end;
…
lista.go(i); lista.put_left(m)



                             Clases y Objetos                    202

								
To top