늦게 게임에 나올 것이지만, 나는이 질문을 우연히 발견 할 수있는 후기 개발자를 위해 이것을 제공합니다.
응용 프로그램이 있다면 난 강력하게 AOP에 대해 권합니다 따라 올바르게 작동하도록하십시오. 측면은 다음과 같이 작동합니다.
- 조언 (추가 행동)이
- 결합 지점 (메소드 시작 또는 종료와 같은 추가 코드를 첨부 할 수있는 위치 또는 지정된 이벤트가 트리거되는 위치)
- ... pointcut (주어진 결합 점이 일치하는지 감지하는 패턴) 패턴이 일치하는 곳
컴퓨터를 오랫동안 사용해온 사람이라면 패턴을 사용한다는 사실을 자세히 살펴볼 수 있습니다. 다음 set
은 인수에 관계없이 명명 된 모든 메소드와 일치하는 포인트 컷의 예입니다 .
call(* set(..))
그래서 그것은 상당히 쓸모없는 포인트 컷이며 많은 것들에 조언을 적용하기 때문에 조심스럽게 다루는 것이 권장됩니다.
또는 이름이나 서명에 관계없이 모든 것에 조언을 적용합시다 !
execution(* *(..))
여기에는 많은 힘이 있기 때문에주의해야합니다. 그러나 이것은 측면에 대한 논쟁이 아닙니다. 여기에는 많은 힘이 있고 패턴 일치가 쉽게 어려워 질 수 있으므로주의해야합니다 (좋아하는 검색 엔진을 누르십시오) aop 버그와 재미).
따라서 비교적 안전한 포인트 컷처럼 보이는 것이 있습니다 :
pointcut setter(): target(Point) &&
( call(void setX(int)) ||
call(void setY(int)) );
명명 된 setX
또는 객체 setY
의 Point
메소드가 발견 되면 명시 적으로 조언을 제공합니다 . 메소드는 int
s 만 수신 할 수 있으며 반드시 있어야합니다 void
. 꽤 안전 해 보이죠? 그러한 방법이 존재하고 올바른 조언을 적용하면 안전합니다. 그렇지 않다면 너무 나쁘다. 조용히 실패합니다.
예를 들어, 친구는 한 번에 모든 사람이 Java 응용 프로그램을 디버깅하려고 시도했지만 잘못된 데이터를 반환했습니다. 자주 발생하지 않았으며 특정 이벤트 나 데이터와 관련이없는 것으로 보입니다. 스레딩 버그로 테스트 또는 감지하기 어려운 것으로 악명 높았습니다. 결과적으로 메소드를 잠그고 "스레드 안전"으로 만드는 측면을 사용하고 있었지만 프로그래머는 메소드의 이름을 바꾸고 포인트 컷이 해당 메소드와 일치하지 않아 응용 프로그램이 자동으로 중단되었습니다.
따라서 저는 사람들에게 AOP를 사용해야한다면 예외와 같은 측면을 예외와 같은 방식으로 처리해야한다고 말합니다 . 제대로 설계된 시스템에서 아무 문제가 없으면 제거 할 수 있으며 소프트웨어는 여전히 올바르게 작동합니다. 그러나 프로그램의 기능이 AOP에 의존하는 경우 보증되지 않는 취약성을 프로그램에 도입하게됩니다.
따라서 로깅, 디버깅 및 추적은 측면이 아닌 보안에 적합한 동작의 좋은 예입니까? 아니. 스레드 안전? 아니.
AOP에 대한 강력한 대안은 traits를 참조하십시오 . 언어에 볼트로 연결되지 않고 언어에 직접 통합되어 있으며 "특성을 인식하는"IDE가 필요하지 않으며 (도움이 될 수 있지만) 필요한 방법이없는 경우 컴파일 타임 오류가 발생합니다. 특성은 처음부터 문제가 더 잘 정의 되었기 때문에 우려 분리를 처리하는 데 훨씬 더 깔끔한 작업을 수행합니다. 나는 그것들을 광범위하게 사용하며 환상적입니다.