Почему я должен заботиться о RTTI в Delphi? - PullRequest
41 голосов
/ 07 февраля 2010

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

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

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

Ответы [ 7 ]

37 голосов
/ 07 февраля 2010

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

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

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

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

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

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

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

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

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

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

12 голосов
/ 07 февраля 2010

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

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

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

11 голосов
/ 07 февраля 2010

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

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

2 голосов
/ 08 февраля 2010

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

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

Я бы сказал, что наиболее полезные приложения «Нового RTTI» № 1 (как уже указывалось в нескольких других ответах) будут в Frameworks, написанном гуру, что:

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

  2. Ручка травления / сортировки / кодирования / декодирования в и из различных форматы по проводам, такие как JSON, XML, EDI и другие.

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

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

0 голосов
/ 27 июля 2013

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

0 голосов
/ 14 ноября 2010

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

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

0 голосов
/ 07 февраля 2010

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

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

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

...