문제

다음과 같 대부분의 개발자들은 여기 및 전 세계에서,내가 소프트웨어 개발를 사용하는 시스템 객체-지향 프로그래밍(OOP)기술입니다.그래서 읽을 때에는 지향 프로그래밍(AOP)주소는 많은 문제는 전통 OOP 하지 않는 완전히 해결하기 위해 또는 직접적,내가 일시 중지하고 생각하는,그것은 진짜입니까?

나 많은 정보를 읽을 배우려고 노력이 AOP 패러다임에서는 동일한 장소,그래서하고 싶은 더 나은 이해에 그 혜택을 실제 응용 프로그램 개발.

는 누군가가 대답은?

도움이 되었습니까?

해결책

왜 "대"? "대"가 아닙니다. 기능적 프로그래밍과 함께 측면 지향 프로그래밍을 사용할 수 있지만 객체 지향적 인 것과 함께 사용할 수 있습니다. "VS"가 아니며, "측면 지향 프로그래밍입니다. ~와 함께 객체 지향 프로그래밍".

나에게 AOP는 일종의 "메타 프로그래밍"입니다. 더 많은 코드를 추가하면 AOP가 수행하지 않고 수행 할 수 있습니다. AOP는이 코드를 작성하는 것을 저장합니다.

Wikipedia는이 메타 프로그래밍에 가장 적합한 예 중 하나가 있습니다. 많은 "set ... ()"메소드가 많은 그래픽 클래스가 있다고 가정합니다. 각 세트 방법 후에 그래픽의 데이터가 변경되어 그래픽이 변경되어 그래픽이 화면에서 업데이트되어야합니다. "display.update ()"호출 해야하는 그래픽을 다시 칠한다고 가정하십시오. 고전적인 접근법은 추가하여 이것을 해결하는 것입니다 더 많은 코드. 각 세트 방법의 끝에 쓰기

void set...(...) {
    :
    :
    Display.update();
}

3 개의 세트 메드가있는 경우 문제가되지 않습니다. 200 (가상)이 있다면, 어디서나 이것을 추가하는 것이 정말 고통스러워지고 있습니다. 또한 새 세트 메드를 추가 할 때마다 끝에 추가하는 것을 잊지 말아야합니다. 그렇지 않으면 버그를 만들었습니다.

AOP는 수많은 코드를 추가하지 않고 이것을 해결하고 대신 측면을 추가합니다.

after() : set() {
   Display.update();
}

그리고 그게 다야! 업데이트 코드를 직접 작성하는 대신 Set () PointCut에 도달 한 후이 코드를 실행해야 하며이 코드를 실행해야한다고 시스템에 알려줍니다. 200 가지 방법을 업데이트 할 필요가 없으며 새 세트 메드 에이 코드를 추가하는 것을 잊지 않아도됩니다. 또한 포인트 컷이 필요합니다.

pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);

그게 무슨 뜻입니까? 즉, 메소드의 이름이 "set*"(* 세트 후에 이름을 따를 수 있음을 의미하는 경우 메소드가 반환 된 내용 (첫 번째 별표) 또는 취하는 매개 변수 (세 번째 별표)에 관계없이 그리고 그것은 mygraphicsclass의 방법입니다 그리고 이 클래스는 "com.company.*"패키지의 일부입니다. 이것은 set () pointcut입니다. 그리고 우리의 첫 번째 코드는 "~ 후에 설정 포인트 컷 인 모든 메소드를 실행하면 다음 코드를 실행하십시오. "

AOP가 어떻게 문제를 우아하게 해결하는지 보시겠습니까? 실제로 여기에 설명 된 모든 것은 컴파일 시간에 수행 할 수 있습니다. AOOP 전 처리기는 클래스 자체를 컴파일하기 전에 소스 (예 : display.update ()를 추가) 만 수정할 수 있습니다.

그러나이 예는 또한 AOP의 큰 단점 중 하나를 보여줍니다. AOP는 실제로 많은 프로그래머가 고려하는 일을하고 있습니다.패턴 방지". 정확한 패턴을"멀리서 행동".

멀리 떨어진 행동은 프로그램의 한 부분에서 행동이 프로그램의 다른 부분에서 운영을 식별하기가 어렵거나 불가능한 것에 따라 크게 변하는 방지 (인식 된 일반적인 오류)입니다.

프로젝트의 초보자로서, 나는 세트 메드의 코드를 읽고 디스플레이를 업데이트하지 않는 것처럼 보이기 때문에 깨진 것으로 간주 할 수 있습니다. 나는 아니에요 보다 Set-Method의 코드 만 살펴보면 실행 된 후 일부 다른 코드가 디스플레이를 업데이트하기 위해 "마술 적으로"실행됩니다. 나는 이것을 심각한 단점이라고 생각합니다! 방법을 변경하면 이상한 버그가 도입 될 수 있습니다. 특정 것들이 올바르게 작동하는 것처럼 보이지만 명확하지 않은 코드 흐름을 더 이해하는 것은 (내가 말했듯이, 마술처럼 작동합니다 ... 어떻게 든 마술처럼 작동합니다).

업데이트

그냥 분명히하기 위해 : 어떤 사람들은 내가 AOP가 나쁜 것이며 사용해서는 안된다는 인상을 가질 수 있습니다. 그게 내가 말하는 것이 아닙니다! AOP는 실제로 훌륭한 기능입니다. 나는 단지 "신중하게 사용"이라고 말합니다. AOP는 일반 코드와 AOP를 동일하게 혼합 한 경우에만 문제를 일으 킵니다. 측면. 위의 예에서는 그래픽 객체의 값을 업데이트하고 업데이트 된 객체를 그리는 측면이 있습니다. 그것은 실제로 단일 측면입니다. 그것의 절반을 일반 코드로 코딩하고 다른 절반은 측면으로 코딩합니다.

완전히 다른 측면에 AOP를 사용하는 경우, 예를 들어 로깅을 위해 AOP를 사용하는 경우, 패턴 방지 문제가 발생하지 않습니다. 이 경우 프로젝트에 대한 초보자는 "이러한 모든 로그 메시지가 어디에서 왔는지 궁금해 할 것입니다. 코드에서 로그 출력이 보이지 않습니다"라고 궁금해 할 수 있지만 큰 문제는 아닙니다. 그가 프로그램 논리에 대한 변화는 로그 시설을 거의 깨뜨리지 않을 것이며 로그 시설에 대한 변경으로 인해 프로그램 논리가 거의 깨지지 않을 것입니다. 이러한 측면은 완전히 분리되어 있습니다. 로깅에 AOP를 사용하면 프로그램 코드가해야 할 일에 완전히 집중할 수 있다는 이점이 있으며, 모든 곳에서 수백 개의 로그 메시지에 의해 코드가 혼란스럽지 않으면 서 정교한 로깅을 가질 수 있습니다. 또한 새 코드가 소개되면 마술로 로그 메시지가 올바른 콘텐츠로 적절한 시간에 나타납니다. 초보자 프로그래머는 왜 그들이 거기에 있는지 또는 어디에서 왔는지 이해하지 못할 수도 있지만, "적절한시기"에 "올바른 것"을 기록하기 때문에 그들이 거기에 있다는 사실을 행복하게 받아들이고 다른 무언가로 넘어갈 수 있습니다. .

따라서 내 예에서 AOP를 잘 사용하면 설정 메소드를 통해 값이 업데이트 된 경우 항상 로그인하는 것입니다. 이것은 반란을 일으키지 않으며 문제의 원인이 거의 없습니다.

AOP를 쉽게 남용하여 많은 문제를 일으킬 수 있다면 모든 것을 사용하는 것은 나쁜 생각입니다. 그러나 어떤 기술을 남용 할 수 없습니까? 데이터 캡슐화를 남용하고 상속을 남용 할 수 있습니다. 거의 모든 유용한 프로그래밍 기술을 남용 할 수 있습니다. 학대 할 수없는 기능 만 포함 할 정도로 제한된 프로그래밍 언어를 고려하십시오. 기능이 처음 사용하기 위해서만 사용될 수있는 언어. 그러한 언어는 실제 프로그래밍에도 사용될 수 있다면 논쟁의 여지가 있습니다.

다른 팁

OOP와 AOP는 상호 배타적이지 않습니다. AOP는 OOP에 추가 할 수 있습니다. AOP는이 표준 코드로 메소드 코드를 막지 않고 메소드에 로깅, 성능 추적 등과 같은 표준 코드를 추가하는 데 특히 편리합니다.

측면 지향 포그램링은 로깅, 보안과 같은 크로스 절단 문제를 구현할 수있는 좋은 방법을 제공합니다. 이 크로스 절단 콘서트는 많은 장소에서 적용해야하지만 실제로 비즈니스 논리와 관련이없는 논리입니다.

AOP를 OOP의 대체품으로 보지 않아야합니다. 더 멋진 애드온으로 코드가 더 깨끗하고 느슨하게 결합되어 비즈니스 로직에 중점을 둘 수 있습니다. 따라서 AOP를 적용하면 2 가지 주요 혜택을 얻을 수 있습니다.

  1. 각 관심사에 대한 논리는 이제 코드 기반 전체에 흩어져있는 것과는 반대로 한 곳에 있습니다.

  2. 클래스는 주요 관심사 (또는 핵심 기능)에 대한 코드 만 포함하므로 클래스는 더 깨끗하며 2 차 관심사는 측면으로 이동되었습니다.

가 있다고 생각 없이 일반적인 이 질문에 대답하지만 한 가지 주목해야 할 것,AOP 하지 않는 대체 OOP 지 특정 분해능한 주소는 폭정의 지배 구성 (1)(또는 사람을 우려).

그것은 확실히 도움이 어떤 경우에는 만큼 당신의 통제하는 도구와 언어를 사용한 특정 프로젝트이지만,또한 추가하는 새로운 복잡성의 수준에 관한 상호의 측면 및 추가 도구 AJDT 여전히 이해 귀하의 프로그램입니다.

Gregor Kiczales 한번 했다는 흥미로운 소개 이야기에 AOP 구글에서 기술 협상하는 내보고: 측면을 지향 프로그래밍:급진적인 연구에서 모듈.

우선 AOP는 OOP를 대체하지 않습니다. AOP는 OOP를 확장합니다. OOP의 아이디어와 관행은 관련성을 유지합니다. 좋은 객체 디자인을 사용하면 측면으로 더 쉽게 확장 할 수 있습니다.

AOP가 가져 오는 아이디어가 중요하다고 생각합니다. 우리는 수업 자체를 변경하지 않고도 프로그램의 다른 클래스에 대한 크로스 커팅 커넥트를 구현하는 방법을 해결해야합니다. 그러나 AOP는 결국 우리가 사용하는 다른 도구의 일부가 될 것이며 별도의 도구 나 기술이 될 것이라고 생각합니다. 우리는 이미 이런 일이 일어나는 것을 본다.

Ruby 및 Python과 같은 몇 가지 역동적 인 언어에는 동일한 문제를 해결하는 Mixins와 같은 언어 구성이 있습니다. 이것은 AOP와 비슷해 보이지만 언어로 더 잘 통합됩니다.

Spring and Castle과 몇 가지 다른 종속성 주입 프레임 워크에는 주입 클래스에 동작을 추가 할 수있는 옵션이 있습니다. 이것은 런타임 직조를 수행하는 방법이며 많은 잠재력이 있다고 생각합니다.

AOP를 사용하기 위해 완전히 새로운 패러다임을 배울 필요는 없다고 생각합니다. 아이디어는 흥미롭지 만 기존 도구와 언어에 천천히 흡수되고 있습니다. 정보를 유지하고 이러한 도구를 사용해보십시오.

AOP는이 개념을 다루는 새로운 프로그래밍 패러다임입니다. 측면은 응용 프로그램의 특정 비 기능 부분을 구현하는 소프트웨어 엔티티입니다.

이 기사는 측면 지향 프로그래밍으로 시작하기에 좋은 장소라고 생각합니다.http://www.jaftalks.com/wp/index.php/introduction-to-aspect-oriented-programming/

OOP 는 주로 사용되는 구성 비즈니스 로직AOP 하는 데 도움이 정리 비 것 기능 다음과 같 감사,Logging,트랜잭션 관리,보안 등

이 방법은 분리할 수 있습니다 귀하의 비즈니스 로직과 비는 가상의 논리게 하는 코드는 청소기입니다.

수달 장점은 적용할 수 있는 조언을(예를 감사)매우 일관 없이 구현하는 모든 인터페이스를 제공하는 유연성을 위해 수정에 닿지 않은 비즈니스 로직

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