Предпринял несколько попыток проникнуться этой идеей, после очередной мне начало казаться, что у меня это получается. Попытка предпринималась на основе AspectS.

Для начала. Несмотря на громкое название с -oriented-, эта область знаний представляет собой, скорее, расширение объектно-ориентированного программирования/проектирования. Придумано, опять же в (surprise!) XeroxPARC

Предполагается, что в сложных системах встречаются "пересекающиеся" концепции. Любимый адептами AOP пример - логгинг. Вещь, напрямую никак не связанная с дизайном средней системой, но необходимая. Чтобы ее обеспечить, приходится искривлять дизайн. Путь AOP: предоставить средства для описания таких "внешних" по отношению к дизайну сущностей. Для этого требуется модификация средства программирования.

Для Java это AspectJ (кажется, это первое средство поддержки ставшее доступное широким массам), для Smalltalk - AspectS. AspectJ представляет собой компилятор с отличного от Java языка (расширенного средствами определения аспектов), из которого так или иначе получается Java bytecode. Процесс вставки аспектов (weaving) осуществляется статически при сборке системы. AspectS для описания аспектов использует выразительные возможности самого Smalltalk и пользуется метамоделью для вставки аспектов (MethodWrappers). Weaving динамический.

Немного терминологии. Строго определенную точку взаимодействия в коде называем join point (например, это может быть вызов метода определенного класса). Набор join point будем называть pointcut. Pointcutу ставятся в соответствие действия, которые должны выполняться при наступлении pointcut. Действия могут выполняться до вызова метода, после него, вместо него, вокруг него, могут представлять собой обработку исключительных ситуаций, происходящих в методе. Каким-то образом может даже осуществляться расширение класса метода.

При описании pointcut можно указывать дополнительные условия. Например, в AspectS аспект может относиться не только к классам, но и к конкретным экземплярам классов, может учитываться источник вызова (на уровне класса или экземпляра) или вообще стек вызова.

Advice это pointcut + действия + модификаторы (когда точно срабатывает pointcut)

Aspect это набор advice.

В AspectS аспект - это класс, содержащий методы, возвращающие Advice. Для weavingа нужно создать экземпляр аспекта и сказать ему install. Разумеется, есть и unistall.


Несмотря на то, что с техникой все более или менее понятно, непонятным оставалось, зачем это нужно и как этим пользоваться. Пример с логгингом напрочь навяз в зубах и не производил впечатление серьезного обоснования использования аспектов. Для меня проблема состояла в основном в том, чтобы понять, зачем мне может это понадобиться. С тех пор было найдено еще несколько возможных применений: Дальше уже мои идеи
Реалии применения.

Аспекты связывают с концепциями generative programming - разработки, ориентированной на создание линий продуктов. В этом случае, результирующий продукт получается путем скрещивания ортогональных концепций, "смешивания" дизайнов. Возможно, это может сработать.

Я готов был бы попробовать поприменять аспекты, но могут возникнуть проблемы с поддержкой этого кода. Увы, в среде, где еще не до конца постигнуто старое доброе ОО, еще одна такая концепция вряд ли может быть осознана достаточно быстро. Отсутствуют наработанные паттерны их применения. А средств, позволяющих написать совершенно неуправляемый код, аспекты предоставлят много.

Необходима поддержка в средах программирвания. IntelliJ Idea в ближайшей версии будет поддерживать аспекты, Squeak Smalltalk тоже поддерживает их. Вообще говоря, поддержка в средах Smalltalk не представляет особых сложностей.



Hosted by uCoz