Банковская книга
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 57 из 57.
Задание
СложноСоздайте небольшой банк с использованием Reference Classes в четырёх файлах. Все определения обёрнуты в suppressMessages(); используйте call. = FALSE в каждом вызове stop().
Account.R: поляid,owner,balance(в начале равен 0).deposit(x)иwithdraw(x)завершаются с ошибкойinvalid amount, когдаxотсутствует или меньше 1;withdraw()завершается с ошибкойinsufficient funds in 2, если баланс станет нижеlowest(), равного 0.month_end()ничего не делает;line()возвращает1 ada checking: -20, используяkind().Checking.R: видchecking; баланс может опускаться до -100.Savings.R: видsavings; не более 2 снятий в месяц (withdrawal limit on 2), учитываются только успешные операции;month_end()добавляет 1% процентов, округляя вниз, и сбрасывает счётчик.Bank.R:open_account(kind, id, owner)(account 2 exists),get_account(id)(no account 9),transfer(from, to, amount), который ничего не меняет, если снятие не удалось,month_end()для каждого счёта иstatement()— строки всех счетов, отсортированные по идентификатору.
Предоставленный код считывает команды open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 или month, выводит ok или сообщение об ошибке для каждой команды, а затем выписку.
Ваш код должен находиться в файлах Account.R, Checking.R, Savings.R и Bank.R. В main.R находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
source("Account.R")
source("Checking.R")
source("Savings.R")
source("Bank.R")
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
bank <- Bank$new()
for (line in input) {
p <- strsplit(line, " ")[[1]]
n <- suppressWarnings(as.numeric(p[-1]))
msg <- tryCatch({
switch(p[1],
open = bank$open_account(p[2], as.numeric(p[3]), p[4]),
dep = bank$get_account(n[1])$deposit(n[2]),
wd = bank$get_account(n[1])$withdraw(n[2]),
tr = bank$transfer(n[1], n[2], n[3]),
month = bank$month_end())
"ok"
}, error = function(e) conditionMessage(e))
cat(line, ": ", msg, "\n", sep = "")
}
for (l in bank$statement()) cat(l, "\n", sep = "")
Все уроки раздела Объектно-ориентированное программирование
1Основы S3
Работа с файламиСписки с классомФункции-конструкторыМетоды print и formatВалидаторы и вспомогательные функцииПовторение — температуры4Инкапсуляция в R
Замыкания как объектыОкружения как объектыФункции доступаЗащита состоянияПовторение — парковочный счётчик7S4 Наследование
Расширение с помощью containscallNextMethodВиртуальные классыПроверка типов с помощью is()Повторение — смотритель зоопарка10Шаблоны проектирования, часть 2
Шаблон «Декоратор»Шаблон «Строитель»Шаблон «Состояние»Шаблон «Итератор»2Обобщённые функции и методы S3
Обобщённые функции и UseMethodМетоды по умолчаниюМетоды для базовых обобщённых функцийОсновы NextMethodПовторение — площади фигур5Классы S4
Определение классов S4Слоты и доступПроверка корректностиМетоды showПовторение — каталог товаров8Ссылочные классы
Определение ссылочных классовМетоды и обновление полейСемантика копированияНаследование и callSuperПовторение — очередь задач11Проект: Управление библиотекой
Книги и читателиВыдача книг3Наследование S3
Векторы классовПорядок поиска методовРасширение с помощью NextMethodПроверка с помощью inherits()Повторение — расчёт зарплаты сотрудниковПотренируйтесь самостоятельно: Онлайн-компилятор R