<<
>>

Программирование на аспектноориентированном языке AspectJ

Рассмотрим простой класс на языке Java, содержащий два метода, которые печатают сообщения. Позднее мы создадим несколько аспектов, расширяющих его поведение без модификации класса:

Программирование на аспектно-ориентированном языке AspectJ

515

Класс MessageCommunicator имеет два метода: один для доставки общего сообщения, а другой для доставки сообщения конкретному человеку

Рассмотрим функциональность аутентификации: перед доставкой сообщения вы хотели ли бы проверить, был ли аутентифицирован пользователь.

Без использования АОП пришлось бы написать следующий код:

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

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

Без изменения содержания класса MessageCommunicator его функциональность можно увеличить добавлением к программе аспекта:

Класс Authenticator запрашивает полномочия (имя пользователя и пароль), когда в потоке метод authenticate() вызывается первый раз. При успешной аутентификации класс сохраняет пользователя в локальной области потока; таким образом, в этом потоке полномочия повторно не запрашиваются. При ошибке генерируется исключение периода выполнения.

Рассмотрим содержание аспекта более детально:

1. Аспект — это основной модуль в АОП, подобно тому, как класс — основной модуль в ООП. Объявление аспекта подобно объявлению класса.

516 Глава 16. Объектно-ориентированное и аспектно-ориентированное программирование

1. Срез выделяет в процессе выполнения программы необходимые точки, называемые точками соединения. Аспект определяет срез secureAccess(), который выделяет процессы выполнения всех методов с именем deliver() из класса MessageCommunicator. Символ * указывает, что срез сопоставляется с любым возвращаемым типом, а две точки внутри круглых скобок (..) после deliver определяют, что срез сопоставляется с любым количеством и типами параметров. В этом примере срез выбирает процессы выполнения обеих перегруженных версий deliver() в классе MessageCommunicator.

2. Совет определяет код, который должен быть выполнен при достижении точек соединения, выделенных соответствующим срезом. Здесь записан совет, который должен выполняться перед достижением точек соединения, выбранных срезом secureAccess(). Предложение before() указывает, что совет должен быть запущен прежде выполнения точки соединения, определяемой советом, — в данном случае прежде выполнения любого метода MessageCommunicator. deliver(). Цель данного совета: провести аутентификацию текущего пользователя. Присутствие в программе этого аспекта гарантирует, что перед каждым выполнением метода MessageCommunicator.deliver() код совета реализует логику аутентификации.

Перейдем к обзору основных строительных блоков языка AspectJ.

<< | >>

Еще по теме Программирование на аспектноориентированном языке AspectJ:

  1. О языке и методе
  2. Установки — на естественном языке внутренней речи.
  3. Установки — на естественном языке внутренней речи.
  4. Формулировать задание внутренней природе организма следует на языке души
  5. Основной курс (Программирование)
  6. Иванова Г.С. Основы программирования, 2002
  7. Эстетика программирования
  8. Г.С.Иванова, Т.Н.Ничушкина, Е.К.Пугачев. Объектно- ориентированное программирование, 2001
  9. О. Л. Голицына, Т. Л. Партыка, И. И. Попов. ЯЗЫКИ ПРОГРАММИРОВАНИЯ, 2008
  10. Часть вторая Родительское программирование