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

StackOverflow https://stackoverflow.com/questions/242177

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

  

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

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

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

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

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

Ссылка: http://www.mkyong.com/spring/spring -aop-примеры-советы /

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top