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

Игра состоит в том, что юзер отвечает на вопросы в консоли пока не ошибется. После трех правильных ответов объявляется победа и игра заканчивается. В пакете есть несколько игр с разными вопросами. В одной, например, угадываешь, четное ли число. В другой ищешь НОД двух чисел.

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

Первое решение, которое пришло в голову — создать в главном файле проекта функцию run-game которая в зависимости от аргументов задает разные вопросы. Аргументы эти получать из модуля отдельной игры some-game.js , импортированного в главный файл. Проблема этого варианта в том, при добавлении в проект модуля с новой игрой, придется каждый раз редактировать основной файл, чтобы импортировать в него новую игру.

Правильное решение заключается в том, чтобы в модуль с игрой импортировать функцию run-game . Называется этот метод «инверсия зависимостей», потому что низкоуровневый модуль тут зависит от высокоуровнего, хотя обычно принято наоборот.