Кеша уже неплохо приноровился в джаваскрипте, вместе с вами он изучил много конструкций и возможностей языка. И вот, наконец, после нескольких собеседований Иннокентий устроился на свою первую работу в один знаменитый зеленый банк.
Отдел, где работает Кеша занимается банкоматами. Зеленый банк идет в ногу со временем и хотят переписать устаревшее программное обеспечение для своих банкоматов, чтобы оно не тормозило и радовало их клиентов.
Как раз эта задача и стала первой для нашего товарища. Кеша ещё проходит стажировку, но очень хотел бы остаться после испытательного срока. Сами понимаете, Кеше надо заниматься фотографиями и развитием своего сайта, поэтому у него совсем не остаётся времени на работу. Помогите Кеше справиться с его первой рабочей задачей, чтобы у него были шансы попасть в штат сотрудников и носить гордое звание программиста.
Прежде чем заняться банкоматом вам потребуется реализовать функцию createClient
, которая должна возвращать объект клиента банка. Принимать она должна 2 аргумента:
-
name
– строка, содержащая имя клиента; -
balance
– базовый баланс клиента на карте (по умолчанию0
);
Функция createClient
должна возвращать объект с 2 полями:
-
name
– строковое поле, содержащее имя клиента. Инициализируется значением аргументаname
; -
balance
– числовое значение, инициализируется аргументомbalance
;
Обычно, банкоматы связаны с банками, которые их устанавливают, поэтому, чтобы банкомат полноценно функционировал, вам предстоит реализовать функцию createBank
, которая будет возвращать объект банка. Функция createBank
должна принимать 2 аргумента:
-
bankName
– название банка; -
clients
– массив объектов, которые порождает функцияcreateClient
.
Функция createBank
должна возвращать объект с 2 полями и 2 методами:
-
bankName
– строковое поле, содержащее название банка, инициализируется значением аргументаbankName
; -
clients
– список клиентов банка (по умолчанию[]
); -
addClient
– метод, который добавляет объект из функцииcreateClient
в список клиентов банка; -
removeClient
– метод, который удаляет объект из функцииcreateClient
из списка клиентов банка.
Методы addClient
и removeClient
должны возвращать true
в случае успеха проведенной операции, а в ином случае – порождать ошибку.
❗Обратите внимание: добавить можно только того клиента, которого еще нет в списке клиентов, а удалить только того, который там присутствует.
Положим, что каждый банкомат имеет хранилище купюр - объект, в котором ключ – номинал купюры, а значение их количество.
Самое интересное – реализовать функцию createBankomat
. Функция createBankomat
должна принимать 2 аргумента:
notesRepository
– объект хранилища купюр;bank
– объект из функцииcreateBank
.
Функция createBankomat
должна возвращать объект с 3 полями и 4 методами:
-
bank
– поле, содержащие объект банка, к которому привязан банкомат. Инициализируется значением аргументаbank
; -
notesRepository
– поле, содержащие объект хранилища купюр. Инициализируется значением аргументаnotesRepository
; -
currentClient
– поле, содержащие объект из функцииcreateClient
. Указывает, какой пользователь в данный момент работает с банкоматом. По умолчаниюundefined
. -
setClient
– принимает объект из функцииcreateClient
и устанавливает это значение в полеcurrentClient
; -
removeClient
– устанавливает значение изcurrentClient
вundefined
; ❗Обратите внимание- Работать с банкоматом может только клиент банка, к которому привязан этот банкомат. При попытке работы с клиентом не из этого банка, порождайте ошибку;
- Единовременно работать с банкоматом может только один клиент, поэтому установить нового клиента, пока там есть другой невозможно. Порождайте при такой попытке ошибку;
- Методы
setClient
иremoveClient
должны возвращатьtrue
в случае успеха проведенной операции.
-
addMoney
– метод, который должен принимать объекты, где ключ – номинал купюры, а значения их количества. Метод должен добавлять принятые купюры в свое хранилище, а получившуюся сумму зачислять на баланс клиента.❗Обратите внимание: метод
addMoney
должен иметь возможность множественного вызова и неограниченное число аргументов. Т.е. в результате такого вызова метода:addMoney({ 10: 2 })({ 50: 1, 10: 1 })({ 10: 3 }, { 100: 1 });
хранилище банкомата должно выглядеть следующим образом:
{ 5000: 0, 2000: 0, 1000: 0, 500: 0, 200: 0, 100: 1, 50: 1, 10: 6, }
а сумма, зачисленная пользователю должна составить
210
-
giveMoney
– метод, который должен принимать число – сумму, которую надо выдать клиенту купюрами. Функция должна вернуть объект, который в качестве ключей будет иметь номинал купюр, а в качестве значения их кол-во. Сумма купюр в таком объекте должна быть равна переданному в объект числу. После выдачи денег, их сумма должна быть списана с баланса клиента.❗Обратите внимание:
-
Метод
giveMoney
должен выдавать купюры оптимально! Это значит, что из банкомата должно выдаваться наименьшее кол-во купюр, требуемых для формирования суммы; -
Метод
giveMoney
не может выдать сумму, которая больше баланса клиента. В таком случае порождайте ошибку; -
Метод
giveMoney
может не сформировать сумму, которую требуется выдать по причине нехватки нужных купюр. В таком случае порождайте ошибку; -
Метод
giveMoney
может выдать сумму только кратную 10. В ином случае порождайте ошибку; -
Методы
addMoney
иgiveMoney
могут работать только тогда, когда с банкоматом взаимодействует клиент. В ином случае порождайте ошибку.
-
❗Обратите внимание: для проверки задачи будут использоваться только купюры, утвержденные Банком России, кроме пятирублёвой.
const greenBankNotesRepository = {
5000: 2,
2000: 3,
1000: 13,
500: 20,
200: 10,
100: 5,
50: 2,
10: 5,
};
const greenBank = createBank('GREENBANK');
/**
* {
* bankName: 'GREENBANK',
* clients: [],
* ...
* }
*/
const greenBankBankomat = createBankomat(greenBankNotesRepository, greenBank);
/**
* {
* notesRepository: greenBankNotesRepository,
* bank: greenBank,
* ...
* }
*/
const clientVasiliy = createClient('Василий', 2500);
/**
* {
* name: 'Василий',
* balance: 2500,
* }
*/
greenBank.addClient(clientVasiliy); // true
greenBank.addClient(clientVasiliy); // Error
greenBankBankomat.setClient(clientVasiliy); // true
greenBankBankomat.giveMoney(1000);
/**
* {
* 1000: 1,
* }
*/
greenBankBankomat.removeClient() // true
Не пугайтесь, задача только выглядит большой 😁
Вы обязательно справитесь!