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

AOP (Aspect-Oriented Programming)

  • Абырвалг

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

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

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

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

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

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

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

    Сообщения: 6477 Репутация: 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

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

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

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

    adw/0
  • AlexB

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

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

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

    $obj->cached_30m__methodName();
    

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

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

  • adw0rd

    Сообщения: 22902 Репутация: 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

    Сообщения: 5201 Репутация: 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

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

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

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

    <pre><code>

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

    <code>

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

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

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

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

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

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

    ('code', '<code><pre>%(value)s</pre></code>'),
    

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

    adw/0
  • adw0rd

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

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

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

    adw/0
  • phpdude

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

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

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

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

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

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

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

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

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