Что такое аспектно-ориентированное программирование? - PullRequest
207 голосов
/ 28 октября 2008

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

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

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

Ответы [ 8 ]

181 голосов
/ 28 октября 2008

AOP решает проблему сквозных проблем , которая представляет собой любой вид кода, который повторяется различными методами и обычно не может быть полностью реорганизован в свой собственный модуль, например, при регистрации или проверке , Таким образом, с помощью 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;
} 
12 голосов
/ 28 октября 2008

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

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

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

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

7 голосов
/ 26 ноября 2008

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

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

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

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

5 голосов
/ 15 сентября 2015

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

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

4 голосов
/ 26 ноября 2008

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

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

3 голосов
/ 14 февраля 2018

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

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

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

3 голосов
/ 24 апреля 2016

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

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

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

1 голос
/ 28 октября 2008

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

...