- PVSM.RU - https://www.pvsm.ru -

Для чего в Dart метаданные

Поковырял ещё некоторое время в Drat, идея хорошая, но многие вещи, так скажем, не понятны.

Хочу обсудить концепцию метаданных [1]. Которой я всё пытался найти применение и мне кажется в ней что-то есть, но реализация доступа к метаданным — из рук вон плоха. Особенно для нового языка, который должен был учесть существующий опыт и т.д. и т.п.

Для чего в Dart метаданные

Т.е. если вы из питона (как я) то поведение у этой системы прямо противоположное предполагаемому. Это не декораторы и проще всего к ним доступаться из декорируемого (аннотируемого) объекта (функции, класса и т.п.). Ну проще — это образно [2]. На самом деле надо совершить три действия чтоб получить значение — получить зеркало объекта (InstanceMirror), из зеркала объекта получить зеркало класса объекта (ClassMirror) и уже в его метаданных искать то, что мы запихали в метаданные объекта…

Решение же через эту систему метаданных типичных проблем, решаемых декораторами и вовсе выглядит неразумным. К примеру есть фреймворк bloodless [3], который, как пишет автор, глубоко вдохновлён питоновским Flask'ом. Там через метаданные задаётся роутинг, перехватчики запросов и обработчики ошибок… Т.к. при задании метаданных не происходит вообще ничего кроме создания самих метаданных — единственный способ собрать то, к чему они прикреплены — перебрать ВСЁ! И здесь так и сделано [4] — в цикле перебираются зеркала всего в области видимости, у каждого инстанса ищутся метаданные и проверяются на соответствие нужным типам метаданных…

Т.е. мне кажется это, мягко выражаясь, не правильно — метаданные явно не для этого.

Как я понимаю они скорее для точечной проверки. Т.е. когда у объекта могут быть определённые метаданные согласно API, рекомендациям и т.п. Например функции вышеупомянутого роутинга с метаданными по методам/урлам/типам собрать в список руками и засунуть в конфигуратор. Конфигуратор знает какие метаданные ожидать от функций и формирует таблицу роутинга. Ну, как пример…

Автор: qnub

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/dart/58042

Ссылки в тексте:

[1] метаданных: https://www.dartlang.org/docs/dart-up-and-running/contents/ch02.html#ch02-metadata

[2] это образно: http://stackoverflow.com/a/19492608/1000370

[3] bloodless: http://pub.dartlang.org/packages/bloodless

[4] так и сделано: https://github.com/luizmineo/bloodless/blob/master/lib/src/server_impl.dart#L253

[5] Источник: http://habrahabr.ru/post/217535/