Segundo Parcial del 10/12/18

De Cuba-Wiki

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:

  1. 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
  2. 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
  3. 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)
  4. fastTransfer: anAmount from: aSourceWalletId to: aTargetWalletId → Hace una transferencia rápida (más adelante el detalle de qué significa)
  5. 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.
  6. 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 = {}

Solución provista por la cátedra

Descargar posible solución al ejercicio práctico