На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Рефлексия , полезен ли этот механизм
    Рефлексия (интроспекция) — механизм языка программирования, позволяющий во время выполнения исследовать структуру программы.

    Поговорим о:
    • возможных сценариях использования;
    • качественных и количественных изменениях в коде вследствие использования.

    Как следует из заглавия темы, вопрос в том, настолько ли полезен данный механизм, чтобы считать его важной (необходимой) составляющей современных языков программирования.
      собственно говоря, фанаты рефлексивных языков (java, .net, delphi, php, etc.) предлагают реальные задачи и показывают как красиво рефлексия с этими задачами справляется... мы же (фанаты нерефлексивных языков) показываем, что всё это от лукавого :)
      поехали...
        Без рефлексии нельзя делать кодогенерацию.
        Например, есть такая библиотека, как Hibernate/NHibernate для java (и .net, соответственно). Без рефлексии реализовать их было бы очень сложно.
        Другой пример. Библиотека cl-sql для common lisp позволяет использовать синтаксис sql прямо в исходном тексте программы. Без рефлексии это тоже было бы очень сложно.
          Цитата archimed7592 @
          мы же (фанаты нерефлексивных языков) показываем, что всё это от лукавого

          Кстати, говорят, в C++ есть RTTI. Есть ли? Пользуетесь ли?
            Цитата wind @
            Есть ли?

            Есть.
            Цитата wind @
            Пользуетесь ли?

            У него ограниченная область применения.

            Кстати, красивый пример на рефлексию (а лисповские макросы — это разновидность рефлексии):
            Цитата http://lispnik.livejournal.com/218022.html

            ExpandedWrap disabled
              (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))

            Сообщение отредактировано: mo3r -
              Цитата archimed7592 @
              мы же (фанаты нерефлексивных языков) показываем

              Что-то я смотрю, в стане противников рефлексии только archimed7592, так что к нему и вопрос: как реализовать шаблон проектирования "фабрика" (или "абстракная фабрика") без использования рефлексии, но при этом не наступить на главные его грабли - трудность дополнения набора поддерживаемых продуктов.
                Цитата wind @
                но при этом не наступить на главные его грабли - трудность дополнения набора поддерживаемых продуктов.

                На самом деле достаточно просто. Решается одной строчкой, которая регистрирует новый продукт в фабрике. Например, так:

                ExpandedWrap disabled
                  // В глобальной области видимости:
                  SomeFactory::FactoryProduct<ProductType> g_ProductRegistrar;

                Т. е. создается статический объект, автоматом регистрирующий продукт в фабрике. Он же (этот статический объект) является, по совместительству, конкретной фабрикой этого продукта.

                Как ты это предлагаешь реализовывать с помощью рефлексии? Метаатрибутами разруливать?
                  Цитата Flex Ferrum @
                  Решается одной строчкой, которая регистрирует новый продукт в фабрике.

                  Не совсем понял, что именно регистрируется. Экземпляр класса?
                  Сообщение отредактировано: wind -
                    Цитата wind @
                    Не совсем понял, что именно регистрируется. Экземпляр класса?

                    Нет. Фактически, регистрируется конкретная фабрика объектов заданного типа, после чего абстрактная фабрика "узнает" о том, что теперь она может создавать продукт заданного типа.
                      Цитата Flex Ferrum @
                      Фактически, регистрируется конкретная фабрика объектов заданного типа, после чего абстрактная фабрика "узнает" о том, что теперь она может создавать продукт заданного типа.

                      Всё верно. Рефлексия же позволяет регистрировать сам класс, никаких костылей в виде дополнительных билдеров не потребуется.

                      Следующий вопрос. Все, наверное, пользовались редакторами свойст в современных среда разработки. Каким образом реализуется такой редактор без рефлексии?
                      Сообщение отредактировано: wind -
                        Цитата wind @
                        Рефлексия же позволяет регистрировать сам класс, никаких дополнительных костылей в виде дополнительных билдеров не потребуется.

                        В смысле?
                          Цитата Flex Ferrum @
                          В смысле?

                          Например, в java я могу сослаться на тип класса - эдакий класс Class. Для конструирования нового объекта данного класса я могу применить метод Class.newInstance(), соответственно билдер (как в вашем примере) не потребуется.
                            Цитата wind @
                            Например, в java я могу сослаться на тип класса - эдакий класс Class. Для конструирования нового объекта данного класса я могу применить метод Class.newInstance(), соответственно билдер (как в вашем примере) не потребуется.

                            В данном конкретном случае эти способы практически равноценны.
                              Цитата Flex Ferrum @
                              В данном конкретном случае эти способы практически равноценны.

                              Равноценны с точки зрения достижения результата, но не с точки зрения затрат.
                              А что второй вопрос?
                                Цитата wind @
                                Равноценны с точки зрения достижения результата, но не с точки зрения затрат.

                                И с точки зрения затрат - тоже. Кроме того, в плюсовом варианте есть некоторые приемущества в плане вызова конструктора.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0370 ]   [ 14 queries used ]   [ Generated: 20.05.24, 12:21 GMT ]