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

41

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

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

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

  • 0
    Ищите TMS Aurelius, и вы увидите, что атрибуты RTTI очень полезны с точки зрения создания ORM DataBase Framework и сериализации XML в чистые объекты и в противоположность.
Теги:
reflection
delphi-2010
rtti

7 ответов

36
Лучший ответ

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

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

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

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

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

  • Добавление поддержки Active Scripting (т.е. с помощью элемента управления Windows script)

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

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

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

Отвечаю ли я на вопрос?

  • 0
    imho "Нет", потому что ВСЕ перечисленные вещи уже были возможны с RTTI, как реализовано.
  • 5
    Я действительно не понимаю как; Атрибуты были определенно невозможны до TCustomAttribute ( TCustomAttribute является новым), конечно, никогда не было никаких платформ DI / IoC заранее, сериализация XML была в основном невозможна, потому что старый RTTI мог только находить published свойства, а Active Scripting часто обсуждался, но никогда решенная проблема. Как бы вы достигли любого из этих старых RTTI? У вас есть ссылка на кого-то, кто ее снял? Я рад отредактировать ответ, если то, что вы говорите, правда.
Показать ещё 11 комментариев
12

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

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

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

  • 1
    Таким образом, большинство людей будут использовать вещи, которые используют его, косвенно. Но большинство не будет использовать его напрямую. Так же, как большинство людей не будут писать компонент. Но ВСЕ используют их.
11

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

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

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

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

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

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

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

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

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

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

  • 0
    Все из которых все уже существовало, до нового все пели все танцующие RTTI. Я даже написал фреймворк персистентности и фреймворк для модульного тестирования самостоятельно, без помощи супер-RTTI
  • 4
    Не могли бы вы написать мне подпрограмму дампа стека, используя старый RTTI, который будет сбрасывать все ссылки на классы и все их неопубликованные свойства, пожалуйста? Довольно, пожалуйста?
Показать ещё 2 комментария
0

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

0

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

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

-3

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

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

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

  • 5
    Ваши ответы обычно очень полезны. Это не так.
  • 1
    Постер попросил нас рассказать ему, как RTTI полезен для него. Никто не может ответить на это, не зная его проектов и потребностей, а также самих плакатов.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню