Свистоперделка #1 | Парсим Map
Представляю новую нерегулярную рубрику, в рамках которой мы будем изучать код, который был сгенерирован воспаленным инженерным мозгом (не только моим), разбираться в том, можно ли применить новые свестоперделки в работе, да и просто экспериментировать без оглядки на идиоматичность и правильность решений :)
Начнем мы с простого вопроса - как получить значение из Map aka json? Очень просто, используем такой синтаксис: `final map = {"key": "value"}; String val = map["key"];
Но есть проблемы. Во-первых, мы идеем дело с типом dynamic, который очень абстрактный и, в отличие от того же очень абстрактного Object, включает в себя еще и null. Тем веселее нам потом сталкиваться с ошибками типа Null is not assignable to type String. Во-вторых, когда наша DTOшка разрастается, то так и просится отделить маппинг json на класc от разбора этого самого json. Имхо, избавившись от ["key"], код станет читабельней, да и в строковых ключах можно опечататься (или я один не выношу 10500 ключей в константы?).
Идеальный синтаксис при маппинге - обращение к свойствам Map через точечную нотацию ( map.key ). И чтобы это реализовать, есть два прикольных пути:
- Анонимный extension on Map
- Использование приватных extension types
В первом случае мы делаем расширение для объектов Map, где создаем геттеры, которые позволяют нам обраться к this (то есть к самому объекту Map, и получить из него данные (предварительно преобразовав к нужному типу, если требуется). Например, это можно делать вот так: `extension on Map { String get some => this["value"] as String; }
final map = {"some": "value"}; final val = map.some;
Во втором случае делаем почти то же самое, только с расширением типа, но дополнительно оборачивая в это расширение наш Map, а также делаем его приватным (через underscore _ ) для избежания импортирования и вследствие этого конфликта названий методов. `extension type _pMap(Map value) { String get some => value["value"] as String; }
final map = {"some": "value"}; final val = _pMap(map).some;
В рамках этого поста я считаю лишним разбираться в том, что, как и в каком случае компилируется и какое из решений будет более эффективным с точки зрения производительности, оверхеда. Для этого придется капитально изучить спецификацию фич и заглянуть в Dart достаточно глубоко, чтобы встретить там dungeon master. Дайте знать, если тема интересна и стоит ее развить вширь и вглубь)
Как думаете, есть ли такому подходу реальное применение? Какие подводные камни могут быть? Погнали в комменты, обкашляем эту штуку)```