ФорумПрограммированиеPHP для идиотов → AOP (Aspect-Oriented Programming)

AOP (Aspect-Oriented Programming)

  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 13 января 2014 г. 11:53

    Привет братишки!

    Кто использует сабж? В каком виде: явно (JMSAopBundle https://github.com/schmittjoh/JMSAopBundle/blob/master/Resources/doc/index.rst / SensioFrameworkExtraBundle) или магически ( http://go.aopphp.com/ )? Для каких именно целей используете? Или почему не используете?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 7 февраля 2014 г. 19:46, спустя 25 дней 7 часов 53 минуты

    В двух словах что за гавно? И зачем
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 8 февраля 2014 г. 23:24, спустя 1 день 3 часа 37 минут

    Есть некоторые стандартные вещи, которые нужно выполнять перед/после вызовом методов: например проверка прав доступа, логирование, загрузка данных из БД. И если что-то пошло не так - то может и не выполнять основной. В основном это касается экшенов контроллеров. И есть разные способы для решения этого вопроса.

    1. тупо хуярим везде if (ololo) throw new TrololoException
    2. используем аоп через аннотации - добавляем @Security("has_role('ROLE_SUPPLIER') AND has_role('ROLE_CONFIRMED_EMAIL')")
    3. используем магически аоп, где-то конфигурируем, что мол такие методы должны быть обернуты и там эта проверка будет.

    Я противник последнего подхода, хуй разберешь что где вызывается и почему оно так работает. А 2 активно используем
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 9 февраля 2014 г. 0:19, спустя 55 минут 10 секунд

    В питоне пункт 2 называется декораторы и используется повсеместно для аспектности

    adw/0
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 9 февраля 2014 г. 0:37, спустя 17 минут 59 секунд

    3-ий метод самый правильный, он все-таки базируется на встроенных в язык средствах. Можно ввести префиксы в имена методов. типа:

    $obj->cached_30m__methodName();
    

    1-й вообще не рассматриваем, т.к. эксепшены надо использовать только для реальных исключительных ситуаций.
    2-й завязан на использовании комментариев не для комментариев, если я правильно понял, что ИМХО ваще не кошерно.

    А в целом, да. В пыхе нет нормальных декораторов на уровне языка и тем он убог ... ))))

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 9 февраля 2014 г. 2:11, спустя 1 час 34 минуты 7 секунд

    Ну по идее, декоратор это только сахар. Можно явно оборачивать функции в конце файла, типа того:

    def decor(func):
        def wrapper(*args):
            return func(*args) + 1
        return wrapper
    
    def one(a, b, c):
        return 42
    
    one = decor(one)
    

    Получился простейший декоратор

    In [4]: one(1, 2, 3)
    Out[4]: 43
    

    Мне кажется в пыхе тоже самое можно сделать, нет?

    adw/0
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2014 г. 3:22, спустя 1 час 10 минут 30 секунд

    Имхо, не вижу принципиальной разницы между 2-м и 3-м вариантами. Аннотации можно рассматривать как вид конфигов, сама Symfony и Doctrine тому пример. Хотя согласен, что в случае с аспектами, удобней именно аннотации (тоже имхо, конечно).

    JMSAopBundle использую, но пока в рамках стандартных фишек Symfony (та же самая @Secure). А вообще подход охуительный: меньше сквозного функционала -> меньше дублирования -> щастье.

    До GoAOP всё руки никак не доходят, но либа крайне интересная - насколько я знаю, она умеет больше чем JMSAop (например, перехват обращений к свойствам, статических или финальных методов) + не завязана на Symfony (JMSAop прибит к контейнеру).

    Спустя 602 сек.

    one = decor(one)

    adw0rd, в пыхе «из коробки» такой возможности нет.
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2014 г. 3:54, спустя 31 минуту 50 секунд

    Мне нравится подход 1 - потому что явно всё указано
    В подходе 2 - не так гибко. конечно писинины может быт меньше намного, но когда используешь какой-то подход 2, потом нужно подключить подход 1, который начинает конфликтовать с логикой в 2, то тогда удаляется 2 и пишется special case.
    Вообще всё зависит он того, что и как делает продук, если его логику нельзя абстрагировать какими-то уровнями - то начинается кавардак подхода 1.
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2014 г. 4:57, спустя 1 час 3 минуты 33 секунды

    adw0rd, в пыхе «из коробки» такой возможности нет.

    @Timur,

    хотя, на замыканиях что-то подобное можно соорудить, но это немного не то :)

    function decor($func) {
    return function () use ($func) {
    return $func(func_get_args()) + 1;
    }
    };

    $one = function ($a, $b, $c) {
    return 42;
    };

    $one = decor($one);
    echo $one(1, 2, 3);


    Спустя 219 сек.

    А парсер подстветки удаляет отступы только в PHP? :)
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 9 февраля 2014 г. 6:36, спустя 1 час 38 минут 38 секунд

    @Timur & @adw0rd : это не подсветка синтаксиса косячит, дело в серверном парсере ббкода. В случае markdown, код оборачивается в:

    <pre><code>

    В случае использования bbcode и [ code ]:

    <code>

    Это результат серверного парсинга. highlight.js честно пытается разукрасить синтаксис, но стили настроены так, что код нормально выглядит только в <pre>. Проверено прямым редактированием HTML :)
    ιιlllιlllι унц-унц
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 9 февраля 2014 г. 8:50, спустя 2 часа 14 минут 14 секунд

    Смотрите, в ббкодах поддерживаются такие коды как:

    ###
    (&#39;sql&#39;, &#39;&lt;code>&lt;pre class=&quot;sql&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;php&#39;, &#39;&lt;code>&lt;pre class=&quot;php&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;python&#39;, &#39;&lt;code>&lt;pre class=&quot;python&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;ruby&#39;, &#39;&lt;code>&lt;pre class=&quot;ruby&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;perl&#39;, &#39;&lt;code>&lt;pre class=&quot;perl&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;lua&#39;, &#39;&lt;code>&lt;pre class=&quot;lua&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;bash&#39;, &#39;&lt;code>&lt;pre class=&quot;bash&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;c&#39;, &#39;&lt;code>&lt;pre class=&quot;c&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;cpp&#39;, &#39;&lt;code>&lt;pre class=&quot;cpp&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;cs&#39;, &#39;&lt;code>&lt;pre class=&quot;cs&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;c#&#39;, &#39;&lt;code>&lt;pre class=&quot;cs&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;csharp&#39;, &#39;&lt;code>&lt;pre class=&quot;cs&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;objectivec&#39;, &#39;&lt;code>&lt;pre class=&quot;objectivec&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;objective-c&#39;, &#39;&lt;code>&lt;pre class=&quot;objectivec&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;objc&#39;, &#39;&lt;code>&lt;pre class=&quot;objectivec&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;obj-c&#39;, &#39;&lt;code>&lt;pre class=&quot;objectivec&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;java&#39;, &#39;&lt;code>&lt;pre class=&quot;java&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;scala&#39;, &#39;&lt;code>&lt;pre class=&quot;scala&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;haskell&#39;, &#39;&lt;code>&lt;pre class=&quot;haskell&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;erlang&#39;, &#39;&lt;code>&lt;pre class=&quot;erlang&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;erl&#39;, &#39;&lt;code>&lt;pre class=&quot;erlang&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;golang&#39;, &#39;&lt;code>&lt;pre class=&quot;go&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;go&#39;, &#39;&lt;code>&lt;pre class=&quot;go&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;lisp&#39;, &#39;&lt;code>&lt;pre class=&quot;lisp&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;clojure&#39;, &#39;&lt;code>&lt;pre class=&quot;clojure&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;smalltalk&#39;, &#39;&lt;code>&lt;pre class=&quot;smalltalk&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;html&#39;, &#39;&lt;code>&lt;pre class=&quot;html&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;css&#39;, &#39;&lt;code>&lt;pre class=&quot;css&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;javascript&#39;, &#39;&lt;code>&lt;pre class=&quot;javascript&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;js&#39;, &#39;&lt;code>&lt;pre class=&quot;javascript&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;actionscript&#39;, &#39;&lt;code>&lt;pre class=&quot;actionscript&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;coffeescript&#39;, &#39;&lt;code>&lt;pre class=&quot;coffeescript&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;diff&#39;, &#39;&lt;code>&lt;pre class=&quot;diff&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;xml&#39;, &#39;&lt;code>&lt;pre class=&quot;xml&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;ini&#39;, &#39;&lt;code>&lt;pre class=&quot;ini&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    (&#39;json&#39;, &#39;&lt;code>&lt;pre class=&quot;json&quot;>%(value)s&lt;/pre>&lt;/code>&#39;),
    

    Как видите они оборачиваются в pre+code, я сейчас добавлю конечно чтобы code оборачивался примерно так:

    (&#39;code&#39;, &#39;&lt;code>&lt;pre>%(value)s&lt;/pre>&lt;/code>&#39;),
    

    Но вы могли и ранее оборачивать в [php], как было в старом форуме

    adw/0
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 9 февраля 2014 г. 10:44, спустя 1 час 53 минуты 38 секунд

    Понял свою ошибку, я делал code/pre, а надо было наоборот. Пофиксил, теперь все хорошо?

    adw/0
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 9 февраля 2014 г. 10:47, спустя 3 минуты 29 секунд

    все понял, спасибо всем. речь о декорировании функций. пхп убог в этом плане.

    декорации есть везде кроме пхп и хуй с ним.

    любителям не любить аннотации и магию, можно пойти по дорожке декорирования в прямом виде - пример с контроллером, экшен контроллера например UserController->homepage =:

    return Security::requireLoggedIn($this->_homepage(func_get_args()));

    для удобства можно как то более это обернуть еще интересно.

    _homepage очевидно протектед функция
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!