Segundo Parcial del 10/12/18
Preguntas teóricas
- a) ¿TDD implica buen diseño? Justifique b) TDD suele implicar un diseño menos acoplados, ¿por qué?
- ¿Cuáles son los pasos de TDD?. Explique además qué se espera de cada paso y qué características tiene.
- a) ¿Qué representan los contratos entre objetos? b) Los contratos están compuesto por tres partes. Nombre, describa y explique cómo/en donde se implementa cada uno
- Explique ventajas y desventajas de un proxy polimórfico y no polimórfico
- Cuando se desarrolla un modelo que se comunica con servicios externos a través de interfaces, ¿cuándo conviene simular la parte interna de la interface y cuando la parte externa de la interface? ¿por qué?
Ejercicio práctico
Consigna
Los invitaron a trabajar en una startup que tiene por objetivo llegar a ser una fintech, o sea una especie de banco digital.
El primer servicio a implementar es una criptomoneda que se llamará ISW1COIN
Para poder operar con dicha criptomoneda, la fintech ofrecerá los siguientes servicios:
- createWallet → Crea una billetera virtual y devuelve el id de dicha billetera. Las billeteras se crean con un balance inicial de 1 ISW1COIN. Se devuelve el id de la billetera y no la billetera para que no se pueda acceder a las mismas por fuera de la fintech
- balanceOf: aWalletId → Devuelve la balance actual de la billetera identificada con el id pasado. Por ejemplo luego de crear una billetera #balanceOf: deberia devolver 1*ISW1COIN
- slowTransfer: anAmount from: aSourceWalletId to: aTargetWalletId → Hace una transferencia lenta desde la billetera identificada por aSourceWalletId a aquella identificada por aTargetWalletId (más adelante el detalle de qué significa)
- fastTransfer: anAmount from: aSourceWalletId to: aTargetWalletId → Hace una transferencia rápida (más adelante el detalle de qué significa)
- allTransactionsOf: aWalletId → Devuelve los depósitos y extracciones por transferencia registrados en la billetera identificada con aWalletId. Debido a que las transacciones son inmutable, no hay problema en devolver dichos objetos.
- allPendingTransactionsOf: aWalletId → Devuelve las extracciones por transferencias que aún están pendientes, o sea que están registradas pero aún no pueden afectar el balance puesto que no llegó la hora de acreditación.
Las transferencia se realizan entre billeteras. la unidad mínima es 0.000001*ISW1COIN
Toda billetera nueva se crea con un saldo inicial de 1*ISW1COIN y con un id único.
Cuando la transferencia es slow (lenta), se cobra un comisión del 2% y la misma tarda 1 hora en acreditarse en la billetera destino.
Cuando la transferencia es fast (rápida), se cobra un comisión del 4% y la misma tarda 10 minutos en acreditarse en la billetera destino.
Para ambos casos, la comisión se cobra de la billetera origen y se debita el monto de ella inmediatamente al registrarse la transferencia. Durante el tiempo de transferencia el monto transferido se encuentra “en tránsito”. A la billetera destino se le acredita el monto transferido, o sea que no le llega el monto menos la comisión.
Para esta primera versión las transferencias no se pueden abortar, las billeteras no pueden tener balance negativo y aquellas transferencias que impacten en la billetera destino entre las 23 hrs y las 23:59:59 hrs serán rechazadas (queremos reservarnos esa ventana de tiempo por si hay que arreglar cosas)
Ayudas:
- Para crear una unidad que represente un ISW1COIN hacer:
BaseUnit named: 'ISW1COIN'
- Recordar que la igualdad de unidad es la identidad, o sea hay que mantener un único objeto para esa moneda. No usen un objeto global para hacerlo a menos que se inicialice correctamente cuando se haga el file-in de la solución.
- Para simular el paso del tiempo pueden usar la solución usada en TusLibros
- Para modelar la transferencia, pueden usar el diseño visto en PortfolioTreePrinter sobre transferencias, pero verán que la implementación no es exactamente igual
Requerimientos:
- La categoría de clases se debe llamar ISW1-Fintech
- Usar TDD para realizar la solucion.
- Usar las heurísticas de diseño vistas durante todo el cuatrimestre.
- Entregar el fileout de dicha categoría que debe incluir todo (modelo y tests)
- Entregar también el archivo que se llama CuisUniversity-nnnn.user.changes
- Probar que el archivo generado en 2) se cargue correctamente en una imagen “limpia” (o sea, sin la solución) y que todo funcione correctamente. Esto es fundamental para que no haya problemas de que falten clases/métodos en la entrega
- Realizar la entrega enviando mail a la lista de Docentes: [email protected] con el Subject: LU nnn/aa - Solucion segundo parcial 2c2018
- No irse sin que un docente les asegure haber recibido el mail.
Ejemplos:
Saldo inicial Billetera A = 1*ISW1COIN
Saldo inicial Billetera B = 1*ISW1COIN
18:00 hs
Acción: Billetera A transfiere 0.1*ISW1COIN mediante operación lenta (tarda 1 hora)
Saldo Billetera A = (1*ISW1COIN) - (0.1*ISW1COIN) - (0.02 * 0.1)*ISW1COIN) = 0.898*ISW1COIN
Saldo Billetera B = 1*ISW1COIN
Todas las Transacciones de Billetera A = { Extracción por transferencia hecha a las 18 hrs por 0.1*ISW1COIN con comisión de 0.02 * 0.1*ISW1COIN }
Todas las Transacciones de Billetera B = { Depósito por transferencia hecha a las 18 hrs por 0.1*ISW1COIN }
Transacciones pendientes de Billetera A = {}.
Transacciones pendientes de Billetera B = { Depósito por transferencia hecha a las 18 hrs por 0.1*ISW1COIN }
19:00 hs
Saldo Billetera A = (1*ISW1COIN) - (0.1*ISW1COIN) - (0.02 * 0.1)*ISW1COIN) = 0.898*ISW1COIN
Saldo Billetera B = (1 + 0.1)*ISW1COIN = 1.1*ISW1COIN
Todas las Transacciones de Billetera A = { Extracción por transferencia hecha a las 18 hrs por 0.1*ISW1COIN con comisión de 0.02 * 0.1*ISW1COIN }
Todas las Transacciones de Billetera B = { Depósito por transferencia hecha a las 18 hrs por 0.1*ISW1COIN }
Transacciones pendientes de Billetera A = {}.
Transacciones pendientes de Billetera B = {}