Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.81.232] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Рефлексия (интроспекция) — механизм языка программирования, позволяющий во время выполнения исследовать структуру программы.
Поговорим о: Как следует из заглавия темы, вопрос в том, настолько ли полезен данный механизм, чтобы считать его важной (необходимой) составляющей современных языков программирования. |
Сообщ.
#2
,
|
|
|
собственно говоря, фанаты рефлексивных языков (java, .net, delphi, php, etc.) предлагают реальные задачи и показывают как красиво рефлексия с этими задачами справляется... мы же (фанаты нерефлексивных языков) показываем, что всё это от лукавого
поехали... |
Сообщ.
#3
,
|
|
|
Без рефлексии нельзя делать кодогенерацию.
Например, есть такая библиотека, как Hibernate/NHibernate для java (и .net, соответственно). Без рефлексии реализовать их было бы очень сложно. Другой пример. Библиотека cl-sql для common lisp позволяет использовать синтаксис sql прямо в исходном тексте программы. Без рефлексии это тоже было бы очень сложно. |
Сообщ.
#4
,
|
|
|
Цитата archimed7592 @ мы же (фанаты нерефлексивных языков) показываем, что всё это от лукавого Кстати, говорят, в C++ есть RTTI. Есть ли? Пользуетесь ли? |
Сообщ.
#5
,
|
|
|
Цитата wind @ Есть ли? Есть. Цитата wind @ Пользуетесь ли? У него ограниченная область применения. Кстати, красивый пример на рефлексию (а лисповские макросы — это разновидность рефлексии): Цитата http://lispnik.livejournal.com/218022.html (defun make-lexer (tokens) (lambda () (let ((val (pop tokens))) (values val val)))) (fucc:defgrammar *test-ll-grammar* s (:a :b :c :d) ((s -> k :a m :a l (:call #'list)) (k -> :a (:do (format t "Hello ")) :b (:call #'cons)) (l -> (:do (format t "world!~%")) :a :c (:call #'cons)) (m -> (:call (constantly 0)) ) (m -> :d l (:call #'list))) :type :LL) (defun run-simple-ll-test () (fucc:parser-ll (make-lexer '(:a :b :a :a :a :c)) *test-ll-grammar*)) $ (run-simple-ll-test) Hello, world! => ((:A . :B) :A 0 :A (:A . :C)) |
Сообщ.
#6
,
|
|
|
Цитата archimed7592 @ мы же (фанаты нерефлексивных языков) показываем Что-то я смотрю, в стане противников рефлексии только archimed7592, так что к нему и вопрос: как реализовать шаблон проектирования "фабрика" (или "абстракная фабрика") без использования рефлексии, но при этом не наступить на главные его грабли - трудность дополнения набора поддерживаемых продуктов. |
Сообщ.
#7
,
|
|
|
Цитата wind @ но при этом не наступить на главные его грабли - трудность дополнения набора поддерживаемых продуктов. На самом деле достаточно просто. Решается одной строчкой, которая регистрирует новый продукт в фабрике. Например, так: // В глобальной области видимости: SomeFactory::FactoryProduct<ProductType> g_ProductRegistrar; Т. е. создается статический объект, автоматом регистрирующий продукт в фабрике. Он же (этот статический объект) является, по совместительству, конкретной фабрикой этого продукта. Как ты это предлагаешь реализовывать с помощью рефлексии? Метаатрибутами разруливать? |
Сообщ.
#8
,
|
|
|
Цитата Flex Ferrum @ Решается одной строчкой, которая регистрирует новый продукт в фабрике. Не совсем понял, что именно регистрируется. Экземпляр класса? |
Сообщ.
#9
,
|
|
|
Цитата wind @ Не совсем понял, что именно регистрируется. Экземпляр класса? Нет. Фактически, регистрируется конкретная фабрика объектов заданного типа, после чего абстрактная фабрика "узнает" о том, что теперь она может создавать продукт заданного типа. |
Сообщ.
#10
,
|
|
|
Цитата Flex Ferrum @ Фактически, регистрируется конкретная фабрика объектов заданного типа, после чего абстрактная фабрика "узнает" о том, что теперь она может создавать продукт заданного типа. Всё верно. Рефлексия же позволяет регистрировать сам класс, никаких костылей в виде дополнительных билдеров не потребуется. Следующий вопрос. Все, наверное, пользовались редакторами свойст в современных среда разработки. Каким образом реализуется такой редактор без рефлексии? |
Сообщ.
#11
,
|
|
|
Цитата wind @ Рефлексия же позволяет регистрировать сам класс, никаких дополнительных костылей в виде дополнительных билдеров не потребуется. В смысле? |
Сообщ.
#12
,
|
|
|
Цитата Flex Ferrum @ В смысле? Например, в java я могу сослаться на тип класса - эдакий класс Class. Для конструирования нового объекта данного класса я могу применить метод Class.newInstance(), соответственно билдер (как в вашем примере) не потребуется. |
Сообщ.
#13
,
|
|
|
Цитата wind @ Например, в java я могу сослаться на тип класса - эдакий класс Class. Для конструирования нового объекта данного класса я могу применить метод Class.newInstance(), соответственно билдер (как в вашем примере) не потребуется. В данном конкретном случае эти способы практически равноценны. |
Сообщ.
#14
,
|
|
|
Цитата Flex Ferrum @ В данном конкретном случае эти способы практически равноценны. Равноценны с точки зрения достижения результата, но не с точки зрения затрат. А что второй вопрос? |
Сообщ.
#15
,
|
|
|
Цитата wind @ Равноценны с точки зрения достижения результата, но не с точки зрения затрат. И с точки зрения затрат - тоже. Кроме того, в плюсовом варианте есть некоторые приемущества в плане вызова конструктора. |