Я опаздываю к игре, но я предоставляю это для будущих разработчиков, которые могут наткнуться на этот вопрос.
Я бы настоятельно рекомендовал против AOP, если ваше приложение зависит от его правильной работы. Аспекты работают так:
- Совет (дополнительное поведение) применяется к
- Точки соединения (места, где можно прикрепить дополнительный код, например, начало или конец метода или когда срабатывает данное событие)
- ... где pointcut (шаблон, который определяет, соответствует ли данная точка соединения) шаблоны
Для тех, кто давно занимается компьютерами, тот факт, что шаблоны используются, может быть чем-то, на что стоит обратить пристальное внимание. Итак, вот пример pointcut, который соответствует любому методу с именем set
независимо от аргументов:
call(* set(..))
Так что это довольно широкая точка отсчета, и должно быть ясно, что рекомендуется обращаться с этим осторожно (не каламбур), потому что вы применяете советы ко многим вещам.
Или, чёрт возьми, давайте применять советы ко всему , независимо от имени или подписи!
execution(* *(..))
Ясно, что мы должны быть осторожны, потому что здесь много силы, но это не аргумент против аспектов - это аргумент для осторожности, потому что здесь много силы, и сопоставление с образцом может легко пойти наперекосяк (просто нажмите ваш любимый поисковик для ао жучки и веселиться).
Итак, вот что выглядит как относительно безопасный pointcut:
pointcut setter(): target(Point) &&
( call(void setX(int)) ||
call(void setY(int)) );
Это явно дает совет, если найдены методы с именем setX
или setY
для Point
объекта. Методы могут только получать int
s, и они должны быть void
. Выглядит довольно безопасно, верно? Ну, это безопасно, если эти методы существуют, и вы применили правильный совет. Если нет, то тоже плохо; это молча терпит неудачу.
В качестве примера, друг пытался отладить Java-приложение, в котором время от времени все возвращали неверные данные. Это был нечастый сбой, и, похоже, он не коррелировал с каким-либо конкретным событием или данными в частности. Это была многопоточная ошибка, которую сложно проверить или обнаружить. Оказывается, они использовали аспекты, чтобы заблокировать методы и сделать их «потокобезопасными», но программист переименовал метод, и pointcut не смог сопоставить его, что привело к тихой поломке приложения.
Таким образом, я говорю людям, что если они должны использовать AOP для обработки таких аспектов, как исключения: в хорошо спроектированной системе, и если ничего не происходит, их можно удалить, и программное обеспечение по-прежнему функционирует правильно. Однако, если функциональность программы зависит от АОП, вы вводите хрупкость в вашу программу, которая неоправданна.
Таким образом, ведение журнала, отладка и трассировка являются отличными примерами поведения, которое идеально подходит для аспектов, но для безопасности? Нет. Поток безопасности? Нет.
Для надежной альтернативы АОП см. Черты . Вместо того, чтобы привязываться к языку, они напрямую интегрируются в него, не нуждаются в IDE «с учетом особенностей» (хотя это может помочь) и имеют сбои во время компиляции, если требуемые методы отсутствуют. Черты намного лучше справляются с разделением интересов, потому что проблема была лучше определена с самого начала. Я использую их широко, и они фантастические.