Что такое аспектно-ориентированное программирование?
Я понимаю объектно-ориентированное программирование и давно пишу ОО-программы. Люди, кажется, говорят о аспектно-ориентированном программировании, но я никогда не узнал, что это такое и как его использовать. Какова основная парадигма?
Этот вопрос связан, но не совсем его задает:
Аспектно-ориентированное программирование против объектно-ориентированного программирования
8 ответов
АОП решает проблему сквозных проблем, которая представляет собой любой вид кода, который повторяется различными методами и обычно не может быть полностью реорганизован в свой собственный модуль, например, при ведении журнала или проверке. Таким образом, с помощью 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;
}
К сожалению, кажется удивительно трудным сделать АОП действительно полезным в обычной организации среднего размера. (Поддержка редактора, чувство контроля, тот факт, что вы начинаете с не столь важных вещей, приводящих к разложению кода, людям, идущим домой к своим семьям и т. Д.)
Я возлагаю надежды на композитно-ориентированное программирование, которое становится все более и более реалистичным. Это связано со многими популярными идеями и дает вам что-то действительно классное.
Посмотрите на готовую реализацию здесь: http://www.qi4j.org/
PS. На самом деле, я думаю, что одна из красот AOP - это ахиллесова пята: она не навязчива, позволяя людям игнорировать ее, если может, поэтому в большинстве организаций это будет рассматриваться как второстепенная проблема.
Скопировано из Spring в действии
АОП часто определяется как метод, который способствует разделению проблем в программной системе. Системы состоят из нескольких компонентов, каждый из которых отвечает за определенный элемент функциональности. Но часто эти компоненты также несут дополнительные обязанности помимо своей основной функциональности. Системные сервисы, такие как ведение журнала, управление транзакциями и безопасность, часто попадают в компоненты, чьи основные обязанности - это нечто другое. Эти системные службы обычно называют сквозными задачами, потому что они имеют тенденцию проходить через несколько компонентов в системе.
Скопировано из дубликата для полноты (Эйнштейн):
Классическими примерами являются безопасность и логирование. Вместо того, чтобы писать код в вашем приложении для регистрации вхождения x или проверки объекта z для контроля безопасного доступа, существует языковая концепция "внеполосного" нормального кода, которая может систематически внедрять безопасность или входить в подпрограммы, которые по натуре не содержат их в таким образом, что, хотя ваш код не предоставляет его - об этом позаботились.
Более конкретный пример - операционная система, обеспечивающая контроль доступа к файлу. Программному обеспечению не нужно проверять ограничения доступа, потому что соответствующая система работает для него.
Если вы считаете, что вам нужен AOP в моем опыте, вам действительно нужно вкладывать больше времени и усилий в надлежащее управление метаданными в вашей системе, уделяя особое внимание продуманному проектированию конструкций / систем.
Скопировано из дубликата для полноты (зуммер):
Атрибуты класса и метода в.NET являются формой аспектно-ориентированного программирования. Вы украшаете свои классы / методы с атрибутами. За кулисами это добавляет код к вашему классу / методу, который выполняет определенные функции атрибута. Например, маркировка сериализуемого класса позволяет автоматически сериализовать его для хранения или передачи в другую систему. Другие атрибуты могут пометить определенные свойства как не сериализуемые, и они будут автоматически исключены из сериализованного объекта. Сериализация - это аспект, реализуемый другим кодом в системе и применяемый к вашему классу с помощью атрибута конфигурации (украшения) .
Есть пример АОП, он использовал пружинный АОП в качестве примера. Пример довольно прост для понимания.
Среда Spring AOP (Аспектно-ориентированное программирование) используется для модуляции сквозных аспектов в аспектах. Проще говоря, это просто перехватчик для перехвата некоторых процессов, например, когда метод выполняется, Spring AOP может перехватить исполняемый метод и добавить дополнительные функциональные возможности до или после выполнения метода.
Ссылка: http://www.mkyong.com/spring/spring-aop-examples-advice/
AOP - это способ улучшить модульность вашего приложения для функциональности, которая охватывает несколько границ. AOP - это еще один способ инкапсулировать эти функции и следовать принципу "Единой ответственности", убрав эти сквозные проблемы (ведение журнала, обработка ошибок и т. Д.) Из основных компонентов вашего приложения. При правильном использовании AOP может привести к более высоким уровням сопровождения и расширяемости в вашем приложении с течением времени.
AOP можно использовать для выполнения действий, не связанных с бизнес-логикой вашего приложения, таких как ведение журнала, кэширование и т. Д. Эти действия можно поместить в отдельную часть приложения, а затем повторно использовать в приложении. Обычно есть два способа сделать это. Автоматическое внедрение кода препроцессором до / после метода или присоединение прокси-классов, которые перехватывают вызов метода и могут затем выполнять действия до / после вызова метода.
Вот пример в.Net. Он использует прокси-классы для перехвата вызовов методов и выполнения кода до или после вызовов метода saif.