Прошлый пост был о том, как пользоваться составным типом данных — точкой на плоскости. Теперь о том, как этот тип реализовать. Сделать это можно при помощи пар.
Пара — это структура данных, которая объединяет в себе два значения. В джаваскрипте пар по дефолту нет, поэтому чтобы их использовать придется самостоятельно задать функцию-конструктор cons и две функции-селектора: first
для первого значения и second
для второго. Работают они так:
const pair = cons('left', 'right')
first(pair) // возвращает 'left'
second(pair) // возвращает 'right'
Конструктору пары можно передавать другие пары. Таким образом вкладывая пары друг в друга можно создавать сколь угодно сложные типы данных.
Во вчерашнем посте была функция makePoint, которая создает объект, описывающий точку на плоскости. Вот так выглядит ее реализация:
const makePoint = (x, y) => cons(x, y);
const getX = point => first(point);
const getY = point => second(point);
Функции для создания и манипуляции объектами какого-то типа называются «интерфейс». Зачем нужно задавать эти функции, если можно создавать и использовать точки напрямую через cons
, first
, second
?
const point = cons(x, y);
const x = first(point);
Для создания собственных типов данных есть две причины:
-
Упрощение кода. С точками на плоскости это не так заметно, но когда объект составлен больше чем из двух элементов, то удобнее пользоваться селекторами, чем добираться до внутренностей многократно вложенной пары серией из
first
иsecond
. -
Отделение интерфейса от реализации. Разделять их нужно, чтобы при изменении реализации типов, не нужно было менять код, их использующий. Например если я захочу поменять местами координаты точки в паре, то без интерфейса придется найти все места, где я использую
first(point)
для нахождения координатыx
и заменить наsecond(point)
. И наоборот. А если есть интерфейс, то достаточно будет переписать пару функцийgetX
иgetY
.