Размер шрифта:
Вопрос №7084 от пользователя Slava в уроке «Инверсия», курс «JS: Программирование, управляемое данными»
Play

Вопрос №7084 от пользователя Slava в уроке «Инверсия», курс «JS: Программирование, управляемое данными»

Поясните, пожалуйста, что делает функция make и зачем она нам.

В задаче инициализация игры происходит в два этапа (т.е., как видите, движок игры (функция run ) обёрнута в две функции):

  • на первом этапе во "внешнюю" функцию-обёртку (именно ту, которую необходимо экспортировать по умолчанию, и, как было условлено, снаружи, в другом модуле, её будут обозначать как make ) передаются два параметра: колода карт и функция, осуществляющая рандомный выбор карты из колоды. В результате эта функция возвращает другую функцию (см. второй этап).
  • на втором этапе в функцию передаются два параметра - имена игроков ( name1 , name2 ). При этом в теле этой функции запускается, собственно, игра (функция run ), в которую передаются аргументы, собранные на этих двух этапах.

Получается, что мы вызываем функцию, которая запускает другую функцию, тогда почему мы не можем запускать сразу run ?

Признаюсь я плаваю в терминологии, "внешняя функция-обертка", "модуль", для меня это довольно не до конца понятные слова.

Получается, что мы вызываем функцию, которая запускает другую функцию

Да, для запуска, собственно, игры (функции run ) надо сделать два вызова.

тогда почему мы не можем запускать сразу run?

можно и так сделать, но в таком случае у игры будет плохой интерфейс. Мы должны иметь возможность предварительно определить для игры колоду карт и функцию рандомного выбора карты из колоды (это первый этап), так же мы должны установить имена игроков (это второй этап). И в данном случае эти этапы не следует смешивать друг с другом в один единственный вызов - для примера представьте, что необходимо будет поменять имена игроков (второй этап), но сохранить при этом настройки первого этапа (колода карт и функция). Если бы разделения инициализации у Вас бы не было, то для этого нужно было в функцию run снова передавать лишние аргументы (колоду и функцию), вместо необходимых (просто поменять имена игроков). И это простой пример, если программа гораздо сложнее, то таких подготовительных действий может быть больше.

"модуль", для меня это довольно не до конца понятные слова.

В курсе "Основы программирования" есть одноимённый урок по этой теме. Возможно, Вам следует к нему вернуться.

В курсе "Основы программирования" есть одноимённый урок по этой теме.

Спасибо, помогло понять, что модуль это отдельный js файл, который мы можем подключать к другому файлу.

Если бы разделения инициализации у Вас бы не было, то для этого нужно было в функцию run снова передавать лишние аргументы (колоду и функцию), вместо необходимых (просто поменять имена игроков)

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

Все равно не понимаю, какая сложность в передаче нескольких аргументов.

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

и там это может иметь больший смысл

и здесь этому надо учиться ;) Если хотите дополнительно прокачаться и попробовать себя в "боевых" условиях написания своего проекта, то добро пожаловать на проекты Хекслет :)

но на данном этапе все выглядит довольно странно и нелогично.

Помните, мы определились, что процесс инициализации программы разделён на два этапа?! Этого уже достаточно, чтобы мочь представить, что таких этапов может быть множество. Далее, поймите, что они могут быть разнесены по времени выполнения и по разным участкам кода.

Пусть будет (как в задании) всего два этапа - колоды карт для игр могут генерироваться отдельно, и в это время ещё ничего не известно о парах имён игроков (или все возможные пары имён игроков известны, но пока неизвестно какая конкретно колода будет сопоставлена (за это, например, отвечает отдельный алгоритм) каждой такой паре). Кстати, может возникнуть задача, когда установку пар имён надо будет разнести на два отдельных этапа (отдельно для первого и отдельно для второго имени). <-- То же самое относится к выбору конкретной "рандомной" функции (когда есть их вариации) для конкретной игры. И все эти этапы могут быть реализованы в разных взаимодействующих модулях.

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

СПасибо за вопрос и ответ. Помогло разобраться.

на первом этапе во "внешнюю" функцию-обёртку (именно ту, которую необходимо экспортировать по умолчанию, и, как было условлено, снаружи, в другом модуле, её будут обозначать как make) передаются два параметра: колода карт и функция, осуществляющая рандомный выбор карты из колоды. В результате эта функция возвращает другую функцию (см. второй этап).

где конкретно в нее передаются 2 параметра, а именно ф-ция, осуществляющая рандомный выбор карты?

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

Ваша функция будет возвращать другую функцию. При этом возвращаемая функция работает следующим образом: 1.принимает на вход имена игроков 2.запускает игру 3.возвращет лог игры

Функция, отвечающая за запуск игры, автоматически возвращает лог. Зачем это упоминать? Я уже думал что лог нужно снова выводить как-то отдельно. Думаю задание было бы понятней, если бы оставили (помимо customRandom, конечно) только требование №1, т.е. принять отдельно имена игроков. Вроде как в этом ценность задания.

📎📎📎📎📎📎📎📎📎📎