Skip to content

PCR-JS-2022/JS-3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JS#3

Кеша уже неплохо приноровился в джаваскрипте, вместе с вами он изучил много конструкций и возможностей языка. И вот, наконец, после нескольких собеседований Иннокентий устроился на свою первую работу в один знаменитый зеленый банк.

Отдел, где работает Кеша занимается банкоматами. Зеленый банк идет в ногу со временем и хотят переписать устаревшее программное обеспечение для своих банкоматов, чтобы оно не тормозило и радовало их клиентов.

Как раз эта задача и стала первой для нашего товарища. Кеша ещё проходит стажировку, но очень хотел бы остаться после испытательного срока. Сами понимаете, Кеше надо заниматься фотографиями и развитием своего сайта, поэтому у него совсем не остаётся времени на работу. Помогите Кеше справиться с его первой рабочей задачей, чтобы у него были шансы попасть в штат сотрудников и носить гордое звание программиста.

Прежде чем заняться банкоматом вам потребуется реализовать функцию 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

Не пугайтесь, задача только выглядит большой 😁
Вы обязательно справитесь!

Полезные ссылки:

  1. Работа с ошибками в JS

Releases

No releases published

Packages

No packages published