Sistema bancario
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 108 di 110.
Sfida
FacileCostruiamo 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 classeTransactionche rappresenti un record immutabile di un'operazione finanziaria. Ogni transazione ha campifinalpertype(String - "deposit", "withdrawal" o "transfer"),amount(double) etimestamp(DateTime). Esegui l'override ditoString()in modo che restituisca[type] $amount.account.dart: crea una classe astrattaAccountcon un campo privato_balance(double), un numero di contofinal(accountNumber- String) e unaList<Transaction>per memorizzare la cronologia delle transazioni. Includi un getter per il saldo, un setter protettoset balance(double value)affinché le sottoclassi in altri file possano aggiornare il saldo, un metodo astrattobool canWithdraw(double amount)che le sottoclassi implementeranno e questi metodi concreti:deposit(double amount)- aggiunge l'importo al saldo, registra una transazione e stampaDeposited $amount. Balance: $balancewithdraw(double amount)- secanWithdraw()restituisce true, sottrae l'importo dal saldo, registra una transazione e stampaWithdrew $amount. Balance: $balance. Altrimenti stampaWithdrawal denied.getTransactionCount()- restituisce il numero di transazioni
savings_account.dart: crea unaSavingsAccountche estendeAccount. I conti di risparmio hanno un limite di prelievo: non possono prelevare più di $500 in una singola transazione. ImplementacanWithdraw()per applicare questa regola (assicurandoti anche che il saldo sia sufficiente). Aggiungi un metodoapplyInterest(double rate)che aumenti il saldo della percentuale indicata usando il getter e il setterbalance, quindi stampiInterest applied. Balance: $balance.checking_account.dart: crea unaCheckingAccountche estendeAccount. I conti correnti hanno una protezione dagli scoperti fino a $100: il saldo può diventare negativo, ma non scendere sotto -$100. ImplementacanWithdraw()per consentire i prelievi purché il saldo risultante rimanga pari o superiore a -$100.customer.dart: crea una classeCustomercon unid(String), unname(String) e unaList<Account>per i conti del cliente. Includi i metodiaddAccount(Account account)per aggiungere un conto egetTotalBalance()che restituisce la somma dei saldi di tutti i conti. Esegui l'override ditoString()in modo che restituiscaCustomer: name (X accounts).main.dart: mostra il funzionamento del sistema bancario. Crea un cliente (C001,John Smith). Crea unaSavingsAccount(SAV001, saldo iniziale $1000) e unaCheckingAccount(CHK001, saldo iniziale $500). Aggiungi entrambi i conti al cliente e stampa il cliente. Poi esegui queste operazioni:- Deposita $200 sul conto di risparmio
- Preleva $300 dal conto di risparmio (dovrebbe riuscire)
- Prova a prelevare $600 dal conto di risparmio (il prelievo dovrebbe essere rifiutato: supera il limite)
- Applica un interesse del 5% al conto di risparmio
- Preleva $550 dal conto corrente (dovrebbe riuscire grazie allo scoperto)
- Prova a prelevare altri $100 dal conto corrente (il prelievo dovrebbe essere rifiutato: supererebbe il limite di scoperto)
Savings transactions: XeTotal 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.00Provalo 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
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy17Sfide finali
Piattaforma di e-learningSistema bancarioSistema di personaggi di giocoServizio di noleggio veicoli3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online