Почему я должен заботиться о RTTI в Delphi?

Я много слышал о новых / улучшенных возможностях RTTI в Delphi 2010, но я должен признать свое невежество... Я не понимаю этого. Я знаю, что каждая версия Delphi поддерживает RTTI... и я знаю, что RTTI (информация о типах времени выполнения) позволяет мне получать доступ к информации о типах во время работы моего приложения.

Но что именно это значит? Поддерживает ли RTTI в Delphi 2010 то же самое, что и отражение в.NET?

Может кто-нибудь объяснить, почему RTTI полезен? Притворись, что я твой заостренный начальник, и помоги мне понять, почему RTTI классный. Как я могу использовать его в реальных приложениях?

7 ответов

Решение

RTTI в Delphi все еще не настолько полнофункциональный, как Reflection в.NET или других управляемых языках, потому что он работает на скомпилированном коде, а не на промежуточном языке (байт-код). Тем не менее, это очень похожая концепция, и новая система RTTI в Delphi 2010 значительно приближает ее к размышлению, раскрывая целый объектно-ориентированный API.

До D2010 RTTI был довольно ограниченным. Единственное, что я когда-либо вспоминал, это преобразование перечислимого типа в строку (или наоборот) для использования в раскрывающихся списках. Я, возможно, использовал это однажды для сохранения контроля.

С новым RTTI в D2010 вы можете делать намного больше вещей:

  • Сериализация XML

  • Метаданные на основе атрибутов (TCustomAttribute). Типичными вариантами использования могут быть автоматическая проверка свойств и автоматическая проверка разрешений - две вещи, для которых обычно приходится писать много кода.

  • Добавление поддержки активных сценариев (т.е. с использованием элемента управления сценариями Windows)

  • Построение подключаемой системы; Вы могли бы сделать это раньше, но было много головных болей. Я не смог найти действительно хороший пример того, как кто-то делал это сверху донизу, но все необходимые функции теперь доступны.

  • Похоже, кто-то даже пытается реализовать Spring (DI framework) для Delphi 2010.

Так что это определенно очень полезно, хотя я не уверен, насколько хорошо вы сможете объяснить это PHB; большая часть его полезности, вероятно, будет реализована через сторонние библиотеки и фреймворки, во многом так же, как это работает в сообществе.NET сегодня - редко можно увидеть код отражения, сидящий в бизнес-логике, но типичное приложение будет использовать нескольких основанных на отражении компонентов, таких как Object-Relational Mapper или IoC Container.

Я ответил на вопрос?

Большинство людей, вероятно, не будут использовать его в реальных приложениях.

Люди, которые будут его использовать, являются создателями фреймворков. Фреймворки, такие как DUnit, широко используют RTTI.

С новыми возможностями RTTI мы должны ожидать появления более продвинутых сред и инструментов, похожих на те, которые доступны для.NET. Эти фреймворки произведут революцию в вашем развитии больше, чем RTTI сама по себе.

Расширенный RTTI в D2010 очень похож на отражение C#. Это дает вам возможность добраться до любого поля объекта или осмотреть его методы. Это имеет все виды потенциального использования. Например, если вы можете прочитать любое поле объекта, вы можете написать код сериализации, который может работать с любым объектом. А способность проверять методы и получать их имя и подпись значительно упрощает регистрацию класса в скриптовом движке.

Для меня это главное преимущество расширенного RTTI: способность писать код, который работает с любым классом, проверяя его членов, вместо того, чтобы снова и снова писать разные версии одного и того же кода, адаптированные для каждого отдельного класса.

RTTI в Delphi всегда был важен с версии 1.0. Классические функции RTTI включают в себя "опубликованный" раздел свойств классов, который позволял работать Инспектору объектов и функциям времени разработки компонента. В моих целях я часто использовал свойства класса Опубликовано, чтобы учесть перечисление этих свойств во время выполнения. Для хранения вещей из моих объектов на диск, для сохранения.

Delphi 2010 RTTI массово расширяет этот классический RTTI, настолько, что вы могли бы простить, что Delphi даже не имел RTTI до Delphi 2010.

Я бы сказал, что наиболее полезными приложениями "Нового RTTI" (как уже отмечалось в нескольких других ответах) будут фреймворки, написанные гуру, которые:

  1. Обработка персистентности к файлам или базам данных. База данных и конфигурация или документ, сохраняющий / загружающий структуры и компоненты, использовал бы это под капотом.

  2. Обрабатывать сортировку / сортировку / кодирование / декодирование в различные форматы, такие как JSON, XML, EDI и другие, в различные форматы.

  3. Модульное тестирование было упомянуто кем-то другим (JUnit), но я думаю, что те же самые фреймворки могли бы быть действительно полезными для инструментов отладки и отчетов об ошибках. Если в стеке задан объект, передаваемый в качестве параметра, почему бы не получить отчеты об ошибках, которые могут выводить все данные, которые были переданы в сбойную функцию, а не просто список функций?

Как видите, некоторые творческие люди, вероятно, подумают о еще большем использовании для этого. Можно сказать, что, хотя он и не обеспечивает четности в отражении.NET (о чем другой ответ говорит больше), он действительно привносит множество функций "динамического языка" (Think of Perl, Python, JavaScript) в статически иначе типизированную статику системный мир Delphi.

Лично для меня расширенный RTTI дал возможность получить соглашение о вызовах из указателя метода. Однако в настоящее время этот код находится под условной директивой, потому что я не удовлетворен этим.

(Критика и предложения по работе с базовыми RTTI приветствуются, хотя)

Ищу TMS Aurelius и вы увидите, что атрибуты RTTI очень полезны с точки зрения создания ORM Структура базы данных и XML Сериализация в чистые объекты и наоборот.

Вы должны заботиться, потому что они положили его на коробку. Очевидно, они думают, что некоторые люди будут заботиться.

Есть ли у вас на самом деле его использование, полностью зависит от характера ваших проектов. Поскольку у вас его не было раньше, и вы не понимаете, почему иметь его сейчас выгодно, это подсказывает мне, что вы его не используете. Затем вам решать, стоит ли тратить время на дальнейшее изучение предмета, чтобы выяснить, сможете ли вы найти для него применение.

Является ли это наиболее продуктивным использованием вашего времени по отношению к вашим проектам, опять же, это то, что вы можете знать только вы.

Другие вопросы по тегам