Мы рассмотрим Records, изучим их возможности, а также приведем примеры использования. Будь Вы начинающий или опытный разработчик Dart, эта статья даст вам понимание того, как записи могут помочь вам писать более качественный код. Многие языки программирования имеют такой тип, как кортеж (tuple или product): Кортеж — это упорядоченный список позиционных полей.   Эти языки также скорее всего имеют тип Record. Отличие записей от кортежей состоит в том, что поля в записи не упорядочены и являются именованными.   В Dart же записи могут иметь только позиционные параметры, либо только именованные, либо и то и другое. Record — это новый тип данных в Dart. Он предоставляет лаконичный синтаксис для объявления классов, которые являются простыми носителями постоянных, неизменяемых наборов данных. С помощью Record вы можете легко создавать структуры данных, которые объединяют существующие данные. Например, чтобы вернуть пару значений: Enum в Dart является особой формой класса, которая реализует определенный шаблон, но с минимальной синтаксической избыточностью — компилятор генерирует множество кода за нас. Точно также, Record в Dart является особой формой класса, который реализует шаблон носителя данных с минимальным синтаксисом. Весь избыточный код будет автоматически сгенерирован компилятором. Record является подтипом Object и dynamic и супертипом для Never. Все записи являются подтипами Record и супертипами Never. Поля в Record неизменяемы, но они могут содержать ссылки на изменяемые объекты. Он также предоставляет реализации hashCode(), == и toString() Подобно List и Map, Record позволяет объединить несколько значений в один объект. В отличие от других типов коллекций, имеет фиксированный размер и гетерогенен. Каждый элемент в Record может иметь свой тип.   Синтаксис очень похож на список аргументов функции: К полям записи можно получить доступ с помощью геттеров. Каждое именованное поле предоставляет геттер с таким же именем, а для позиционных полей предоставляются геттеры с именами $0, $1, $2 и т.д. Пример: Если некоторые  ограничения при выборе имени для поля записи:	 Не стоит использовать имя поля более одного раза.  	 Запись только с одним позиционным полем должна иметь завершающую запятую: Имя поля не может начинаться с _ Поле не может иметь имя – hashCode, runtimeType, noSuchMethod или toString Имя не должно конфликтовать с синтезированным именем геттера позиционного поля В данном примере именованное поле $0 конфликтует с геттером первого позиционного поля. В Dart каждая запись имеет соответствующий тип, который похож на список параметров функции: Каждое поле представляет собой аннотацию типа и необязательное имя, которое будет полезно для документации. Именованные поля помещаются в фигурные скобки, почти также как в функциях, но без required и необязательных параметров. Просто тип поля и имя: Также в аннотации записи можно использовать как позиционные, так и именованные поля: Вот как будет выглядеть объявление пустой записи без полей: Здесь для объяснения записей мы будем использовать в качестве примера класс, содержащий данные о локации пользователя. Мы увидим, как c помощью Record вы сможете сделать свой код менее подробным и более простым. Давайте посмотрим, как может выглядеть класс Location без использования записей: Далее объект Location может быть создан следующим образом: Давайте посмотрим, как Record изменит ситуацию:  Создав эту запись, мы заметно уменьшили количество кода и повысили удобочитаемость.   Вычисления границ для типов записей включены в основную спецификацию здесь. Кратко: Если 2 записи имеют одинаковую форму, то их наименьшей верхней границей является новый тип записи той же формы, где тип каждого поля является наименьшей верхней	 границей соответствующего поля в исходных типах: Нижняя граница двух типов записей с одинаковой формой — это наибольшая нижняя граница составляющих их полей: Наименьшей верхней границей двух типов записей с разными формами является Record: Наибольшая нижняя граница записей различной формы равна Never. Запись в Dart - это новый тип данных, обеспечивающий лаконичный синтаксис для объявления классов, которые действуют как простые носители постоянных, неизменяемых наборов данных. Их можно использовать в таких случаях, как множественные возвраты, объединение нескольких объектов, составные ключи, DTO и т.д. В целом, записи в Dart - это мощный и гибкий инструмент, который может упростить работу с данными в ваших приложениях. Материал подготовил Денис Петров | AppFox.ru специально для Habr.com