문제

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

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

측면 지향 프로그래밍 대 객체 지향 프로그래밍

도움이 되었습니까?

해결책

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

그리고 an 측면 창고 코드를 이것으로 컴파일하는 데 사용됩니다.

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

다른 팁

불행히도, AOP를 일반적인 중간 크기 조직에서 정말 유용하게 만드는 것은 놀랍게도 어렵습니다. (편집자 지원, 통제 감각, 코드 로트로 이어지는 중요한 것, 가족의 집으로가는 사람들 등으로 시작한다는 사실).

나는 나의 희망을 두었다 복합 지향 프로그래밍, 그것은 점점 더 현실적인 것입니다. 그것은 많은 인기있는 아이디어와 연결되어 정말 멋진 것을 제공합니다.

여기에서 다가오는 구현을보십시오. qi4j.org/

추신. 실제로, 나는 AOP를 가진 아름다움 중 하나가 아킬레스 힐이라고 생각합니다. 비 침입자, 사람들이 가능하다면 그것을 무시할 수있게하므로 대부분의 조직에서 이차적 인 관심사로 취급 될 것입니다.

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

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

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

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

봄부터 복사

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

완전성 (버저)을 위해 중복에서 복사 : :

.NET의 클래스 및 메소드 속성은 측면 지향 프로그래밍의 한 형태입니다. 속성으로 수업/방법을 장식합니다. 무대 뒤에서 이것은 속성의 특정 함수를 수행하는 클래스/메소드에 코드를 추가합니다. 예를 들어, 클래스 직렬화 가능한 클래스를 표시하면 저장 또는 다른 시스템으로의 전송을 위해 자동으로 직렬화 될 수 있습니다. 다른 속성은 특정 속성을 실시화 할 수없는 것으로 표시 할 수 있으며 직렬화 된 객체에서 자동으로 생략됩니다. 직렬화는 시스템의 다른 코드에 의해 구현되고 "구성"속성 (장식)을 적용하여 클래스에 적용되는 측면입니다.

AOP의 예가 있으며, Spring AOP를 예로 사용했습니다. 예제는 이해하기 쉽습니다.

Spring AOP (Aspect-Oriented Programming) 프레임 워크는 측면에서 교차 절단 문제를 모듈화하는 데 사용됩니다. 간단히 말해서, 메소드가 실행될 때 스프링 AOP는 실행 메소드를 납치하고 메소드 실행 전후에 추가 기능을 추가 할 수있는 일부 프로세스를 가로 채는 인터셉터 일뿐입니다.

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

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

.NET의 예는 다음과 같습니다. 프록시 클래스를 사용하여 SAIF 메소드 호출 후에 메소드 호출을 가로 채고 코드를 실행합니다.

Autofac 및 DynamicProxy를 사용하여 .NET Core 및 C#의 AP (Aspect Oriented Programming)

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top