Pull to refresh

Comments 26

хм, а можно более жизненный пример?
Можно сделать кеширование.
Заменив, p «before ##{name}» на запрос в мемкеш и выдачу результата оттуда, а p «after ##{name}» заменить на кеширование результата в мемкеш.
а что дает это «проксирование», чего нельзя добиться обычным наследованием?
Я описал механизм, как можно обернуть все методы класса.
Делать это наследованием, или просто инкапсуляцией это уже ваше дело.
А почему черная магия? Обычное метапрограммирование:)
Это не метапрограммирование. Вот если бы в method_missing на объекте создавался метод, дабы исключить обработку в method_missing при повторном вызове, тогда да.
Почему не метапрограммирование? На лету кодом манипулируем — значит метапрограммирование.
Код по сути есть «сферический конь в вакууме», т.к. для запуска в тредах и «померить производительность» проксирование не нужно, для «навесить фильтры до и после» — есть alias'инг или (в рельсах) alias_method_chain. Имхо более жизненный пример с проксированием – это коллекции объектов, возвращаемые в рельсовских ActiveRecord при вызове find.
Есть сотни способов, как заальясить одно в другое и обернуть, еще раз я показал пример, как можно сделать обертку, для всех! методов класса, а не для одного.
Я всего лишь ратую за более жизненный пример :)
Не уверен как в питоне, но этот механизм, дает возможность обернуть все методы класса.
Если я правильно понял, тут просто используется спец-метод method_missing, вызывающийся, если запрашиваемый метод не был найден, так?
В питоне это можно сделать почти так же, через __getattribute__ (вызывается для всех свойств и методов, не только для отсутствующих).
А правильный способ — декораторы, что есть синтаксический сахар, но очень удобно и без лишнего кода.
Я как раз дополнил пост, небольшим объяснением как все это работает.
> через __getattribute__ (вызывается для всех свойств и методов, не только для отсутствующих)

а только для отсутствующих — __getattr__
Вообще, суть декораторов, как раз-таки, в проксировании (аспектно-ориентированное программирование) В то время как основная задача method_missing — определение действия на случай, если объект не может сам ответить на сообщение. Но, как вариант, можно использовать method_missing для проксирования (что и делает автор статьи), но, повторю, основная идея — не в проксировании. Проксирующие же декораторы (в Питоне) вызываются всегда, независимо от того, есть такой атрибут у объекта или нет.
Ну так всегда, где-то там есть то чего нет тут.
В руби нет реализованного паттерна декараторов, но есть возможность сделать его своими руками.
Да, только в случае декораторов мы можем каждому методу навесить разные прокси (включая несколько декораторов для одного метода), тогда как при использование method_missing — у нас один «декоратор» на всех (можно, конечно, сделать проверку имени метода, и вызывать разные соответствующее действия, но это будет громоздко). Всё же, если говорить о декораторах, то здесь больше подойдёт паттерн alias_method_chain.
Я так понимаю он реализован только в рельсах и с наскока его не перенесешь к себе.
> Я так понимаю он реализован только в рельсах и с наскока его не перенесешь к себе.

Да, он реализован в Рельсах. Но почему не «перенесёшь к себе»? Ведь это обычная цепочка вызовов заaliasенных методов (через стандартные конструкции alias и alias_method) — можно и свою идеологию придумать (не только с with и without, как придумали в alias_method_chain, который имитирует работу декораторов).
Ну я как нибудь проинспектирую код на наличие интересных решений, я пока занят изучением кишков мерба :)
в принципе такой подход использую давно и удачно. И не только в руби, в принципе в любом языке где есть минимальная перегрузка методов
Ну в перле это сделать намного сложнее.
не спорю. В php вообще без проблем использовать такой подход
Sign up to leave a comment.

Articles