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

в 19:03, , рубрики: dart, mirror, reflection, метки: , ,

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

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

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

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

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

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

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

Автор: qnub

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js