Поиск по блогу

Tuesday, July 20, 2010

Концепция аспектно-ориентируемого программирования (AOP) "на пальцах".

  На сегодняшний момент существует несколько подходов программирования: процедурное, функциональное, объектно-ориентируемое (lat. OOP). Помимо этих трех существует так называемый аспектно-ориентированный подход (lat. AOP).
В этом Посте я сделаю тщетную попытку объяснить в чем заключается суть данного похода.
   Лучший, на мой взгляд, способ популярно объяснить непростые для понимания вещи - это провести аналогию с вещами понятными.

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



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

   Здесь так же важно понять, что действия судьи не зависят от действий Васи,  а действия Васи не зависят от действий судьи. Иными словами Вася и судьи ничего не знают друг о друге! Но при этом их работа выполняется в едином потоке событий - а именно в ходе проведения Олимпийских игр. В результате работы судей и спортсменов-бегунов мы получаем состоявшиеся соревнование с призерами и довольной публикой.

   Несмотря на то, что действия каждого в этой схеме разделены друг от друга, по отдельности их выполнение было бы бессмысленно. Например, давайте представим Васю, но без судей - Вася стартует, пробегает всю дистанцию, а зарегистрировать факт победы некому. Или наоборот - уберем теперь Васю и других спортсменов. Все судейство будет сидеть и ждать, когда кто-нибудь пересечет финишную черту.
   Итак, основная идея концепции AOP в разделении бизнес логики некоторого объекта от второстепенной(вспомогательной) логики других объектов, которые выносятся отдельной реализацией и именуются аспектами. Бизнес объект ничего не должен знать про аспектные объекты, которые его обслуживают.

   Чтобы стало чуть более понятно, давайте спроецируем наше соревнование на концепцию OOP. В этом случае Вася будет подробно знать о том, как реализована работа судей. Более того ,он должен будет выполнять за них их работу во время реализации своих непосредственных задач (Васе нужно добежать до финиша). Это выглядит довольно странно, но программируя с OOP мы так и поступаем. Мы пишем бизнес классы, которые помимо всего прочего выполняют в своей реализации бизнес логики логирование своих действий, обработку исключений и т.д.

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

Лучший способ не пропускать обновление блога - подписаться на RSS!

4 comments:

  1. Прикольная метафора. Картинки сам рисовал?

    ReplyDelete
  2. Да, сам. Взял пару фоток из гугла и дорисовал.

    ReplyDelete
  3. У вас беда с письменной речью - очень тяжело читать.

    ReplyDelete
  4. Спасибо за столь ценное замечание! Буду стараться писать лучше.

    ReplyDelete