Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Роман Неволин «Провайдеры типов без боли и магии»

DotNetRu
November 23, 2017

Роман Неволин «Провайдеры типов без боли и магии»

Newtonsoft.Json — самый популярный пакет в NuGet. А рядом с ним, на третьем месте, — Entity Framework. Пожалуй, это неплохо демонстрирует, насколько часто.NET разработчики обрабатывают разнообразные данные. И для каждого типа данных — своя библиотека, а еще куча классов-оберток, которые приходится писать ради получения всех благ строгой типизации. И делать это нужно для каждого нового источника данных.

Однако F# предлагает нам другое решение вечной проблемы — провайдеры типов. Решение, которое позволяет максимально упростить работу с любыми типами данных, избавиться от написания и сопровождения классов оберток, а заодно и решить совсем другие проблемы, вроде рисования сложных графиков и работы с нейронными сетями средствами F#. Если вы хотите узнать, как использовать провайдеры типов, какие проблемы они решают, как работают и как написать собственный провайдер для ваших задач, — приходите на этот доклад!

DotNetRu

November 23, 2017
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. 2

  2. Задача: я хочу получить JSON с вопросами по URL, взять

    первый вопрос и напечать ссылку на него 3
  3. Задача : «детское» решение 1.Скачать текст по ссылке 2.Разбить текст

    на «блоки» 3.Выделить блоки с вопросом 4.Выбрать первый из этих блоков. 5.Найти в нем ссылку и напечатать 4
  4. Что здесь не так?  Мы легко можем ошибиться, и

    об ошибке станет известно только в рантайме 14
  5. Что здесь не так?  Мы легко можем ошибиться, и

    об ошибке станет известно только в рантайме  Автодополнение не помогает нам писать код 15
  6. Что здесь не так?  Мы легко можем ошибиться, и

    об ошибке станет известно только в рантайме  Автодополнение не помогает нам писать код  Мы никак не застрахованы от изменений в API 16
  7. Ах, как было бы прекрасно, если..  Если бы типы

    генерировались по JSON  Если бы это происходило автоматически, как только мы ввели в IDE ссылку на JSON 18
  8. Ах, как было бы прекрасно, если..  Если бы типы

    генерировались по JSON  Если бы это происходило автоматически, как только мы ввели в IDE ссылку на JSON  Если бы сгенерированные типы автоматически обновлялись при изменении JSON 19
  9. Но...  Но провайдеры – сложный механизм с кучей подводных

    камней.  Но бывает сложно понять, когда выполняется та или иная логика внутри провайдера 23
  10. Но...  Но провайдеры – сложный механизм с кучей подводных

    камней.  Но бывает сложно понять, когда выполняется та или иная логика внутри провайдера  Но провайдеры недостаточно хорошо специфицированы. 24
  11. Но...  Но провайдеры – сложный механизм с кучей подводных

    камней.  Но бывает сложно понять, когда выполняется та или иная логика внутри провайдера  Но провайдеры недостаточно хорошо специфицированы. Но вообще-то. Программисты мы или погулять вышли? 25
  12. ID3 Provider : обзор задачи  Информация об MP3 файлах

    хранится в ID3 тегах  Разные теги хранят в себе разные данные  MP3 файл может содержать или не содержать любые ID3 теги Это задача для провайдеров! 34
  13. 35

  14. 36

  15. 37

  16. 38

  17. 39

  18. 40

  19. 41

  20. Generative провайдеры  Создает реальные типы на основании схемы 

    Созданные типы хранятся в файле сборки  Совместим с рефлексией и другими .NET языками  Увеличивают размер сборки 44
  21. Erased провайдеры  Создает типы, о которых знает только F#

    компилятор  Невозможно использовать рефлексию  Несовместимы с другими .NET языками  Умеют работать с бесконечными структурами данных 45
  22. Code Quotations  Механизм метапрограммирования в F#, схожий с деревьями

    выражений  Полностью валидируется компилятором  Используется для создания «шаблонов» выражений 47
  23. 51

  24. Интерфейс ITypeProvider «Type providers implement this interface in order to

    be recognized by the compiler as an F# type provider. The implementation of this interface determines the public interface and behavior of the type provider» 57