Menu
Coddy logo textTech

Sistema bancario

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 108 di 110.

challenge icon

Sfida

Facile

Costruiamo un sistema bancario che modelli operazioni finanziarie del mondo reale usando i principi OOP che hai imparato durante questo corso. Creerai conti con regole diverse, registrerai le transazioni e gestirai i clienti, il tutto organizzato in più file.

Il tuo sistema bancario sarà organizzato in sei file:

  • transaction.dart: crea una classe Transaction che rappresenti un record immutabile di un'operazione finanziaria. Ogni transazione ha campi final per type (String - "deposit", "withdrawal" o "transfer"), amount (double) e timestamp (DateTime). Esegui l'override di toString() in modo che restituisca [type] $amount.
  • account.dart: crea una classe astratta Account con un campo privato _balance (double), un numero di conto final (accountNumber - String) e una List<Transaction> per memorizzare la cronologia delle transazioni. Includi un getter per il saldo, un setter protetto set balance(double value) affinché le sottoclassi in altri file possano aggiornare il saldo, un metodo astratto bool canWithdraw(double amount) che le sottoclassi implementeranno e questi metodi concreti:
    • deposit(double amount) - aggiunge l'importo al saldo, registra una transazione e stampa Deposited $amount. Balance: $balance
    • withdraw(double amount) - se canWithdraw() restituisce true, sottrae l'importo dal saldo, registra una transazione e stampa Withdrew $amount. Balance: $balance. Altrimenti stampa Withdrawal denied.
    • getTransactionCount() - restituisce il numero di transazioni
  • savings_account.dart: crea una SavingsAccount che estende Account. I conti di risparmio hanno un limite di prelievo: non possono prelevare più di $500 in una singola transazione. Implementa canWithdraw() per applicare questa regola (assicurandoti anche che il saldo sia sufficiente). Aggiungi un metodo applyInterest(double rate) che aumenti il saldo della percentuale indicata usando il getter e il setter balance, quindi stampi Interest applied. Balance: $balance.
  • checking_account.dart: crea una CheckingAccount che estende Account. I conti correnti hanno una protezione dagli scoperti fino a $100: il saldo può diventare negativo, ma non scendere sotto -$100. Implementa canWithdraw() per consentire i prelievi purché il saldo risultante rimanga pari o superiore a -$100.
  • customer.dart: crea una classe Customer con un id (String), un name (String) e una List<Account> per i conti del cliente. Includi i metodi addAccount(Account account) per aggiungere un conto e getTotalBalance() che restituisce la somma dei saldi di tutti i conti. Esegui l'override di toString() in modo che restituisca Customer: name (X accounts).
  • main.dart: mostra il funzionamento del sistema bancario. Crea un cliente (C001, John Smith). Crea una SavingsAccount (SAV001, saldo iniziale $1000) e una CheckingAccount (CHK001, saldo iniziale $500). Aggiungi entrambi i conti al cliente e stampa il cliente. Poi esegui queste operazioni:
    1. Deposita $200 sul conto di risparmio
    2. Preleva $300 dal conto di risparmio (dovrebbe riuscire)
    3. Prova a prelevare $600 dal conto di risparmio (il prelievo dovrebbe essere rifiutato: supera il limite)
    4. Applica un interesse del 5% al conto di risparmio
    5. Preleva $550 dal conto corrente (dovrebbe riuscire grazie allo scoperto)
    6. Prova a prelevare altri $100 dal conto corrente (il prelievo dovrebbe essere rifiutato: supererebbe il limite di scoperto)
    Infine, stampa Savings transactions: X e Total balance: $Y (formattato con 2 cifre decimali).

Output previsto:

Customer: John Smith (2 accounts)
Deposited $200.0. Balance: $1200.0
Withdrew $300.0. Balance: $900.0
Withdrawal denied
Interest applied. Balance: $945.0
Withdrew $550.0. Balance: $-50.0
Withdrawal denied
Savings transactions: 3
Total balance: $895.00

Provalo tu

import 'transaction.dart';
import 'account.dart';
import 'savings_account.dart';
import 'checking_account.dart';
import 'customer.dart';

void main() {
  // TODO: Crea un cliente con id "C001" e nome "John Smith"
  
  // TODO: Crea un SavingsAccount con accountNumber "SAV001" e saldo iniziale di $1000
  
  // TODO: Crea un CheckingAccount con accountNumber "CHK001" e saldo iniziale di $500
  
  // TODO: Aggiungi entrambi i conti al cliente
  
  // TODO: Stampa il cliente
  
  // TODO: Esegui le seguenti operazioni:
  // 1. Deposita $200 sul conto di risparmio
  // 2. Preleva $300 dal conto di risparmio (l'operazione dovrebbe riuscire)
  // 3. Prova a prelevare $600 dal conto di risparmio (l'operazione dovrebbe essere rifiutata perché supera il limite)
  // 4. Applica un interesse del 5% al conto di risparmio
  // 5. Preleva $550 dal conto corrente (l'operazione dovrebbe riuscire usando lo scoperto)
  // 6. Prova a prelevare altri $100 dal conto corrente (l'operazione dovrebbe essere rifiutata perché supererebbe il limite dello scoperto)
  
  // TODO: Stampa "Savings transactions: X" dove X è il numero di transazioni
  
  // TODO: Stampa "Total balance: \$Y" dove Y è formattato con 2 cifre decimali
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online