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

Поделись знанием:
Перейти к: навигация, поиск
Парадигмы программирования
 • Императивная
(контрастирует с декларативной)
Процедурная
Структурная
Аспектно-ориентированная
Объектно-ориентированная
Агентно-ориентированная
Компонентно-ориентированная
Прототипно-ориентированная
Обобщённое программирование

 • Декларативная
(контрастирует с императивной)

Чистота языка
Чистота функции
Функциональная
В терминах Рефал-машины
Аппликативная
Комбинаторная
Бесточечная
(чистая конкатенативная)
Логическая
Ограничениями

 • Конкатенативная
 • Векторная[en]
 • Метапрограммирование

Языково-ориентированная
Предметно-ориентированная
Пользователями[en]
Автоматизация процесса программирования
Рефлексивность
Гомоиконность[en]

 • Связанные темы

Программирование в крупном и мелком масштабе[en]
Модульность
Полиморфизм
Продолжения и CPS
Параллелизм и конкурентность

 • Методы и алгоритмы

Автоматное
Динамическое
Потоков данных
Событийно-ориентированное
Реактивное
Сервис-ориентированное

Аспе́ктно-ориенти́рованное программи́рование (АОП) — парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули.

Методология АОП была предложена группой инженеров исследовательского центра Xerox PARC под руководством Грегора Кичалеса (Gregor Kiczales). Ими же было разработано аспектно-ориентированное расширение для языка Java, получившее название AspectJ — (2001 год).





Обоснование

Существующие парадигмы программирования — процедурное, модульное, объектно-ориентированное программирование (ООП) и предметно-ориентированное проектирование — предоставляют определённые способы для разделения и выделения функциональности: функции, модули, классы, но некоторую функциональность с помощью предложенных методов невозможно выделить в отдельные сущности. Такую функциональность называют сквозной (от англ. scattered — разбросанный или англ. tangled — переплетённый), так как её реализация распределена по различным модулям программы. Сквозная функциональность приводит к рассредоточенному и запутанному коду, сложному для понимания и сопровождения.

Ведение лога и обработка исключений — типичные примеры сквозной функциональности. Другие примеры: трассировка; аутентификация и проверка прав доступа; контрактное программирование (в частности, проверка пред- и постусловий). Для программы, написанной в парадигме ООП, любая функциональность, по которой не была проведена декомпозиция, является сквозной.

Однако, как утверждают некоторые авторы[1], АОП может успешно применяться и для решения задач защиты, многопоточности, управления транзакциями и многих других.

Основные концепции

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

Основные понятия АОП:

  • Аспект (англ. aspect) — модуль или класс, реализующий сквозную функциональность. Аспект изменяет поведение остального кода, применяя совет в точках соединения, определённых некоторым срезом.
  • Совет (англ. advice) — средство оформления кода, которое должно быть вызвано из точки соединения. Совет может быть выполнен до, после или вместо точки соединения.
  • Точка соединения (англ. join point) — точка в выполняемой программе, где следует применить совет. Многие реализации АОП позволяют использовать вызовы методов и обращения к полям объекта в качестве точек соединения.
  • Срез (англ. pointcut) — набор точек соединения. Срез определяет, подходит ли данная точка соединения к данному совету. Самые удобные реализации АОП используют для определения срезов синтаксис основного языка (например, в AspectJ применяются Java-сигнатуры) и позволяют их повторное использование с помощью переименования и комбинирования.
  • Внедрение (англ. introduction, введение) — изменение структуры класса и/или изменение иерархии наследования для добавления функциональности аспекта в инородный код. Обычно реализуется с помощью некоторого метаобъектного протокола (англ. metaobject protocol, MOP).

Напишите отзыв о статье "Аспектно-ориентированное программирование"

Примечания

  1. [www.ibm.com/developerworks/ru/library/j-aopwork15 Мифы и реальности АОП] (рус.). IBM. Проверено 27 октября 2010. [www.webcitation.org/65EBPFcbU Архивировано из первоисточника 5 февраля 2012].

Ссылки

  • [www.javable.com/columns/aop/ «Аспектно-ориентированное программирование (с Валентином Павловым)»] (рус.). Проверено 28 октября 2010. [www.webcitation.org/65EBQ3KV5 Архивировано из первоисточника 5 февраля 2012].
  • [kolonitsky.org/blog/2011/11/aop/ Аспектно-ориентированное программирование] (рус.). Проверено 26 ноября 2011. [www.webcitation.org/65EBQyIiK Архивировано из первоисточника 5 февраля 2012].
  • [www.dmoz.org/Computers/Programming/Methodologies/Aspect-Oriented/ Open Directory Project] (англ.). — раздел АОП в каталоге. Проверено 28 октября 2010. [www.webcitation.org/65EBSMe6a Архивировано из первоисточника 5 февраля 2012].

Литература

Отрывок, характеризующий Аспектно-ориентированное программирование

Ежели первое время члены совета думали, что Кутузов притворялся спящим, то звуки, которые он издавал носом во время последующего чтения, доказывали, что в эту минуту для главнокомандующего дело шло о гораздо важнейшем, чем о желании выказать свое презрение к диспозиции или к чему бы то ни было: дело шло для него о неудержимом удовлетворении человеческой потребности – .сна. Он действительно спал. Вейротер с движением человека, слишком занятого для того, чтобы терять хоть одну минуту времени, взглянул на Кутузова и, убедившись, что он спит, взял бумагу и громким однообразным тоном начал читать диспозицию будущего сражения под заглавием, которое он тоже прочел:
«Диспозиция к атаке неприятельской позиции позади Кобельница и Сокольница, 20 ноября 1805 года».
Диспозиция была очень сложная и трудная. В оригинальной диспозиции значилось:
Da der Feind mit seinerien linken Fluegel an die mit Wald bedeckten Berge lehnt und sich mit seinerien rechten Fluegel laengs Kobeinitz und Sokolienitz hinter die dort befindIichen Teiche zieht, wir im Gegentheil mit unserem linken Fluegel seinen rechten sehr debordiren, so ist es vortheilhaft letzteren Fluegel des Feindes zu attakiren, besondere wenn wir die Doerfer Sokolienitz und Kobelienitz im Besitze haben, wodurch wir dem Feind zugleich in die Flanke fallen und ihn auf der Flaeche zwischen Schlapanitz und dem Thuerassa Walde verfolgen koennen, indem wir dem Defileen von Schlapanitz und Bellowitz ausweichen, welche die feindliche Front decken. Zu dieserien Endzwecke ist es noethig… Die erste Kolonne Marieschirt… die zweite Kolonne Marieschirt… die dritte Kolonne Marieschirt… [Так как неприятель опирается левым крылом своим на покрытые лесом горы, а правым крылом тянется вдоль Кобельница и Сокольница позади находящихся там прудов, а мы, напротив, превосходим нашим левым крылом его правое, то выгодно нам атаковать сие последнее неприятельское крыло, особливо если мы займем деревни Сокольниц и Кобельниц, будучи поставлены в возможность нападать на фланг неприятеля и преследовать его в равнине между Шлапаницем и лесом Тюрасским, избегая вместе с тем дефилеи между Шлапаницем и Беловицем, которою прикрыт неприятельский фронт. Для этой цели необходимо… Первая колонна марширует… вторая колонна марширует… третья колонна марширует…] и т. д., читал Вейротер. Генералы, казалось, неохотно слушали трудную диспозицию. Белокурый высокий генерал Буксгевден стоял, прислонившись спиною к стене, и, остановив свои глаза на горевшей свече, казалось, не слушал и даже не хотел, чтобы думали, что он слушает. Прямо против Вейротера, устремив на него свои блестящие открытые глаза, в воинственной позе, оперев руки с вытянутыми наружу локтями на колени, сидел румяный Милорадович с приподнятыми усами и плечами. Он упорно молчал, глядя в лицо Вейротера, и спускал с него глаза только в то время, когда австрийский начальник штаба замолкал. В это время Милорадович значительно оглядывался на других генералов. Но по значению этого значительного взгляда нельзя было понять, был ли он согласен или несогласен, доволен или недоволен диспозицией. Ближе всех к Вейротеру сидел граф Ланжерон и с тонкой улыбкой южного французского лица, не покидавшей его во всё время чтения, глядел на свои тонкие пальцы, быстро перевертывавшие за углы золотую табакерку с портретом. В середине одного из длиннейших периодов он остановил вращательное движение табакерки, поднял голову и с неприятною учтивостью на самых концах тонких губ перебил Вейротера и хотел сказать что то; но австрийский генерал, не прерывая чтения, сердито нахмурился и замахал локтями, как бы говоря: потом, потом вы мне скажете свои мысли, теперь извольте смотреть на карту и слушать. Ланжерон поднял глаза кверху с выражением недоумения, оглянулся на Милорадовича, как бы ища объяснения, но, встретив значительный, ничего не значущий взгляд Милорадовича, грустно опустил глаза и опять принялся вертеть табакерку.
– Une lecon de geographie, [Урок из географии,] – проговорил он как бы про себя, но довольно громко, чтобы его слышали.
Пржебышевский с почтительной, но достойной учтивостью пригнул рукой ухо к Вейротеру, имея вид человека, поглощенного вниманием. Маленький ростом Дохтуров сидел прямо против Вейротера с старательным и скромным видом и, нагнувшись над разложенною картой, добросовестно изучал диспозиции и неизвестную ему местность. Он несколько раз просил Вейротера повторять нехорошо расслышанные им слова и трудные наименования деревень. Вейротер исполнял его желание, и Дохтуров записывал.