Банковская система
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 108 из 110.
Задание
ЛегкоДавайте создадим банковскую систему, которая моделирует реальные финансовые операции, используя принципы ООП, которые вы освоили в этом курсе. Вы создадите счета с различными правилами, будете отслеживать транзакции и управлять клиентами — и все это будет организовано в нескольких файлах.
Ваша банковская система будет организована в шести файлах:
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: $balancewithdraw(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). Добавьте оба счета клиенту и выведите информацию о клиенте. Затем выполните следующие операции:- Внесите $200 на сберегательный счет
- Снимите $300 со сберегательного счета (должно пройти успешно)
- Попробуйте снять $600 со сберегательного счета (должно быть отклонено — превышает лимит)
- Начислите 5% годовых на сберегательный счет
- Снимите $550 с текущего счета (должно пройти успешно с использованием овердрафта)
- Попробуйте снять еще $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 знаков после запятой
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy17Финальные испытания
Платформа онлайн-обученияБанковская системаСистема игровых персонажейСервис аренды транспорта3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий