Sistema bancario
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 85 di 87.
Questa sfida ti chiede di creare un Sistema bancario che modelli operazioni finanziarie del mondo reale utilizzando i principi OOP.
Il tuo sistema dovrebbe gestire diversi tipi di conto, come SavingsAccount e CheckingAccount, entrambi estensioni di una classe base Account. Ogni tipo di conto ha comportamenti specifici: i conti di risparmio potrebbero maturare interessi, mentre i conti correnti potrebbero avere una protezione dallo scoperto.
Pensa a come modellare le transazioni. Un’interfaccia come Transactable potrebbe definire metodi per deposit() e withdraw(). Valuta l’uso di eccezioni personalizzate come InsufficientFundsException per gestire con eleganza le operazioni non valide.
Una classe Bank potrebbe gestire più conti e clienti, dimostrando la composizione. Potresti applicare il pattern Factory per creare diversi tipi di conto oppure usare il pattern Observer per notificare ai clienti le modifiche ai conti.
Concentrati sull’incapsulamento per proteggere i dati sensibili come i saldi e i numeri di conto, e usa il polimorfismo per elaborare in modo uniforme i diversi tipi di conto.
Sfida
FacileCostruiamo un sistema bancario completo che dimostri la tua padronanza dei principi OOP! Creerai un sistema con diversi tipi di conto, gestione delle transazioni e gestione appropriata delle eccezioni: il tutto organizzato in più file.
Organizzerai il codice in sette file:
Transactable.java: crea un'interfaccia che definisce il contratto per le operazioni finanziarie. Dovrebbe dichiarare i metodideposit(double amount)ewithdraw(double amount), entrambi con valore di ritorno booleano per indicare il successo.InsufficientFundsException.java: crea un'eccezione personalizzata che estendeException. Il costruttore dovrebbe accettare l'importo del prelievo tentato e il saldo corrente, creando un messaggio nel formatoInsufficient funds: attempted [amount], available [balance].Account.java: crea una classe base astratta che rappresenti un qualsiasi conto bancario. Includi campi privati peraccountNumber(String) ebalance(double), un costruttore che inizializzi entrambi, getter appropriati, un setter protetto per il saldo (così che le sottoclassi possano modificarlo) e un metodo astrattogetAccountType()che restituisca una String. Implementa un metodogetDetails()che restituisca"[accountNumber] ([accountType]): $[balance]"con il saldo formattato a 2 cifre decimali.SavingsAccount.java: crea una classe che estendaAccounte implementiTransactable. Aggiungi un campo privato perinterestRate(double). Il costruttore accetta accountNumber, saldo iniziale e interestRate. ImplementagetAccountType()in modo che restituisca"Savings". Perdeposit(), aggiungi l'importo al saldo e restituisci true. Perwithdraw(), se l'importo supera il saldo, restituisci false; altrimenti sottrai l'importo e restituisci true. Aggiungi un metodoapplyInterest()che aumenti il saldo dibalance * interestRate(il tasso è memorizzato come frazione, quindi0.05significa 5%).CheckingAccount.java: crea una classe che estendaAccounte implementiTransactable. Aggiungi un campo privato peroverdraftLimit(double). Il costruttore accetta accountNumber, saldo iniziale e overdraftLimit. ImplementagetAccountType()in modo che restituisca"Checking". Perdeposit(), aggiungi l'importo e restituisci true. Perwithdraw(), consenti il prelievo se l'importo è minore o uguale al saldo più overdraftLimit; restituisci false se supera questo limite.Bank.java: crea una classe che gestisca i conti usando un ArrayList. Includi i metodi:addAccount(Account account)- aggiunge un conto alla bancafindAccount(String accountNumber)- restituisce l'Account o null se non viene trovatotransfer(String fromAccount, String toAccount, double amount)- trasferisce denaro tra conti, lanciandoInsufficientFundsExceptionse il conto di origine non dispone di fondi sufficienti. In caso di successo, restituisce"Transferred $[amount] from [fromAccount] to [toAccount]"getTotalDeposits()- restituisce la somma dei saldi di tutti i conti
Main.java: crea il tuo sistema bancario! Riceverai una stringa di comandi separati da virgole:SAVINGS:accountNumber:balance:interestRateCHECKING:accountNumber:balance:overdraftLimitDEPOSIT:accountNumber:amountWITHDRAW:accountNumber:amountTRANSFER:fromAccount:toAccount:amountINTEREST:accountNumber
Elabora ogni comando e stampa:
- SAVINGS/CHECKING:
Account created: [accountNumber] - DEPOSIT:
Deposited $[amount] to [accountNumber] - WITHDRAW:
Withdrew $[amount] from [accountNumber]in caso di successo, oppureWithdrawal failed: [accountNumber] - TRANSFER: stampa il messaggio di successo oppure
Transfer failed: [exception message] - INTEREST:
Interest applied to [accountNumber]
Dopo tutti i comandi, stampa
--- Bank Summary ---seguito dai dettagli di ogni conto (usandogetDetails()) e infineTotal deposits: $[total]formattato a 2 cifre decimali.
Riceverai un input: la stringa di comandi separati da virgole.
Ad esempio, con l'input SAVINGS:SAV001:1000.00:0.05,CHECKING:CHK001:500.00:200.00,DEPOSIT:SAV001:250.00,WITHDRAW:CHK001:600.00,TRANSFER:SAV001:CHK001:100.00,INTEREST:SAV001, il tuo output sarebbe:
Account created: SAV001
Account created: CHK001
Deposited $250.00 to SAV001
Withdrew $600.00 from CHK001
Transferred $100.00 from SAV001 to CHK001
Interest applied to SAV001
--- Bank Summary ---
SAV001 (Savings): $1207.50
CHK001 (Checking): $0.00
Total deposits: $1207.50Nota come il conto corrente consenta il prelievo di $600 nonostante abbia un saldo di soli $500: ecco la protezione dallo scoperto in azione! Il conto di risparmio matura il 5% di interessi sul saldo dopo il trasferimento. Questa sfida combina ereditarietà, interfacce, polimorfismo, eccezioni personalizzate ed incapsulamento in un'applicazione bancaria realistica!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Crea un'istanza di Bank
// TODO: Dividi input in corrispondenza delle virgole per ottenere i singoli comandi
// TODO: Elabora ogni comando:
// - SAVINGS:accountNumber:balance:interestRate -> Crea un SavingsAccount e stampa "Account created: [accountNumber]"
// - CHECKING:accountNumber:balance:overdraftLimit -> Crea un CheckingAccount e stampa "Account created: [accountNumber]"
// - DEPOSIT:accountNumber:amount -> Effettua un deposito e stampa "Deposited $[amount] to [accountNumber]"
// - WITHDRAW:accountNumber:amount -> Effettua un prelievo e stampa la conferma o "Withdrawal failed: [accountNumber]"
// - TRANSFER:fromAccount:toAccount:amount -> Effettua un trasferimento e stampa la conferma o "Transfer failed: [exception message]"
// - INTEREST:accountNumber -> Applica gli interessi e stampa "Interest applied to [accountNumber]"
// TODO: Dopo tutti i comandi, stampa "--- Bank Summary ---"
// TODO: Stampa i dettagli di ogni conto usando getDetails()
// TODO: Stampa "Total deposits: $[total]" formattato con 2 cifre decimali
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy14Sfide finali
Piattaforma di e-learningSistema bancarioSviluppo del personaggio di un giocoServizio di noleggio veicoli3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online