Transferir fondos
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 24 de 70.
Desafío
Fácil¡Tu Banco Digital está casi completo! La última característica importante es la capacidad de transferir dinero entre cuentas. Aquí es donde tu diseño orientado a objetos realmente brilla: un objeto de cuenta puede interactuar directamente con otro objeto de cuenta.
Añadirás un método :transfer(targetAccount, amount) que mueve dinero de una cuenta a otra. Piensa en lo que realmente implica esta operación: es un retiro de la cuenta de origen seguido de un depósito en la cuenta de destino. ¡La belleza es que puedes reutilizar los métodos que ya has construido!
Continúa construyendo sobre tus archivos existentes:
Account.lua: Añade un método:transfer(targetAccount, amount)a tu clase Account. Este método debe intentar retirar el monto deselfy, si tiene éxito, depositar ese monto en latargetAccount. Si el retiro falla (fondos insuficientes), la transferencia no debe realizarse. Mantén toda tu funcionalidad existente (constructor con ID, deposit, withdraw, getBalance y __tostring).main.lua: Crea múltiples cuentas y demuestra transferencias entre ellas, mostrando cómo cambian los saldos a través de diferentes objetos de cuenta.
Recibirás cinco entradas:
- ID de la primera cuenta
- ID de la segunda cuenta
- Depósito inicial en la primera cuenta
- Monto de la primera transferencia (de la cuenta 1 a la cuenta 2)
- Monto de la segunda transferencia (de la cuenta 1 a la cuenta 2)
En tu archivo principal, crea dos cuentas con los IDs proporcionados (ambas comenzando con saldo 0), deposita el monto inicial en la primera cuenta, luego intenta ambas transferencias de la primera cuenta a la segunda. Después de cada intento de transferencia, imprime ambas cuentas (el __tostring mostrará su estado actual).
Por ejemplo, si las entradas son 101, 102, 500, 200 y 400, la salida debería ser:
Account [101]: Balance = 300
Account [102]: Balance = 200
Insufficient funds
Account [101]: Balance = 300
Account [102]: Balance = 200La primera cuenta comienza con 500 después del depósito. La primera transferencia de 200 tiene éxito, dejando a la cuenta 101 con 300 y a la cuenta 102 con 200. La segunda transferencia de 400 falla porque la cuenta 101 solo tiene 300, por lo que ambos saldos permanecen sin cambios.
Pruébalo tú mismo
-- Requerir el módulo Account
local Account = require('Account')
-- Leer las cinco entradas
local id1 = io.read()
local id2 = io.read()
local initialDeposit = tonumber(io.read())
local transfer1 = tonumber(io.read())
local transfer2 = tonumber(io.read())
-- Crear dos cuentas con IDs
local account1 = Account:new(id1)
local account2 = Account:new(id2)
-- Depositar el monto inicial en la primera cuenta
account1:deposit(initialDeposit)
-- TODO: Intentar la primera transferencia de account1 a account2
-- TODO: Imprimir ambas cuentas después de la primera transferencia
-- TODO: Intentar la segunda transferencia de account1 a account2
-- TODO: Imprimir ambas cuentas después de la segunda transferencia
Todas las lecciones de Object Oriented Programming
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formas