Аспектно-ориентированное программирование

Аспектно-ориентированное программирование

Coding

Аспектно-ориентированное программирование (АОП) – относительно новая парадигма программирования, появившаяся в начале этого тысячелетия.

Можно долго думать и гадать, а что же такое АОП, и какие цели преследовали те самые сотрудники Xerox, которые ее разрабатывали.

Обратите внимание, как заметно отличается объем статьи в Википедии, кратко повествующей об АОП от объема статьи про объектно-ориентированное программирование (ООП), концепции которого известны практически всем разработчикам программного обеспечения?

Ну да, АОП, судя по тексту, призвано упростить процесс разделения целевой и второстепенной функциональности, которую здесь называют сквозной.

Но ведь одной из главных целей создания всех парадигм программирование, и ООП в том числе, является абстрагирование программиста от специфики общения с вычислительной техникой и концентрация его аналитических усилий на целевой функциональности создаваемой им программы. Т.е. на первый взгляд ничего нового.

С ООП ведь все всем понятно: есть реальный мир, есть объекты реального мира, есть их функциональные и информационные аспекты. С какой стати в общении с вычислительной машиной мы должны обходиться банальными последовательностями операторов, хоть и сгруппированных в процедуры и функции и размещенных в отдельных модулях? Вот и решили ввести в языки программирования понятие объект с его свойствами, методами, инкапсуляцией и т.д. А там мысль уже было не остановить, и появились наследование, полиморфизм, шаблоны и т.п.

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

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

Возможно даже такое, что кто-нибудь, видя аббревиатуру АОП, думает, что это опечатка.

Приведу пару примеров из жизни и затем “притяну их за уши” к философии рассматриваемой парадигмы.

Рассмотрим, к примеру, процесс приема пищи. Цель этого процесса всем понятна, но его окружение может быть весьма разнообразным, например: обед дома, обед в ресторане и обед в заведении с самообслуживанием, например в столовой. Окружение диктует свои правила, и эти правила, если следовать терминологии АОП, являют собой аспект окружения целевого действа.

В первом случае до приема пищи вы ее должны купить в магазине и приготовить, а то, что происходит после приема – определяется особенностями поведения индивида.

Во втором случае: приходим, изучаем меню и делаем заказ. После платим по счету и, возможно, оставляем “на чай” официанту.

В третьем случае сначала стоим в очереди с подносом, потом оплачиваем то, что показалось нам съедобным, а то, что происходит после завершения основного процесса, как и в первом случае, никем не регламентируется, разве что в некоторых местах заставляют убирать за собой. Вот три разных контекста, три разных окружения или три разных аспекта целевого процесса приема пищи. И именно методику отделения целевой функциональности от функциональности аспекта окружения - сквозной функциональности предлагает АОП. Аналогично можно привести примеры различных аспектов окружения, рассмотрев процесс покупки чего-либо, например: в магазине, в интернете или на аукционе.


Также, особенности пребывания в конкретной стране за пределами родины можно отнести к сквозной функциональности по отношению к самой туристической поездке.

Последний пример даже более наглядный, поскольку в этом случае аспект вбирает в себя все особенности нашего окружения в процессе того, как мы делаем покупки, ужинаем в ресторане или занимаемся еще чем-либо за рубежом.

Например, то, что мы общаемся с людьми - является целевой функциональностью, а то, что нам приходится делать это на иностранном языке – сквозной функциональностью аспекта пребывания в конкретной стране.

На самом деле любые примеры можно назвать удачными или неудачными и с любыми примерами спорить. Вызвано это тем, что в реальном мире мы постоянно меняем окружение и сами не замечаем, как принимаем правила каждого нового аспекта. 

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

Как говорят сами авторы, в первую очередь к сквозной функциональности любого программного окружения следует относить такие вещи, как ведение журналов операций (трассировки) и журналов исключительных ситуаций, авторизацию пользователей и процесс проверки прав доступа, форматирование текстовых сообщений, процедуры управления памятью и формирования “КЭШа” часто используемых данных, а также, выделение прочих вычислительных ресурсов. Не буду здесь приводить терминологию АОП, поскольку как раз эта часть в достаточной мере отражена в той же Википедии, но все же отмечу, что для основных объектно-ориентированных языков программирования уже разработаны расширения, позволяющие реализовывать концепции аспектно-ориентированного программирования на практике.

К ним относятся AspectJAspect.NETAspectC++ и т.д.

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

В противном случае ему остается о них только догадываться, хотя основное преимущество применения АОП - декомпозиция функциональности на целевую и сквозную - мой программный код приобретает.

В этой связи можно считать, что применение аспектно-ориентированного программирования – это еще один современный прием рефакторинга кода, классические методы которого рассмотрены в одноименной статье.

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

Report Page