Menu
Coddy logo textTech

System bankowy

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 108 z 110.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system bankowy modelujący rzeczywiste operacje finansowe z wykorzystaniem zasad OOP, które opanowałeś(-aś) w trakcie tego kursu. Utworzysz konta z różnymi zasadami, będziesz śledzić transakcje i zarządzać klientami — wszystko uporządkowane w wielu plikach.

Twój system bankowy będzie uporządkowany w sześciu plikach:

  • transaction.dart: Utwórz klasę Transaction, która reprezentuje niezmienny zapis operacji finansowej. Każda transakcja ma pola final: type (String — "deposit", "withdrawal" lub "transfer"), amount (double) i timestamp (DateTime). Nadpisz toString(), aby zwracała [type] $amount.
  • account.dart: Utwórz abstrakcyjną klasę Account z prywatnym polem _balance (double), numerem konta final (accountNumber — String) oraz elementem List<Transaction> do przechowywania historii transakcji. Dodaj getter salda, chroniony setter set balance(double value), aby podklasy w innych plikach mogły aktualizować saldo, abstrakcyjną metodę bool canWithdraw(double amount), którą implementują podklasy, oraz następujące metody konkretne:
    • deposit(double amount) — dodaje środki do salda, zapisuje transakcję i wyświetla Deposited $amount. Balance: $balance
    • withdraw(double amount) — jeśli canWithdraw() zwraca true, odejmuje środki od salda, zapisuje transakcję i wyświetla Withdrew $amount. Balance: $balance. W przeciwnym razie wyświetla Withdrawal denied.
    • getTransactionCount() — zwraca liczbę transakcji
  • savings_account.dart: Utwórz klasę SavingsAccount rozszerzającą klasę Account. Konta oszczędnościowe mają limit wypłat — nie można wypłacić więcej niż 500 USD w ramach jednej transakcji. Zaimplementuj canWithdraw(), aby egzekwować tę zasadę (upewnij się też, że saldo jest wystarczające). Dodaj metodę applyInterest(double rate), która zwiększa saldo o podany procent, używając gettera i settera balance, a następnie wyświetla Interest applied. Balance: $balance.
  • checking_account.dart: Utwórz klasę CheckingAccount rozszerzającą klasę Account. Konta bieżące mają ochronę przed debetem do 100 USD — ich saldo może być ujemne, ale nie niższe niż -100 USD. Zaimplementuj canWithdraw(), aby umożliwiała wypłaty, o ile wynikowe saldo pozostaje na poziomie co najmniej -100 USD.
  • customer.dart: Utwórz klasę Customer z polami id (String), name (String) oraz elementem List<Account> przechowującym konta klienta. Dodaj metody addAccount(Account account), która dodaje konto, oraz getTotalBalance(), która zwraca sumę sald wszystkich kont. Nadpisz toString(), aby zwracała Customer: name (X accounts).
  • main.dart: Zademonstruj działanie systemu bankowego. Utwórz klienta (C001, John Smith). Utwórz konto SavingsAccount (SAV001, saldo początkowe 1000 USD) oraz konto CheckingAccount (CHK001, saldo początkowe 500 USD). Dodaj oba konta do klienta i wyświetl klienta. Następnie wykonaj te operacje:
    1. Wpłać 200 USD na konto oszczędnościowe
    2. Wypłać 300 USD z konta oszczędnościowego (powinno się udać)
    3. Spróbuj wypłacić 600 USD z konta oszczędnościowego (wypłata powinna zostać odrzucona — przekracza limit)
    4. Dodaj 5% odsetek do konta oszczędnościowego
    5. Wypłać 550 USD z konta bieżącego (powinno się udać dzięki ochronie przed debetem)
    6. Spróbuj wypłacić kolejne 100 USD z konta bieżącego (wypłata powinna zostać odrzucona — przekroczyłaby limit debetu)
    Na koniec wyświetl Savings transactions: X oraz Total balance: $Y (sformatowane do 2 miejsc po przecinku).

Oczekiwany wynik:

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

Spróbuj swoich sił

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

void main() {
  // TODO: Utwórz klienta o identyfikatorze "C001" i imieniu i nazwisku "John Smith"
  
  // TODO: Utwórz SavingsAccount z accountNumber "SAV001" i saldem początkowym $1000
  
  // TODO: Utwórz CheckingAccount z accountNumber "CHK001" i saldem początkowym $500
  
  // TODO: Dodaj oba konta do klienta
  
  // TODO: Wyświetl dane klienta
  
  // TODO: Wykonaj następujące operacje:
  // 1. Wpłać $200 na konto oszczędnościowe
  // 2. Wypłać $300 z konta oszczędnościowego (operacja powinna się powieść)
  // 3. Spróbuj wypłacić $600 z konta oszczędnościowego (operacja powinna zostać odrzucona — przekracza limit)
  // 4. Nalicz 5% odsetek na koncie oszczędnościowym
  // 5. Wypłać $550 z konta bieżącego (operacja powinna się powieść dzięki debetowi)
  // 6. Spróbuj wypłacić kolejne $100 z konta bieżącego (operacja powinna zostać odrzucona — przekroczyłaby limit debetu)
  
  // TODO: Wypisz "Savings transactions: X", gdzie X oznacza liczbę transakcji
  
  // TODO: Wypisz "Total balance: \$Y", gdzie Y jest sformatowane do 2 miejsc po przecinku
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online