Що таке аспект-орієнтоване програмування?


231

Я розумію об'єктно-орієнтоване програмування і давно пишу програми OO. Люди, здається, говорять про аспект-орієнтоване програмування, але я ніколи насправді не дізнався, що це таке або як ним користуватися. Яка основна парадигма?

Це питання пов'язане, але не зовсім його задає:

Аспектно-орієнтоване програмування проти об’єктно-орієнтованого програмування


5
IMAO, посилання, надане у запитанні, має більш чітку та ґрунтовну відповідь, ніж прийнята тут. Люди, які читають це питання, можуть прочитати його першими.
Девід Чен

Відповіді:


198

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

14
Тоді вам потрібна мовна підтримка для цього? На якій мові є ваш приклад?
Софі

8
Це псевдокод, але найвідомішим прикладом є AspectJ, це модифікація AOP Java, яка використовує аналогічну техніку, звану cutpoints.
Марк Сідаде

71
Вуду. І я вважав, що ООП переборщив.
Ейден Белл

17
Позначте, це як прикраса точок входу та виходу методу?
Філіп Дупанович

3
@AidenBell Якщо невидимі дії на відстані можна вважати вуду, то так, це вуду. Під метапрограмою Moose модифікатори методів, як і раніше, після, навколо, внутрішні, розширення роблять саме це. Це затьмарює потік виконання програми. Їх неможливо простежити, особливо коли вони випливають із версії аспектів тієї системи, яку вона називає ролями . З усім цим можна скласти системи приголомшливої ​​складності.
tchrist

13

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

Я покладаю свої надії на складене орієнтоване програмування , яке є щось більш і більш реалістичне. Він підключає до багатьох популярних ідей і дає вам щось справді класне.

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

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


8

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

Класичні приклади - безпека та ведення журналів. Замість того, щоб писати код у вашій програмі для реєстрації появи x або перевірити об'єкт z для контролю доступу до безпеки, існує мовна контрацепція «поза діапазоном» звичайного коду, яка може систематично вводити безпеку або входити в підпрограми, які не мають їх увімкнено таким чином, що, хоча ваш код не постачає його - про це подбали.

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

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


7

Скопійовано з весни в дії

AOP часто визначають як техніку, яка сприяє розділенню проблем в програмній системі. Системи складаються з декількох компонентів, кожен з яких відповідає за певний функціонал. Але часто ці компоненти також несуть додаткові обов'язки поза їх основними функціоналами. Системні сервіси, такі як ведення журналів, управління транзакціями та безпека, часто знаходять собі компоненти, основні обов'язки яких - це щось інше. Ці системні служби зазвичай називають наскрізними проблемами, оскільки вони, як правило, охоплюють декілька компонентів системи.


6

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

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


5

AOP можна використовувати для виконання дій, не пов’язаних із бізнес-логікою вашого додатка, такими як ведення журналів, кешування тощо. Ці дії можна помістити в окрему частину вашої програми та потім повторно використати протягом усієї програми. Зазвичай існує два способи досягнення цього. Автоматично вводить код препроцесором до / після методу або додає проксі-класи, які перехоплюють виклик методу і можуть потім виконувати речі до / після виклику методу.

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

Аспектно-орієнтоване програмування (AOP) у .NET Core та C # за допомогою AutoFac та DynamicProxy


4

Є приклад АОП, він використовував весну АОП як приклад. Приклад досить легко зрозуміти.

Весняний фреймворк AOP (орієнтований на аспекти) використовується для модуляції наскрізних проблем в аспектах. Простіше кажучи, це просто перехоплювач для перехоплення деяких процесів, наприклад, коли метод виконується, Spring AOP може захопити спосіб виконання та додати додаткову функціональність до або після виконання методу.

Довідка: http://www.mkyong.com/spring/spring-aop-examples-advice/


В обчислювальній роботі аспект-орієнтоване програмування (AOP) - парадигма програмування, яка має на меті підвищити модульність, дозволяючи розділити міжсекторні проблеми.
РФ

3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.