d-mozulyov / Tiny.Library

General purpose low level library for Delphi 7-XE10, FreePascal and C++Builder
MIT License
81 stars 18 forks source link

Ok. Спасибо #4

Closed kapkapas closed 4 years ago

kapkapas commented 4 years ago

Впечатляет:

System.Rtti: 4699ms Tiny.Rtti (values): 141ms Tiny.Rtti (args): 32ms; Tiny.Rtti (direct): 9ms

d-mozulyov commented 4 years ago

Следите за развитием библиотеки Она меняет концепцию, будет содержать не только RTTI рутину Релиз будет в ближайшие недели

kapkapas commented 4 years ago

Добрый день! Дмитрий, спасибо за информацию. Не планируете ли вы выделить в отдельный модуль TValue? С уважением, Алексей К.

d-mozulyov commented 4 years ago

Не планирую. Более того, функционал и зависимость модуля Tiny.Rtti будет наращиваться. А зачем Вам отдельный модуль?

kapkapas commented 4 years ago

А зачем Вам отдельный модуль?

Попытаюсь прояснить свою позицию...

  1. TValue - унифицированный контейнер для данных. Его функционал вряд ли будет сильно меняться в последующем. В тоже время его можно применять вне всякой зависимости от остального функционала RTTI
  2. Context (TRTTIContext или ваш его аналог TRttiContext = object) и связанные с ним TRTTITypes, Invoke-ры можно было бы приспосабливать под различные нужды не подвергая опасности нарушения работы основного механизма.
    1. Таким образом, получилась бы следующая конфигурация: достаточно стабильный модуль реализации функционала TValue и более лабильный модуль (модули), включающий (-ие) потенциально более подверженные изменениям части функционала TinyRTTI (частные варианты TRTTITypes, Context-тов и т.п.). С моей точки зрения, также все таки можно было бы оставить зависимость от TypInfo (мне кажется что в последующем вам необходимо будет напряженно отслеживать возможные изменения в System и TypInfo в части RTTI).
    2. Собственно я сам находился и нахожусь в стадии разработки аналогичного движка. В первых числах мая мне неожиданно попался TinyRTTI. Без всякого преувеличения я восхищен...
    3. Я, например, был бы рад упрощенному доступу к коллекции значений аргументов атрибутов (без создания экземпляров TCustomAttribute). Применение "всей мощи" стандартного TRTTIContext-а для решения подобной задачи на (сегодняшний момент) мне кажется слишком расточительным. Для этого скорее подошел бы какой-нибудь "облегченный" вариант - TRTTILITEContext, решающий достаточно быстро задачу доступа к атрибутам и получение списка значений их аргументов (естественно в виде коллекции TValue). Для этого не нужны Invokе-ры. В настоящий момент в своих приложениях для этого я использую конечно стандартный TRTTIContext (задачи сериализации/десериализации объектов, инициализации, кодогенерации ...). Использование универсального стандартного TRTTIContext (и не адаптируемого для решения конкретных задач) выглядит как использование двухэтажного автобуса в качестве персонального авто... Конечно же не для всех перечисленных выше задач.

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

С уважением, Алексей К.

d-mozulyov commented 4 years ago

Честно говоря, не понял, в чём профит

kapkapas commented 4 years ago

Не планируете ли вы выделить в отдельный модуль TValue?

Я задал свой вопрос для того чтобы понять насколько удобно будет использовать TinyRTTI в своих разработках. Для меня удобнее использовать в работе обозримый и понимаемый до конца код. Если я этого достигаю - это мой профит.

Своим вопросом я ничего не навязывал. Вы как автор решение приняли - это ваше право. Ответ ваш я услышал. Мотивы его как мне кажется достаточно очевидны. У каждого свой профит.

Собственно говоря, на данный момент, ответ на вопрос который я задавал для меня уже не актуален. То что я планировал уже закончил.

d-mozulyov commented 4 years ago

Для того, чтобы использовать TValue - достаточно подключить модуль Tiny.Rtti. Данный модуль объединяет в себе 2 вещи: системную информацию (TypeInfo и т.д.) и универсальное представление данных. Контекст в текущей реализации не делает ничего кроме конвертации TypeInfo в универсальное представление. Зависимости от Tiny.Invoke тут нет. Можно использовать TValue без привязки к этому модулю.

Но нельзя использовать отдельно от универсального представления

kapkapas commented 4 years ago

Зависимости от Tiny.Invoke тут нет. Можно использовать TValue без привязки к этому модулю.

TValue <- TRTTIContext & types TValue <- TTiny.Invoke Это все было ясно с самого начала.

Но нельзя использовать отдельно от универсального представления

TValue от TRTTIContext?

Embarcadero убрали слабую зависимость TValue от TRTTIContext в 10.3 (это была весьма странная вещь :-( ). В ближайшее время посмотрим что они сделают в 10.4

d-mozulyov commented 4 years ago

В реализации Эмбаркадеро нет универсального представления, есть только TypeInfo. В частности поэтому их показатели производительности ниже. К слову, в моей реализации привязки TValue к контексту практически нет, потому что в массе своей операции проходят уже с заранее известным универсальным представлением.

kapkapas commented 4 years ago

Не совсем понял вас. Как я понимаю TypInfo это по сути дела - API к массиву RTTI, "подготовленным" компилятором, а TRTTIContext дает более менее унифицированное объектное представление этих данных (где то сделанное весьма причудливым образом). Его тоже можно назвать универсальным представлением. К слову: массив RTTI организован весьма причудливым образом... Ну тут уже ничего не поделаешь. Универсальное представление можно сделать на основе своего аналога TRTTIContext, точнее системы метаклассов, генерируемого TRTTIContext - как я понимаю именно эту часть вы и называете универсальным представлением. Возможно я неправ.

d-mozulyov commented 4 years ago

Универсальное представление это типы TRttiGroup, TRttiType и TRttiExType