PRO курс

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

2903 сообщения в сообществе 3178 учащихся

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

Подготовительный курс

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

Уроки курса

  • 1

    Введение

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

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

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

    тесты

    упражнение

  • 3

    Инверсия

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

    тесты

    упражнение

  • 4

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

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

    тесты

    упражнение

  • 5

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

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

    тесты

    упражнение

  • 6

    Объекты

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

    упражнение

  • 7

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

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

    тесты

    упражнение

  • 8

    Классы

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

    тесты

    упражнение

  • 9

    Полиморфизм

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

    тесты

    упражнение

Автор

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

Сооснователь и технический директор образовательного проекта Hexlet. Программирует с 2007 года. За это время прошел путь от разработчика до технического директора и управляющего отдельным подразделением (филиалом). Управлял командами, в которых больше 50 разработчиков. Программирует на языках: elixir, clojure, javascript, php, ruby. Со-организатор конференции nastachku.ru. Вимер. Топит за DevOps и автоматизированные тесты.

Впечатления

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

Отличный курс, в какой то момент, думаю, даже соседи услышали громкий щелчок, когда у меня в голове многое на место встало. Спасибо!

Задача намного легче, чем кажется на первый взгляд) Конечно, до решения учителя ещё далеко и есть куда стремиться) Большое спасибо за курс!)

Провела примерно неделю в борьбе с этой задачкой. Всё никак не подавалась. Сначала долго не могла понять теоретическую часть. Пересматривала видео и перечитывала текст по несколько раз. Решила, что на практике теория усвоится лучше. Разобрала и прокомментировала каждую строчку, начиная с 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

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

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