Делают ли какие-либо «основные» фреймворки классы-патчи / открытые обезьяны? - PullRequest
1 голос
/ 20 мая 2009

Мне любопытно использовать функцию, известную как открытые классы или патчирование обезьян в таких языках, как, например, Ruby, Python, Groovy и т. Д. Эта функция позволяет вносить изменения (например, добавлять или заменять методы) в существующие классы или объекты во время выполнения.

Кто-нибудь знает, используют ли крупные возможности (такие как Rails / Grails / Zope) (широко) эту возможность для предоставления услуг разработчику? Если да, приведите примеры.

Ответы [ 3 ]

8 голосов
/ 20 мая 2009

Rails делает это в (ИМХО) нелепой степени.

2 голосов
/ 20 мая 2009

.Net позволяет использовать методы расширения.

Linq, в частности, в значительной степени опирается на методы расширения, пропатченные обезьянами на интерфейс IEnumerable.

1 голос
/ 20 мая 2009

Примером его использования на платформе Java (поскольку вы упомянули Groovy) является переплетение времени загрузки с чем-то вроде инструментария AspectJ и JVM. В этом конкретном случае, однако, у вас есть возможность использовать ткачество во время компиляции. Интересно, что один из моих недавних вопросов SO был связан с проблемами с использованием этого ткачества времени загрузки, при этом некоторые рекомендации рекомендовали время компиляции как единственный надежный вариант.

Примером AspectJ, использующим ткачество во время загрузки (во время выполнения) для предоставления полезного сервиса разработчику, может быть аннотация Spring @Configuration, которая позволяет использовать Dependency Injection для объекта, не созданного Spring BeanFactory.

Вы специально упомянули изменение метода (или как он работает), и примером того, как он используется, является аспект, который перехватывает запрос http перед отправкой его обработчику (какой-либо метод Controller или doPost и т. Д.) И проверкой посмотрите, авторизован ли пользователь для доступа к этому ресурсу. Ваш аспект может затем решить - преждевременно - вернуть ответ с перенаправлением на вход в систему. Не изменяя содержание метода как такового, вы по-прежнему изменяете способ работы метода, меняя возвращаемое значение, которое оно могло бы дать в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...