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

231

Я понимаю объектно-ориентированное программирование и давно пишу ОО-программы. Люди, кажется, говорят о аспектно-ориентированном программировании, но я так и не узнал, что это такое и как его использовать. Какова основная парадигма?

Этот вопрос связан, но не совсем его задает:

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

Софи
источник
5
IMAO, ссылка, представленная в вопросе, имеет более четкий и полный ответ, чем принятая здесь. Люди, читающие этот вопрос, могут прочитать его в первую очередь.
Дэвид Чен

Ответы:

198

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

function mainProgram()
{ 
   var x =  foo();
   doSomethingWith(x);
   return x;
}

aspect logging
{ 
    before (mainProgram is called):
    { 
       log.Write("entering mainProgram");
    }

    after (mainProgram is called):
    { 
       log.Write(  "exiting mainProgram with return value of "
                  + mainProgram.returnValue);
    }
 } 

aspect verification
{ 
    before (doSomethingWith is called):
    { 
       if (doSomethingWith.arguments[0] == null) 
       { 
          throw NullArgumentException();
       }

       if (!doSomethingWith.caller.isAuthenticated)
       { 
          throw Securityexception();
       }
    }
 }

А затем используется аспект-ткач, чтобы скомпилировать код в это:

function mainProgram()
{ 
   log.Write("entering mainProgram");

   var x = foo();   

   if (x == null) throw NullArgumentException();
   if (!mainProgramIsAuthenticated()) throw Securityexception();
   doSomethingWith(x);   

   log.Write("exiting mainProgram with return value of "+ x);
   return x;
} 
Марк Сидаде
источник
14
Вам нужна языковая поддержка для этого? На каком языке ваш пример?
Софи
8
Это псевдокод, но наиболее известным примером является AspectJ, представляющий собой AOP-модификацию Java, которая использует похожую технику, называемую cutpoints.
Марк Сидаде
71
Voodoo. И я думал, что ООП было излишним.
Эйден Белл
17
Марк, это как украшать точки входа и выхода метода?
Филипп Дупанович
3
@AidenBell Если невидимое действие на расстоянии можно считать вуду, то да, это вуду. Под метапрограммированием Moose именно такие модификаторы, как до, после, вокруг, внутри, увеличивают . Это затемняет поток выполнения программы. Это может быть почти невозможно отследить, особенно если они основаны на версии аспектов этой системы, которые она называет ролями . Со всем этим можно создавать системы ошеломляющей сложности.
1954 года
13

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

Я возлагаю надежды на композитно-ориентированное программирование , которое становится все более и более реалистичным. Это связано со многими популярными идеями и дает вам что-то действительно классное.

Посмотрите на готовую реализацию здесь: qi4j.org/

PS. На самом деле, я думаю, что одна из красот AOP - это ахиллесова пята: она не навязчива, позволяя людям игнорировать ее, если может, поэтому в большинстве организаций это будет рассматриваться как второстепенная проблема.

Хьюго
источник
8

Скопировано из дубликата для полноты (Эйнштейн):

Классическими примерами являются безопасность и логирование. Вместо того, чтобы писать код в вашем приложении для регистрации вхождения x или проверки объекта z для контроля безопасного доступа, существует языковая концепция «внеполосного» нормального кода, которая может систематически внедрять безопасность или входить в подпрограммы, которые не имеют их в нативном виде. таким образом, что, хотя ваш код не предоставляет его - об этом позаботились.

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

Если вы считаете, что вам нужен AOP в моем опыте, вам действительно нужно вкладывать больше времени и усилий в надлежащее управление метаданными в вашей системе, уделяя особое внимание продуманному проектированию конструкций / систем.

paxdiablo
источник
7

Скопировано из Spring в действии

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


источник
6

Скопировано из дубликата для полноты (зуммер):

Атрибуты класса и метода в .NET являются формой аспектно-ориентированного программирования. Вы украшаете свои классы / методы с атрибутами. За кулисами это добавляет код к вашему классу / методу, который выполняет определенные функции атрибута. Например, маркировка сериализуемого класса позволяет автоматически сериализовать его для хранения или передачи в другую систему. Другие атрибуты могут пометить определенные свойства как не сериализуемые, и они будут автоматически исключены из сериализованного объекта. Сериализация - это аспект, реализуемый другим кодом в системе и применяемый к вашему классу с помощью атрибута конфигурации (украшения).

paxdiablo
источник
5

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

Вот пример в .Net. Он использует прокси-классы для перехвата вызовов методов и выполнения кода до или после вызовов метода saif.

Аспектно-ориентированное программирование (AOP) в .NET Core и C # с использованием AutoFac и DynamicProxy

Карлос Бланко
источник
4

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

Среда Spring AOP (Аспектно-ориентированное программирование) используется для модуляции сквозных аспектов в аспектах. Проще говоря, это просто перехватчик для перехвата некоторых процессов, например, когда метод выполняется, Spring AOP может захватить исполняемый метод и добавить дополнительные функциональные возможности до или после выполнения метода.

Ссылка: http://www.mkyong.com/spring/spring-aop-examples-advice/

РФ
источник
В вычислительной технике аспектно-ориентированное программирование (AOP) - это парадигма программирования, целью которой является повышение модульности за счет разделения сквозных задач.
РФ
3

AOP - это способ улучшить модульность вашего приложения для функциональности, которая охватывает несколько границ. AOP - это еще один способ инкапсулировать эти функции и следовать принципу «Единой ответственности», убрав эти сквозные проблемы (ведение журнала, обработка ошибок и т. Д.) Из основных компонентов вашего приложения. При правильном использовании AOP может привести к более высоким уровням обслуживания и расширяемости в вашем приложении с течением времени.

SaaS Developer
источник