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