PRO курс

JS: Программирование, управляемое данными

2292 сообщения в сообществе 2492 учащихся

Описание

В течение этого курса мы будем писать собственную карточную игру и знакомиться с такими важными концепциями программирования, как пользовательские типы, динамическая диспетчеризация по типу, позволяющая писать ёмкий, универсальный код, полиморфизм, передача сообщений между сущностями и, конечно, основы важнейшей темы — объектно-ориентированного программирования. Также мы перейдем к разработке через тесты (test driven development).

Пререквизиты

JS: Последовательности

Уроки курса

  • 1

    Введение

    Познакомиться с курсом и с проектом карточной игры, над которым мы будем работать в течение всего курса, по ходу знакомясь с важными концепциями программирования.
  • 2

    Игровой дизайн: карточный бой

    Продумать игровой дизайн нашей карточный игры: как работает игра, как выглядит структура программы и как устроен процесс игры. Проработать поведение программы через тесты.
  • 3

    Инверсия

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

    Помеченные данные

    Разобрать недостатки текущей реализации нашей игры. Разобраться с понятием «помеченных данных», которое является одним из важнейших аспектов всего курса.
  • 5

    Диспетчеризация по типу. Аддитивность.

    Понять, что такое аддитивные программы и как динамическая диспетчеризация поможет нам строить такие программы. Разобраться, что такое диспетчеризация в контексте программирования и типов.
  • 6

    Объекты

    Познакомиться с объектами в контексте современного, общепринятого понятия объектно-ориентированного программирования. Понять, как динамическая диспетчеризация дала возможность работать с объектами в ООП.
  • 7

    Нативные объекты

    Рассмотреть объекты, встроенные в сам язык JavaScript, с учетом знаний об объектах, которые мы получили ранее. Разобраться с тем, как объекты определяются как константы, но при этом могут изменяться.
  • 8

    Классы

    Познакомиться с классом — структурой, которая позволяет создавать объекты. Рассмотреть механизм создания новых объектов с помощью 'new'.
  • 9

    Полиморфизм

    Познакомиться с понятием полиморфизма в языках программирования. Разобрать три типа полиморфизма.

Автор

Кирилл Мокевнин

Сооснователь и технический директор образовательного проекта Hexlet. Соорганизатор конференции Nastachku.ru. В прошлом руководил филиалом undev.ru в Ульяновске, а до этого работал в Qik (Skype). Создает инженерную культуру в компаниях и несет в массы XP, DDD и DevOps. Евангелист ментального программирования.

Впечатления

Решение учителя было весьма неожиданным (сам подход) :)

Это шикарно! Спасибо, ребята, за головомойку! 2 дня я ломал голову на даче, мысленно рисуя, что должно быть в итоге. Алгоритм выработал верный, без подсказок обошелся. Но отладка... Копал полдня не в ту сторону, на два раза всё переписал. Уххх, круто!

Провела примерно неделю в борьбе с этой задачкой. Всё никак не подавалась. Сначала долго не могла понять теоретическую часть. Пересматривала видео и перечитывала текст по несколько раз. Решила, что на практике теория усвоится лучше. Разобрала и прокомментировала каждую строчку, начиная с definer, чтобы понять взаимосвязь между всеми функциями. Посмотрела как выглядят methods через консоль.

Дальше был затык — путалась между типами и методами, не понимала, что именно нужно вернуть. С этим помог справиться solution.js. Решила писать функцию getMethod с перебором по методу: getName, damage. Осознав, какие данные получаю на входе, описала словами в свободной форме на русском языке, как нужно добраться до нужных значений.

То есть, переданный аргумент obj у нас имел вид: (SimpleCard, (Королевский хлыст шанса, 6)). А отдельный метод в methods: (PercentCard, (damage, (self, health) => Math.round(health * ((0, _hexletPairs.cdr)(self) / 100)))). Дальше было просто.

Однако возникали ошибки (Maximum call stack size exceeded в первом тесте и результат не сошёлся с ожидаемым во втором тесте), несмотря на то, что логически выглядело всё верно. Последняя проблема состояла в том, что health - cdr(self) -- это неправильная функция для метода damage, а решила я её благодаря вопросам и ответам на этой странице.

Было весело. Спасибо, кто придумал эти задачки, кто их решает и обсуждает! :)

Ревью: https://ru.hexlet.io/code_reviews/83325#file-1

Самое классное задание из всеч которые пока-что были по этому курсу! Тема очень крутая, в ней на мой взгляд видно всю механику взаимодействия функций в программе, да и вообще принципа программирования. Над теорией думал 3 дня, пришлось полностью расписать на листочке (а потом в фотошопе на огромном листе, потому что листочка а4 не хватило) все запросы функций стрелочками что куда отправляет и что куда как возвращается в какой из какого модуля (картиночек с фигурами оказалось мало для полной визуализации для понимания работы программы), но практику за пару минут сделал (только над итером подумал пол часика). Круто! Спасибо) Народ, не пропускайте это задание, если не понять этого, то пойдет снежным комом всё что будет дальше.

Добрый вечер! Хочу поблагодарить за это задание - мозги вскипели конечно за эти пару дней, но в итоге это дало прямо таки очень очень хорошее понимание всех этих запутанных вызовов. И такого чувства удовлетворения от выполненной задачи я давно уже не испытывала)

Маленькая подсказка всем - не забывайте, что функция должна всегда что-то возвращать, даже если внутри неё тоже функция ;)

продолжительность
22 часа
награда
57 баллов
Получить доступ к курсу