Зайдите на любой хабр - и вы немедленно обнаружите холивар, посвященный использованию аспетного программирования. Те ушаты дерьма, выливаемые на аспекты, сравнимы только с тоннами фекалий, выливаемых на триггеры баз данных.
Возмущеное почтенной публики понятно. Аспекты скрывают от разработчика часть логики, выполняемой неявно. Но тут есть один ньанс, как говорил Василий Иванович Петьке в неприличном анекдоте. Практически вся логика такого популярного фреймворка как Spring базируется на аспектах. Вы же не впадаете в истерику, увидев аннотацию @Transactional над методом или классом. Значит, дело в несколько ином, нежели просто сокрытие логики от посторонних глаз.
Уже слышу крики "да по поводу Spring есть столько материалов, что хоть обчитайся !!". Ага, ну то есть первый момент, который несколько реабилитирует аспекты - это наличие подробной документации. Не секрет, что гении и гики, засевшие в разработке, обожают придумать что-нибудь этакое красивенькое, задеплоить его в кодовую базу компании, для которой ПО - всего лишь вспомогательный инструмент для бизнеса, а отнюдь не бизнес, и при этом напрочь забить на хотя бы минимальную документацию для коллег. Социопаты, чо...
Я попробую разобрать ряд примеров из недр пластов породы, в которых погребен мой скелет. Примеров совсем плохого подхода, примеров более лучшего подхода ну и некоторые альтернативы. Дальше все на Java.
Пример первый, поучательный
Возьмем и напишем какой-нибудь компонентик с тупейшей функциональностью
@Component
public class DummyClass {
public void singTheSong(String what) {
System.out.printf("Выплывают расписные %s%n", what);
}
}
А вдобавок к нему напишем аспектик с не менее тупой функциональностью
@Component
@Aspect
public class DummyAspect {
@Pointcut("execution(public * org.nda.osp.fw.*.*(..))")
public void callForAll() { }
@After("callForAll()")
public void endTheSong() {
System.out.println("Стеньки Разина челны");
}
}
И вроде бы все ничего
@Autowired
public DummyClass component;
@Test
public void xtest() {
component.singTheSong("острогрудые челны");
}
Выплывают расписные острогрудые челны
Стеньки Разина челны
Аспектик уточнаяет нам, что челны принадлежат шайке (или ватаге ?) знаменитого борца за щастье трудового норота бандита с волжских просторов Степана Тимофеича. Только вот спецификация, зашитая в Pointcut, будет делать такие уточнения для любого публичного метода любого класса, расположенного в пакете org.nda.osp.fw. Как в сказке про кота в сапогах - все экспроприируется в пользу Маркиза Карабаса, то есть Степана Разина.
Если, конечно, нашей целью и являлся этот грабеж с большой дороги, то все правильно. Но вот представьте себе, что кончепция поменялась. И к некоторым новым классам в этом пакете сей принцип неприменим. Добро если вы имеете доступ к исходнику библиотеки, в которой этот аспект сделан и вам вообще позволят что-то там менять (работали когда-нибудь в зеленом банке ? сходите, узнаете, что всякое дело можно сделать через опу). Более того, обнаружить, где сидит такой аспект и то, что он вообще существует - это задача совершенно не для Junior - и даже не для каждого Middle - разработчика.
Подробнее https://coding-balagan.livejournal.com/455.html...