В предыдущих курсах мы уже научились работать с составными данными и поняли, зачем они нужны. Также мы изучили концептуальные способы работы, которые не зависят от конкретного языка программирования.
В этом курсе мы разберем конкретные приемы, которые используются для работы с коллекциями в языке JavaScript. При этом они будут подходить и ко многим другим языкам.
Какие темы будем изучать
Списки есть везде и их бывает много. Они окружают нас повсеместно. Например, в Хекслете есть списки:
- Пользователей
- Курсов
- Уроков
- Топиков
- Комментариев
Еще есть не связанные с конкретными вещами списки, которые вводятся на сайте. Они существуют только внутри кода.
В этом курсе мы изучим несколько новых типов данных: массивы, ассоциативные массивы и множества.
Также мы познакомимся со следующими темами:
- Передача параметров по ссылке и по значению — более сложный механизм, чем мы изучали до этого
- Функции высшего порядка — встроены в JavaScript и являются каноническим способом работы с коллекциями
- Spread- и rest-операции — распространены в других языках программирования и позволяют сократить шаблонный код
- Destructing assignment — деструктуризация. Техника, которая используется в функциональных программированиях и языках. Она часто соприкасается с другой техникой, которая называется pattern matching
Также в этом курсе мы познакомимся с новыми техниками программирования, которые не относятся напрямую к работе с коллекциями. Это будет связано с проектом, который мы будем делать.
Мы поговорим о техниках:
- Lazy Evaluation — ленивые вычисления
- Memoization — мемоизация
- Fluent interface — текучий интерфейс
Еще мы познакомимся с понятием DSL — Domain-specific language. Это специализированный язык для конкретной области применения. Здесь речь не о языке программирования, хотя это тоже возможно, но с некоторыми ограничениями.
DSL делится на два типа:
- Внешний. Сюда входят языки запросов SQL и XPath, языки разметки HTML и Markdown, регулярные выражения. Они не пишутся на целевом языке, а формируются как текст, который разбирается специальными инструментами
- Внутренний. Сюда входит методика создания внутренних DSL — Fluent Interface. Внутренний DSL написан на целевом языке — на котором мы программируем. Этот DSL обычно является библиотекой. Ее API выглядит как естественный язык, при этом детали реализации спрятаны
DSL — важный механизм, который позволяет создавать специализированные языки. Они уменьшают вероятность появления ошибок и позволяют эффективно и быстро выражать и формировать понятия для определенной предметной области.
С каким проектом будем работать
В этом курсе мы будем делать проект, который называется Linq. Это библиотека, которая пришла из мира .NET — из языка C-sharp. Она позволяет описывать, как мы хотим обработать коллекцию и выдавать результат.
Сразу рассмотрим пример:
import HexletLinq from 'hexlet-linq';
const cars = [
{ brand: 'bmw', model: 'm5', year: 2014 },
{ brand: 'bmw', model: 'm4', year: 2013 },
{ brand: 'kia' model: 'sorento', year: 2014},
{ brand: 'kia', model: 'rio', year: 2010 },
{ brand: 'kia', model: 'sportage', year: 2012 },
];
const coll = HexletLinq.from(cars);
Здесь мы формируем некоторую структуру — список машин. Каждая машина представлена некоторым объектом с определенным набором данных: бренд, модель и год выпуска.
После этого с помощью нашей библиотеки мы формируем эту коллекцию через HexletLinq.from(cars)
— здесь происходит оборачивание или враппинг массива.
У этой коллекции есть большое количество методов, которые позволяют ее обрабатывать.
Например, мы хотим получить все модели машин, отсортированных в обратном порядке по году и принадлежащие бренду Kia:
const result = coll.orderBy(car => car.year, 'desc')
.where(car => car.brand === 'kia')
.select(car => car.model).toArray()
// [ 'sorento', 'sportage', 'rio' ]
Чтобы выполнить эту задачу, мы пишем код так, что он читается почти как английский язык. Мы говорим, что нужно отсортировать (order by) по году выпуска (year) в обратном порядке (desc). При этом нам нужно выбрать из этих машин только те, у которых бренд Kia (where brand kia).
Результат должен представлять не коллекцию машин, а коллекцию моделей. Поэтому достаем из машин их модели (select model).
Дальше у нас есть специальный метод toArray
, который преобразует список к обычному массиву, и на выходе получаем [ 'sorento', 'sportage', 'rio' ]
. Массив содержит все модели бренда Kia, которые отсортированы по году в обратном порядке.
Почему этот курс
Какие преимущества есть при изучении этого курса:
- Будем писать настоящий канонический JS-код с помощью функции высших порядков. Это код, который в реальности пишут в продакшене
- Будем обучаться через рефакторинг, а код будет эволюционировать. Значит, проект будет становиться лучше — меняться по урокам
- Будем разрабатывать проект через тесты
- Нужно будет думать и включаться в каждое упражнение, которое мы предоставляем
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.