Я думаю, что самая большая проблема в том, что никто не знает , как определить семантику аспекта , или , как объявить точки соединения непроцедурно .
Если вы не можете определить, что аспект делает независимо от контекста, в который он будет встроен, или определить эффекты, которые он оказывает таким образом, чтобы он не повредил контекст, в который он встроен, вы (и инструменты) не могут рассуждать о том, что он делает надежно. (Вы заметите, что наиболее распространенным примером аспектов является «ведение журнала», которое определяется как «записать некоторые данные в поток журнала, о котором приложение ничего не знает», потому что это довольно безопасно). Это нарушает ключевое представление Дэвида Парнаса о скрытой информации . Один из худших примеров аспектов, которые я вижу, - это вставка примитивов синхронизации в код; это влияет на последовательность возможных взаимодействий, которые может иметь код. Как вы можете знать, что это безопасно (не будет взаимоблокировка? Не будет живая блокировка? Не будет защищена? Может быть восстановлена перед лицом исключительного исключения в партнере синхронизации?), Если приложение уже выполняет только тривиальные вещи.
Точки соединения теперь обычно определяются путем предоставления какого-либо подстановочного знака идентификатора (например, «поместите этот аспект в любой метод с именем« DataBaseAccess * ». Чтобы это работало, люди, пишущие затронутые методы, должны сообщить о намерении их код, который может быть конкретизирован путем смешного именования их кода, это вряд ли является модульным. Хуже того, почему жертва аспекта должна даже знать, что он существует? И подумайте, что произойдет, если вы просто переименуете некоторые методы; аспект больше не будет Внедрены, где это необходимо, и ваше приложение ломается. Что необходимо, это спецификации точки соединения, которые преднамеренные , так или иначе, аспект должен знать, где это необходимо, без того, чтобы программисты размещали неоновые вывески в каждой точке использования. . (У AspectJ есть некоторые точки соединения, связанные с потоком управления, которые кажутся немного лучше в этом отношении).
Так что аспекты - это довольно интересная идея, но я думаю, что они технологически незрелые. И эта незрелость делает их использование хрупким. И вот в чем проблема.
(Я большой поклонник автоматизированных программных средств разработки [см. Мою биографию], просто не так).