Menu
Coddy logo textTech

Банковская система

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 108 из 110.

challenge icon

Задание

Легко

Давайте создадим банковскую систему, которая моделирует реальные финансовые операции, используя принципы ООП, которые вы освоили в этом курсе. Вы создадите счета с различными правилами, будете отслеживать транзакции и управлять клиентами — и все это будет организовано в нескольких файлах.

Ваша банковская система будет организована в шести файлах:

  • transaction.dart: Создайте класс Transaction, который представляет собой неизменяемую запись о финансовой операции. Каждая транзакция имеет поля final для type (String — "deposit", "withdrawal" или "transfer"), amount (double) и timestamp (DateTime). Переопределите toString(), чтобы он возвращал [type] $amount.
  • account.dart: Создайте абстрактный класс Account с приватным полем _balance (double), final номером счета (accountNumber — String) и List<Transaction> для хранения истории транзакций. Включите геттер для баланса, защищенный сеттер set balance(double value), чтобы подклассы в других файлах могли обновлять баланс, абстрактный метод bool canWithdraw(double amount), который реализуют подклассы, и следующие конкретные методы:
    • deposit(double amount) — увеличивает баланс, записывает транзакцию, выводит Deposited $amount. Balance: $balance
    • withdraw(double amount) — если canWithdraw() возвращает true, вычитает сумму из баланса, записывает транзакцию, выводит Withdrew $amount. Balance: $balance. В противном случае выводит Withdrawal denied.
    • getTransactionCount() — возвращает количество транзакций
  • savings_account.dart: Создайте класс SavingsAccount, который расширяет Account. Сберегательные счета имеют лимит на снятие средств — нельзя снять более $500 за одну транзакцию. Реализуйте canWithdraw() для обеспечения соблюдения этого правила (также проверьте наличие достаточного баланса). Добавьте метод applyInterest(double rate), который увеличивает баланс на заданный процент, используя геттер и сеттер balance, а затем выводит Interest applied. Balance: $balance.
  • checking_account.dart: Создайте класс CheckingAccount, который расширяет Account. Текущие счета имеют защиту от овердрафта до $100 — баланс может стать отрицательным, но не ниже -$100. Реализуйте canWithdraw(), чтобы разрешить снятие средств до тех пор, пока итоговый баланс остается на уровне или выше -$100.
  • customer.dart: Создайте класс Customer с полями id (String), name (String) и List<Account> для их счетов. Включите методы addAccount(Account account) для добавления счета и getTotalBalance(), который возвращает сумму балансов всех счетов. Переопределите toString(), чтобы он возвращал Customer: name (X accounts).
  • main.dart: Продемонстрируйте работу вашей банковской системы. Создайте клиента (C001, John Smith). Создайте SavingsAccount (SAV001, начальный баланс $1000) и CheckingAccount (CHK001, начальный баланс $500). Добавьте оба счета клиенту и выведите информацию о клиенте. Затем выполните следующие операции:
    1. Внесите $200 на сберегательный счет
    2. Снимите $300 со сберегательного счета (должно пройти успешно)
    3. Попробуйте снять $600 со сберегательного счета (должно быть отклонено — превышает лимит)
    4. Начислите 5% годовых на сберегательный счет
    5. Снимите $550 с текущего счета (должно пройти успешно с использованием овердрафта)
    6. Попробуйте снять еще $100 с текущего счета (должно быть отклонено — превысит лимит овердрафта)
    В завершение выведите Savings transactions: X и Total balance: $Y (отформатировано до 2 знаков после запятой).

Ожидаемый вывод:

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.0

Попробуйте сами

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

void main() {
  // TODO: Создайте клиента с id "C001" и именем "John Smith"
  
  // TODO: Создайте SavingsAccount с accountNumber "SAV001" и начальным балансом $1000
  
  // TODO: Создайте CheckingAccount с accountNumber "CHK001" и начальным балансом $500
  
  // TODO: Добавьте оба счета клиенту
  
  // TODO: Выведите клиента
  
  // TODO: Выполните следующие операции:
  // 1. Внесите $200 на сберегательный счет
  // 2. Снимите $300 со сберегательного счета (должно пройти успешно)
  // 3. Попробуйте снять $600 со сберегательного счета (должно быть отклонено — превышает лимит)
  // 4. Начислите 5% процентов на сберегательный счет
  // 5. Снимите $550 с расчетного счета (должно пройти успешно с использованием овердрафта)
  // 6. Попробуйте снять еще $100 с расчетного счета (должно быть отклонено — превысит лимит овердрафта)
  
  // TODO: Выведите "Savings transactions: X", где X — это количество транзакций
  
  // TODO: Выведите "Total balance: \$Y", где Y отформатировано до 2 знаков после запятой
}

Все уроки раздела Объектно-ориентированное программирование