Треки
/
Scala
Scala
/
Вправи
/
Банківський рахунок
Банківський рахунок

Банківський рахунок

Середня

Вступ

Після років заповнення форм і очікування ми нарешті отримали банківську ліцензію. Це означає, що тепер ми офіційно маємо право відкрити власний банк, ура!

Наш перший пріоритет - запустити IT-системи й налагодити їхню роботу. Після дня наполегливої праці ми вже можемо відкривати і закривати рахунки, а також обробляти зняття коштів і поповнення рахунку.

Оскільки нам не хотілося писати тести, ми запрошуємо кількох друзів допомогти протестувати систему. Однак уже за пʼять хвилин один із наших друзів заявляє, що втратив гроші! Хоча ми впевнені, що наш код без помилок, ми починаємо гортати логи, щоб розібратися.

Атож, саме як ми й підозрювали, винен наш друг! Він поділився своїми тестовими обліковими даними з іншим другом, і разом вони змовилися робити депозити та знімати кошти з одного рахунку паралельно. Хто б таке зробив?

Поки ми доводимо, що фізично неможливо, щоб хтось отримав доступ до свого рахунку паралельно, наш друг самовдоволено повідомляє, що банківські правила вимагають від нас це підтримувати. Отже, без підтримки паралельної роботи з рахунками не буде й сигналу до запуску. Зітхнувши, ми подумки занотовуємо, що завтра над цим треба попрацювати. Це відсуне дату запуску ще щонайменше на один день, але що ж...

Вказівки

Реалізуйте банківські рахунки, які підтримують відкриття/закриття, зняття та внесення грошей.

Оскільки до банківських рахунків можна отримувати доступ багатьма різними способами (через інтернет, мобільні телефони, автоматичні списання), банківське програмне забезпечення має давати змогу безпечно отримувати доступ до рахунків з багатьох потоків/процесів (термінологія залежить від обраної мови програмування) паралельно. Наприклад, багато внесень і знять можуть відбуватися паралельно; забезпечте, щоб не було станів гонки між читанням балансу рахунку та встановленням нового балансу.

Має бути можливість закрити рахунок; операції із закритим рахунком мають завершуватися помилкою.

Ця вправа перевіряє змінний стан, до якого можна безпечно звертатися з кількох потоків. Scala пропонує різні способи захистити змінний стан. Розробникам, знайомим із конкурентністю в Java, Scala дає змогу скористатися підтримкою конкурентності з Java, наприклад блоком synchronized із Java.

Типові пастки

У Scala є два способи досягти змінного стану: використати «var» або змінний обʼєкт. Ось дві типові помилки:

  • Не використовуйте «var», який сам є змінним обʼєктом. Достатньо одного, але не обох разом.
  • Не виставляйте «var» чи змінний обʼєкт назовні. Тож зробіть їх «private» і перетворіть змінний обʼєкт на незмінний, перш ніж повернути його як значення.
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Scala Exercism

Час розпочати Банківський рахунок?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Scala, а також 95 вправ та справжнє наставництво від людей, і все це безкоштовно.