7507_04_polimorfismo
-
Upload
angel-aberbach -
Category
Documents
-
view
213 -
download
0
description
Transcript of 7507_04_polimorfismo
![Page 2: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/2.jpg)
Definimos
Encapsulamiento: cada objeto es responsable de responder a los mensajes que recibe, sin que quien le envía el mensaje tenga que
2c20152
que quien le envía el mensaje tenga que saber cómo lo hace
Polimorfismo: capacidad de respuesta que tienen distintos objetos de responder de maneras diferentes a un mismo mensaje
Hay consecuencias…
![Page 3: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/3.jpg)
Polimorfismo y refactorización
![Page 4: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/4.jpg)
Polimorfismo en general
Los lenguajes de comprobación estática: vinculación tardía e interfaces
Refactorización
2c20154
Refactorización
TDD completo
![Page 5: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/5.jpg)
Capacidad que tienen distintos objetos de responder de maneras diferentes a un mismo mensaje
celda >> contiene(7)celda >> contiene(7)
fila >> contiene(7)
cajaAhorro >> extraer(100)
cuentaCorriente >> extraer(100)
![Page 6: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/6.jpg)
Distintos objetos responden de maneras diferentes a la llegada de un mensaje, basándose en la clase de la cual son instancias
cajaAhorro extraer: 100.
cuentaCorriente extraer: 100.
![Page 7: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/7.jpg)
var celdaLibre = {
contiene : function (valor) {
return false;
}
}}
var celdaOcupada = {
contiene : function (valor) {
return (this.numero == valor);
}
}
¿Sólo en JavaScript? ¿Y en lenguajes con clases?
![Page 8: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/8.jpg)
Ajedrez: cada tipo de pieza tiene un comportamiento distinto
=> Implementación obvia (?)
Coronación: ¿qué ocurre?
Posible interpretación: un objeto cambia de clase
2c20158
Posible interpretación: un objeto cambia de clase (su comportamiento varía luego de un cambio de estado)
… hay otros planteos: no es el mismo objeto
Quedémonos con el inicial: ¿puede un objeto cambiar su clase?
![Page 9: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/9.jpg)
2c20159
Coronación: estado = new Reina ( );
![Page 10: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/10.jpg)
Hemos encapsulado un método (movimientoLegal) en un objeto
Podemos tratar a los métodos como objetos
En Smalltalk todo es un objeto
2c201510
En Smalltalk todo es un objeto
En C# hay “delegados”
¿Es lo mismo del polimorfismo extremo de JavaScript?
Es una solución típica
Se lo conoce como el “patrón de diseño State”
Ya volveremos…
![Page 11: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/11.jpg)
![Page 12: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/12.jpg)
Se plantea que el polimorfismo funciona porque la decisión del método a invocar se toma en tiempo de ejecución y no antes
Tiene sentido en lenguajes de comprobación estática
Tiene sentido en lenguajes de comprobación estática
cajaAhorro.extraer(100);
cuentaCorriente.extraer(100);
En Java se da por defecto
Si no lo queremos, poner final al método
En C++ y C# se declaran métodos virtuales
![Page 13: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/13.jpg)
Collection <Cuenta> cuentas = new ArrayList<Cuenta> ( );
...
for (Cuenta c : cuentas)for (Cuenta c : cuentas)
c.extraer(100);
Compilador verifica que la clase de c tenga un método extraer
Tiene sentido en lenguajes de comprobación estática
![Page 14: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/14.jpg)
![Page 15: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/15.jpg)
![Page 16: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/16.jpg)
¿Por qué contraponemos el uso de “if” al polimorfismo?
¿Para qué querríamos polimorfismo sin herencia?
¿Polimorfismo es sinónimo de vinculación ¿Polimorfismo es sinónimo de vinculación tardía?
![Page 17: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/17.jpg)
public void depositar(int monto) {…for (Notificable e : entidadesNotificar)
e.notificarDeposito(monto);}
¿Qué quiere decir <<interface>>?
![Page 18: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/18.jpg)
Como mecanismo necesario para el polimorfismo sin herencia
2c201518
![Page 19: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/19.jpg)
Son como clases
Abstractas
Con todos los métodos abstractos
Sin atributos (sin estado)
Ejemplo
2c201519
Ejemplo
public interface Notificable {
/*public abstract*/ void notificarDeposito();
}
Pueden heredar de otras interfaces
public interface RecibeMails extends Notificable {
void enviarMail();
}
![Page 20: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/20.jpg)
Usopublic class OficialCuenta extends Empleado
implements Notificable {
...
}
2c201520
CorolarioSi una clase declara implementar una interfaz y no
implementa (redefine) uno de sus métodos es abstracta
![Page 21: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/21.jpg)
Son grupos de métodos sin implementar
Una clase puede implementar variasOjo con los conflictos de nombres
2c201521
![Page 22: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/22.jpg)
Cada objeto puede tener muchas “caras”, según el tipo con el que se lo accede
Fecha f = new Fecha(20,6,1964);
Imprimible i = f;
Comparable c = f;
Serializable s = f;
2c201522
Serializable s = f;
Todos se refieren al mismo objeto
Pero “lo ven” distinto
Cada variable sólo puede usar los métodos de su interfaz
Ojo: ¡sólo puedo instanciar clases!
![Page 23: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/23.jpg)
El tipo de la variable define la interfaz que puedo usar
Fecha f = new Fecha(20,6,1964);
2c201523
Imprimible i = f;
Comparable c = f;
i.imprimir();
c.compareTo(c2);
f.imprimir();
f.compareTo(f2);
…
![Page 24: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/24.jpg)
Visión de lenguaje
Una clase “muy abstracta” que se puede usar para herencia múltiple
Visión desde el uso
Un tipo de datos que permite que ver a un mismo
2c201524
Un tipo de datos que permite que ver a un mismo objeto con distintos tipos
=> Cada tipo implica un comportamiento
![Page 25: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/25.jpg)
![Page 26: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/26.jpg)
¿Para qué sirven las interfaces? (por ahora…)
¿Por qué no hay interfaces en Smalltalk?
![Page 27: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/27.jpg)
2c201527
![Page 28: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/28.jpg)
Todo código va empeorando su calidad con el tiempo
=> entropía, degradación
2c201528
Refactorizaciones
Mejorar código, haciéndolo más comprensible
Sin cambiar funcionalidad
![Page 29: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/29.jpg)
“Refactoring”
Mejorar el código ya escrito
¿Cómo?
2c201529
Modificar estructura interna
Sin modificar comportamiento observable
Ejemplos:
Eliminar código duplicado
Introducir polimorfismo
![Page 30: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/30.jpg)
Mejorar código, haciéndolo más comprensible
Para modificaciones
Para depuraciones
Para optimizaciones
2c201530
Mantener alta la calidad del código
Si no, se degrada
A la larga, aumenta la productividad
![Page 31: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/31.jpg)
Actitud constante
Consecuencia de revisiones de código
Antes de modificar código existente
Después de incorporar funcionalidad
2c201531
Después de incorporar funcionalidad
Antes de optimizar
Ojo: optimizar ≠ refactorizar
Durante depuraciones
![Page 32: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/32.jpg)
Riesgo alto
Máxima: “Si funciona, no lo arregle”
2c201532
Un paso por vez
Pruebas automatizadas
Escribirlas antes de refactorizar
Y correrlas luego de cada pequeño cambio
![Page 33: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/33.jpg)
“Bad smells in code” (malos olores), los llama
Fowler
Son indicadores de que algo está mal, y se
solucionan con refactorizaciones
2c201533
solucionan con refactorizaciones
Hay catálogos
Smalltalk desde los inicios
Java: lenguaje habitual
![Page 34: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/34.jpg)
CajaAhorro >> extraer(monto)
if (monto <= 0)
throw new MontoInvalido();
if (monto > this.getSaldo())
throw new SaldoInsuficiente();throw new SaldoInsuficiente();
this.saldo -= monto;
CuentaCorriente >> extraer(monto)
if (monto <= 0)
throw new MontoInvalido();
if (monto > this.getSaldo() + this.descubierto)
throw new SaldoInsuficiente();
this.saldo -= monto;
![Page 35: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/35.jpg)
Test-Driven Development =
Test-First +
Automatización +
RefactorizaciónRefactorización
![Page 36: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/36.jpg)
![Page 37: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/37.jpg)
¿Para qué refactorizamos?
¿Por qué no hacemos varias refactorizaciones seguidas?
¿Qué relación hay entre TDD y refactorización?¿Qué relación hay entre TDD y refactorización?
![Page 38: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/38.jpg)
Polimorfismo = distintos comportamientos para un mismo mensaje
Polimorfismo seguro y sin herencia: interfaces
Manejar la entropía => refactorización
2c201538
Manejar la entropía => refactorización
![Page 39: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/39.jpg)
“Replace Conditional with Polymorphism”
https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism
“Continuous Integration”, de Martin Fowler
2c201539
“Continuous Integration”, de Martin Fowlerhttp://www.martinfowler.com/articles/continuousIntegration.html
![Page 40: 7507_04_polimorfismo](https://reader034.fdocuments.mx/reader034/viewer/2022051820/563db7dd550346aa9a8eb17c/html5/thumbnails/40.jpg)
Profundización
UML
Excepciones
Otros
2c201540
Otros
Repaso pre-parcial
Parcial