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

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

Этот вопрос связан, но не спрашивает его:

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

Ответ 1

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;
} 

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Существует пример AOP, в качестве примера используется spring AOP. Пример довольно прост для понимания.

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

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

Ответ 7

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