Форум → Программирование → PHP для идиотов → AOP (Aspect-Oriented Programming)
AOP (Aspect-Oriented Programming)
-
8 февраля 2014 г. 7:46, спустя 25 дней 7 часов 53 минуты
В двух словах что за гавно? И зачемСапожник без сапог -
9 февраля 2014 г. 11:24, спустя 1 день 3 часа 37 минут
Есть некоторые стандартные вещи, которые нужно выполнять перед/после вызовом методов: например проверка прав доступа, логирование, загрузка данных из БД. И если что-то пошло не так - то может и не выполнять основной. В основном это касается экшенов контроллеров. И есть разные способы для решения этого вопроса.
1. тупо хуярим везде if (ololo) throw new TrololoException
2. используем аоп через аннотации - добавляем @Security("has_role('ROLE_SUPPLIER') AND has_role('ROLE_CONFIRMED_EMAIL')")
3. используем магически аоп, где-то конфигурируем, что мол такие методы должны быть обернуты и там эта проверка будет.
Я противник последнего подхода, хуй разберешь что где вызывается и почему оно так работает. А 2 активно используем -
9 февраля 2014 г. 12:19, спустя 55 минут 10 секунд
В питоне пункт 2 называется декораторы и используется повсеместно для аспектности
https://smappi.org/ - платформа по созданию API на все случаи жизни -
9 февраля 2014 г. 12:37, спустя 17 минут 59 секунд
3-ий метод самый правильный, он все-таки базируется на встроенных в язык средствах. Можно ввести префиксы в имена методов. типа:
$obj->cached_30m__methodName();
1-й вообще не рассматриваем, т.к. эксепшены надо использовать только для реальных исключительных ситуаций.
2-й завязан на использовании комментариев не для комментариев, если я правильно понял, что ИМХО ваще не кошерно.А в целом, да. В пыхе нет нормальных декораторов на уровне языка и тем он убог ... ))))
-
9 февраля 2014 г. 14: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
Мне кажется в пыхе тоже самое можно сделать, нет?
https://smappi.org/ - платформа по созданию API на все случаи жизни -
9 февраля 2014 г. 15:22, спустя 1 час 10 минут 30 секунд
Имхо, не вижу принципиальной разницы между 2-м и 3-м вариантами. Аннотации можно рассматривать как вид конфигов, сама Symfony и Doctrine тому пример. Хотя согласен, что в случае с аспектами, удобней именно аннотации (тоже имхо, конечно).
JMSAopBundle использую, но пока в рамках стандартных фишек Symfony (та же самая @Secure). А вообще подход охуительный: меньше сквозного функционала -> меньше дублирования -> щастье.
До GoAOP всё руки никак не доходят, но либа крайне интересная - насколько я знаю, она умеет больше чем JMSAop (например, перехват обращений к свойствам, статических или финальных методов) + не завязана на Symfony (JMSAop прибит к контейнеру).Спустя 602 сек.one = decor(one)
adw0rd, в пыхе «из коробки» такой возможности нет. -
9 февраля 2014 г. 15:54, спустя 31 минуту 50 секунд
Мне нравится подход 1 - потому что явно всё указано
В подходе 2 - не так гибко. конечно писинины может быт меньше намного, но когда используешь какой-то подход 2, потом нужно подключить подход 1, который начинает конфликтовать с логикой в 2, то тогда удаляется 2 и пишется special case.
Вообще всё зависит он того, что и как делает продук, если его логику нельзя абстрагировать какими-то уровнями - то начинается кавардак подхода 1. -
9 февраля 2014 г. 16: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? :) -
9 февраля 2014 г. 18:36, спустя 1 час 38 минут 38 секунд
@Timur & @adw0rd : это не подсветка синтаксиса косячит, дело в серверном парсере ббкода. В случае markdown, код оборачивается в:
<pre><code>
В случае использования bbcode и [ code ]:
<code>
Это результат серверного парсинга. highlight.js честно пытается разукрасить синтаксис, но стили настроены так, что код нормально выглядит только в <pre>. Проверено прямым редактированием HTML :)ιιlllιlllι унц-унц -
9 февраля 2014 г. 20: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], как было в старом форуме
https://smappi.org/ - платформа по созданию API на все случаи жизни -
9 февраля 2014 г. 22:44, спустя 1 час 53 минуты 38 секунд
Понял свою ошибку, я делал code/pre, а надо было наоборот. Пофиксил, теперь все хорошо?
https://smappi.org/ - платформа по созданию API на все случаи жизни -
9 февраля 2014 г. 22:47, спустя 3 минуты 29 секунд
все понял, спасибо всем. речь о декорировании функций. пхп убог в этом плане.
декорации есть везде кроме пхп и хуй с ним.
любителям не любить аннотации и магию, можно пойти по дорожке декорирования в прямом виде - пример с контроллером, экшен контроллера например UserController->homepage =:
return Security::requireLoggedIn($this->_homepage(func_get_args()));
для удобства можно как то более это обернуть еще интересно.
_homepage очевидно протектед функцияСапожник без сапог
Пожалуйста, авторизуйтесь, чтобы написать комментарий!