Aspect 지향 프로그래밍이란 무엇입니까?


231

객체 지향 프로그래밍을 이해하고 오랫동안 OO 프로그램을 작성해 왔습니다. 사람들은 측면 지향 프로그래밍에 대해 이야기하는 것 같지만, 그것이 무엇인지 또는 어떻게 사용하는지 실제로 배운 적이 없습니다. 기본 패러다임은 무엇입니까?

이 질문은 관련이 있지만 묻지 않습니다.

화면 지향 프로그래밍과 객체 지향 프로그래밍


5
IMAO, 질문에 제공된 링크는 여기에서 허용되는 것보다 명확하고 철저한 답변을 제공합니다. 이 질문을 읽는 사람들이 먼저 읽을 수 있습니다.
David Chen

답변:


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

그런 다음 Aspect-Weaver 를 사용하여 코드를 다음과 같이 컴파일합니다.

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
이것은 의사 코드이지만 가장 잘 알려진 예는 Java의 AOP 수정 인 AspectJ이며 컷 포인트라는 유사한 기술을 사용합니다.
Mark Cidade

71
부두교. 그리고 OOP가 과도하다고 생각했습니다.
에이든 벨

17
Mark, 메소드의 시작점과 종료점을 꾸미는 것과 같은가요?
Filip Dupanović

3
@AidenBell 멀리서 보이지 않는 행동이 부두로 간주 될 수 있다면, 그것은 부두입니다. Moose metaprogamming에서 이전, 이후, 주변, 내부, 증강 과 같은 메소드 수정자는 정확히 그렇게합니다. 프로그램의 실행 흐름이 흐려집니다. 이것들은 추적하기가 거의 불가능합니다. 특히 시스템의 역할 을 호출하는 시스템의 측면에서 파생 될 때 더욱 그렇습니다 . 이 모든 것을 통해 엄청나게 복잡한 시스템을 구성 할 수 있습니다.
tchrist

13

불행히도 AOP를 일반적인 중간 규모 조직에서 실제로 유용하게 만드는 것은 놀라운 일이 아닙니다. (편집자 지원, 통제력, 코드 썩음으로 이끄는 중요하지 않은 것들, 집에가는 사람들 등으로 시작한다는 사실)

저는 복합 지향 프로그래밍에 대한 희망을 갖고 있습니다. 그것은 많은 인기있는 아이디어와 연결되어 정말로 멋진 것을 제공합니다.

qi4j.org/의 최신 구현을 살펴보십시오.

추신. 실제로, 나는 AOP를 가진 미녀 중 하나가 아킬레스 건이라고 생각합니다. 그것은 방해가되지 않아 사람들이 가능하면 무시할 수 있기 때문에 대부분의 조직에서 2 차적인 문제로 취급 될 것입니다.


8

완전성을 위해 복제본에서 복사 (아인슈타인) :

전형적인 예는 보안 및 로깅입니다. 보안 액세스 제어를 위해 x의 발생을 기록하거나 객체 z를 확인하기 위해 응용 프로그램 내에서 코드를 작성하는 대신, 체계적으로 보안을 주입하거나 일상적으로 로그인하지 않는 루틴에 로그인 할 수있는 일반 코드의 "대역 외"언어 제한이 있습니다. 코드가 제공하지 않더라도 처리하는 방식입니다.

보다 구체적인 예는 파일에 대한 액세스 제어를 제공하는 운영 체제입니다. 기본 시스템이 작동하므로 소프트웨어 프로그램에서 액세스 제한을 확인할 필요가 없습니다.

내 경험에 AOP가 필요하다고 생각되면 실제로 구조 / 시스템 설계에 중점을 둔 시스템 내에서 적절한 메타 데이터 관리에 더 많은 시간과 노력을 투자해야합니다.


7

실제로 봄에서 복사

AOP는 종종 소프트웨어 시스템에서 우려의 분리를 촉진하는 기술로 정의됩니다. 시스템은 몇 가지 구성 요소로 구성되며 각 구성 요소는 특정 기능을 담당합니다. 그러나 종종 이러한 구성 요소는 핵심 기능 이상의 추가 책임을 수행합니다. 로깅, 트랜잭션 관리 및 보안과 같은 시스템 서비스는 종종 핵심 책임이 다른 구성 요소를 찾는 경우가 많습니다. 이러한 시스템 서비스는 일반적으로 시스템의 여러 구성 요소를 가로 지르는 경향이 있으므로 교차 절단 문제라고합니다.


6

완전성을 위해 사본에서 복사 (부저) :

.NET의 클래스 및 메소드 속성은 형태 지향 프로그래밍의 한 형태입니다. 클래스 / 메소드를 속성으로 장식합니다. 배후에서 이것은 속성의 특정 기능을 수행하는 코드를 클래스 / 메소드에 추가합니다. 예를 들어, 직렬화 가능 클래스를 표시하면 저장하거나 다른 시스템으로 전송하기 위해 자동으로 직렬화 할 수 있습니다. 다른 특성은 특정 특성을 직렬화 할 수없는 것으로 표시 할 수 있으며 직렬화 된 오브젝트에서 자동으로 생략됩니다. 직렬화는 시스템의 다른 코드에 의해 구현되고 "configuration"속성 (decoration)의 응용 프로그램으로 클래스에 적용되는 측면입니다.


5

AOP는 로깅, 캐싱 등과 같이 앱의 비즈니스 논리와 관련이없는 작업을 수행하는 데 사용할 수 있습니다. 이러한 작업은 앱의 별도 부분에 배치 한 다음 응용 프로그램 전체에서 재사용 할 수 있습니다. 이를 달성하는 데 일반적으로 두 가지 방법이 있습니다. 메소드 전 / 후에 프리 프로세서에 의해 자동으로 코드를 주입하거나 메소드 호출을 인터셉트하고 메소드 호출 전 / 후에 실행할 수있는 프록시 클래스를 첨부합니다.

다음은 .Net의 예입니다. 프록시 클래스를 사용하여 메소드 호출을 인터셉트하고 saif 메소드 호출 이전에 코드를 실행합니다.

AutoFac 및 DynamicProxy를 사용하는 .NET Core 및 C #의 AOP (Aspect Oriented Programming)


4

AOP의 예가 있으며 스프링 AOP를 예로 사용했습니다. 예제는 이해하기 매우 쉽습니다.

Spring AOP (Aspect-oriented programming) 프레임 워크는 측면에서 교차 절단 문제를 모듈화하는 데 사용됩니다. 간단히 말하면, 메소드가 실행될 때 Spring AOP는 실행 메소드를 하이재킹하고 메소드 실행 전후에 추가 기능을 추가 할 수 있습니다.

참조 : http://www.mkyong.com/spring/spring-aop-examples-advice/


컴퓨팅에서 AOP (Aspect-Oriented Programming)는 교차 절단 문제를 분리하여 모듈성을 향상시키는 것을 목표로하는 프로그래밍 패러다임입니다.
RF

3

AOP는 여러 경계에 걸쳐있는 기능을 위해 애플리케이션을 더 잘 모듈화하는 방법입니다. AOP는 이러한 기능을 캡슐화하고 애플리케이션의 주요 구성 요소에서 이러한 교차 문제 (로깅, 오류 처리 등)를 이동하여 단일 책임을 따르는 또 다른 방법입니다. AOP를 적절하게 사용하면 시간이 지남에 따라 응용 프로그램의 유지 관리 및 확장 성이 높아질 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.