Недавно я разговаривал с коллегой по C ++ и посетовал, что не было никакого способа взять строку с именем поля класса и извлечь поле с этим именем; другими словами, в нем не хватает отражения. Он озадаченно посмотрел на меня и спросил, когда кому-нибудь понадобится что-то подобное.
Сверху головы у меня не было хорошего ответа для него, кроме «эй, мне нужно сделать это прямо сейчас». Поэтому я сел и составил список некоторых вещей, которые я фактически сделал с отражением на разных языках. К сожалению, большинство моих примеров взяты из моего веб-программирования на Python, и я надеялся, что у людей здесь будет больше примеров. Вот список, который я придумал:
Имеется файл конфигурации с такими строками, как
x = "Привет, мир!"
у = 5,0
динамически устанавливать поля некоторого объекта config
равными значениям в этом файле. (Это было то, что я хотел сделать в C ++, но на самом деле не мог.)
При сортировке списка объектов сортируйте на основе произвольного атрибута, заданного именем этого атрибута, из файла конфигурации или веб-запроса.
При написании программного обеспечения, использующего сетевой протокол, отражение позволяет вам вызывать методы на основе строковых значений из этого протокола. Например, я написал бот IRC, который будет переводить
!some_command arg1 arg2
в вызов метода actions.some_command(arg1, arg2)
и выведите то, что эта функция вернула обратно в IRC-канал.
При использовании функции Python __getattr__ (которая похожа на method_missing в Ruby / Smalltalk) я работал с классом с большим количеством статистики, такой как late_total. Для каждой статистики я хотел иметь возможность добавить _percent, чтобы получить эту статистику в процентах от общего количества вещей, которые я рассчитывал (например, stats.late_total_percent). Отражение сделало это очень легко.
Так может ли кто-нибудь здесь привести примеры из собственного опыта программирования времен, когда размышления были полезны? В следующий раз, когда сотрудник спросит меня, почему я «когда-нибудь захочу сделать что-то подобное», я бы хотел быть более подготовленным.