JavaScript 의 AOP 프로 그래 밍 기본 구현
AOP(절단면 프로 그래 밍)의 주요 역할 은 핵심 업무 논리 모듈 과 무관 한 기능 을 추출 하 는 것 이다.이런 업무 논리 와 무관 한 기능 은 로그 통계,안전 통제,이상 처리 등 을 포함한다.이러한 기능 을 추출 한 후에'동적 짜 임'방식 으로 업무 논리 모듈 에 섞는다.
절단면 프로 그래 밍 은 목표 논 리 를 수정 하지 않 고 코드 를 기 존의 함수 나 대상 에 주입 할 수 있 는 방법 을 제공 합 니 다.
필요 한 것 은 아니 지만 주 입 된 코드 는 로그 기능 을 추가 하거나 메타 데 이 터 를 디 버 깅 하거나 다른 통용 되 지 않 지만 추가 행 위 를 주입 할 수 있 으 며 원본 코드 의 내용 에 영향 을 주지 않 습 니 다.
업무 논 리 를 다 썼 다 고 가정 하면 적당 한 예 를 들 어 보 겠 습 니 다.하지만 지금 은 로그 코드 를 추가 하지 않 았 다 는 것 을 깨 달 았 습 니 다.일반적인 방법 은 로그 논 리 를 새로운 모듈 에 집중 한 다음 함수 마다 로그 정 보 를 추가 하 는 것 이다.
그러나 같은 로그 프로그램 을 가 져 올 수 있다 면 기록 하고 자 하 는 모든 방법 을 실행 하 는 과정 에서 특정한 노드 는 코드 한 줄 만 있 으 면 프로그램 을 주입 할 수 있 습 니 다.그러면 많은 편 의 를 가 져 다 줄 것 입 니 다.그렇지 않 습 니까?
절단면,통지 와 접점(무엇 인지,언제,어디 에 있 는 지)
위의 정 의 를 좀 더 형식화 하기 위해 로그 프로그램 을 예 로 들 어 AOP 에 관 한 세 가지 개념 을 소개 합 니 다.만약 당신 이 이 범례 를 더욱 연구 하기 로 결정 한다 면,이것들 은 당신 에 게 도움 이 될 것 입 니 다.
4.567917.절단면(무엇 입 니까?):이것 은 당신 이 목표 코드 에 주입 하고 자 하 는'절단면'이나 행동 입 니 다.우리 의 컨 텍스트 환경(JavaScript)에서 이것 은 당신 이 추가 하고 자 하 는 행동 을 봉인 하 는 함 수 를 말 합 니 다4.567917.알림(언제):이 절단면 이 언제 실행 되 기 를 바 랍 니까?"알림 은"before","after","around","whenThrowing"등 절단면 코드 를 실행 하고 싶 은 일반적인 시간 을 지정 합 니 다.반대로 코드 실행 과 관련 된 시간 대 를 말한다.코드 가 실 행 된 후에 인 용 된 부분 에 대해 이 절단면 은 반환 값 을 차단 하고 필요 할 때 덮어 쓸 수 있 습 니 다4.567917.접점(어디 에 있 습 니까?):그들 은 당신 이 주입 하고 자 하 는 절단면 이 목표 코드 에 있 는 위 치 를 인용 했다.이론 적 으로 목표 코드 에 있 는 모든 위 치 를 명확 하 게 지정 하여 절단면 코드 를 실행 할 수 있다.사실 이것 은 현실 적 이지 않 지만,당신 은 잠재 적 으로 지정 할 수 있 습 니 다.예 를 들 어'나의 대상 중의 모든 방법'이나'단지 이 특정한 방법',또는 우 리 는'모든 get'을 사용 할 수 있 습 니 다.시작 하 는 방법 같은 거이러한 설명 이 있 으 면 AOP 기반 라 이브 러 리 를 만들어 기 존의 OOP 기반 비 즈 니스 논리(예 를 들 어)에 로그 논 리 를 추가 하 는 것 이 상대 적 으로 쉽다 는 것 을 알 게 될 것 이다.사용자 정의 함수 로 대상 의 현재 일치 하 는 방법 을 바 꾸 는 것 입 니 다.이 사용자 정의 함 수 는 적당 한 시간 에 절단면 논 리 를 추가 한 다음 에 원래 의 방법 을 호출 합 니 다.
기본 실현
저 는 시각 학습자 이기 때문에 기본 적 인 예 를 보 여 주 는 것 이 어떻게 실현 하 는 지 설명 한다 고 생각 합 니 다.
AOP 기반 행동 을 추가 하 는 방법 은 긴 과정 이 될 것 이다.아래 의 예 는 그것 이 얼마나 쉬 운 지,그리고 그것 이 당신 의 코드 에 가 져 다 주 는 좋 은 점 을 설명 할 것 입 니 다.
`/** */ const getMethods = (obj) => Object.getOwnPropertyNames(Object.getPrototypeOf(obj)).filter(item => typeof obj[item] === 'function')
/** , */ function replaceMethod(target, methodName, aspect, advice) { const originalCode = target[methodName] target[methodName] = (...args) => { if(["before", "around"].includes(advice)) { aspect.apply(target, args) } const returnedValue = originalCode.apply(target, args) if(["after", "around"].includes(advice)) { aspect.apply(target, args) } if("afterReturning" == advice) { return aspect.apply(target, [returnedValue]) } else { return returnedValue
} } }
module.exports = { // : inject: function(target, aspect, advice, pointcut, method = null) { if(pointcut == "method") { if(method != null) { replaceMethod(target, method, aspect, advice)
} else { throw new Error("Tryin to add an aspect to a method, but no method specified") } } if(pointcut == "methods") { const methods = getMethods(target) methods.forEach( m => { replaceMethod(target, m, aspect, advice)
}) } } }`
매우 간단 하 다.내 가 언급 한 바 와 같이 위의 코드 는 모든 용례 를 포함 하지 않 았 지만,그것 은 다음 예 시 를 충분히 포함 할 수 있 을 것 이다.하지만 우리 가 아래 를 내 려 다 보기 전에 이것 을 주의 하 세 요.
replaceMethod
함수,이것 이 바로'마법'이 효력 이 발생 하 는 곳 입 니 다.그것 은 새로운 함 수 를 만 들 수도 있 고,우리 가 언제 절단면 을 호출 할 지,그리고 그것 의 반환 값 을 어떻게 처리 할 지 결정 할 수도 있다.다음은 이 라 이브 러 리 의 사용법 을 설명 합 니 다.
`const AOP = require("./aop.js")
class MyBussinessLogic {
add(a, b) {
console.log("Calling add")
return a + b
}
concat(a, b) {
console.log("Calling concat")
return a + b
}
power(a, b) {
console.log("Calling power")
return a ** b
}
}
const o = new MyBussinessLogic()
function loggingAspect(...args) { console.log("== Calling the logger function ==") console.log("Arguments received: " + args) }
function printTypeOfReturnedValueAspect(value) { console.log("Returned type: " + typeof value) }
AOP.inject(o, loggingAspect, "before", "methods") AOP.inject(o, printTypeOfReturnedValueAspect, "afterReturning", "methods")
o.add(2,2) o.concat("hello", "goodbye") o.power(2, 3)`
이것 은 단지 세 가지 방법 을 포함 하 는 기본 대상 일 뿐 특별한 것 은 없다.우 리 는 두 개의 통용 되 는 절단면 을 주입 하고 싶 습 니 다.하 나 는 받 은 속성 을 기록 하 는 데 사용 되 고 다른 하 나 는 그들의 반환 값 을 분석 하고 그들의 유형 을 기록 하 는 데 사 용 됩 니 다.두 개의 절단면,두 줄 코드.이 예 는 여기에서 끝 납 니 다.여 기 는 당신 이 얻 을 출력 입 니 다.
https://camo.githubusercontent.com/f18ef187f4acddab8df097c8aa4521d632e17759bc1c0831a22ada934388d7b5/68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f323030302f312a394b5a42774f6262714145754a4176314757537279672e706e67
AOP 의 장점
AOP 의 개념 과 용 도 를 알 게 된 후에 도 좋 습 니 다.왜 사람들 이 절단면 프로 그래 밍 을 사용 하려 고 하 는 지 알 아 맞 혔 지만 빠 른 집합 을 하 겠 습 니 다.
4.567917.가로로 관심 사 를 자 르 는 좋 은 방법.나 는 모든 항목 에서 중복 사용 할 수 있 는 코드 를 쉽게 읽 고 유지 하 는 것 을 의미 하기 때문에 포장 하 는 것 을 매우 좋아한다융통성 있 는 논리.절단면 을 주입 할 때 알림 과 접점 을 중심 으로 이 루어 지 는 논 리 는 유연성 을 제공 할 수 있다.반대로 코드 논리의 다른 단면 을 동적 으로 열 고 닫 는 데 도 도움 이 된다4.567917.크로스 항목 은 절단면 을 중복 사용 합 니 다.절단면 을 구성 요소 로 볼 수 있 습 니 다.즉,어디서 든 실행 할 수 있 는 작은 디 결합 코드 세 션 입 니 다.절단면 코드 를 정확하게 만 들 었 다 면 다른 항목 에서 쉽게 공유 할 수 있 습 니 다AOP 의 주요 문제점
모든 일이 완벽 한 것 은 아니 기 때문에,이런 패 러 다 임 은 일부 비판 자 들 의 반대 에 부 딪 혔 다.
그들 이 제기 한 주요 문 제 는 코드 논리 와 복잡성 을 숨 기 고 잘 모 르 는 상황 에서 부작용 이 생 길 수 있다 는 점 이다.
곰 곰 이 생각해 보면 그들 이 말 하 는 것 이 일리 가 있다.AOP 는 당신 에 게 많은 능력 을 주 었 고 무관 한 행 위 를 기 존의 방법 에 추가 할 수 있 으 며 심지어 그들의 전체 논 리 를 바 꿀 수 있다.물론 이것 은 이 패 러 다 임 을 도입 한 정확 한 원인 이 아니 라 내 가 위 에서 제공 한 예제 의 의도 가 아 닐 것 이다.
그러나 그것 은 당신 이 하고 싶 은 모든 일 을 하 게 할 수 있 고 좋 은 프로 그래 밍 실천 에 대한 이해 가 부족 해서 큰 혼란 을 초래 할 수 있 습 니 다.
진부 하 게 들 리 지 않도록 언 클 벤 의 말 을 전 해 드 리 겠 습 니 다.
능력 이 클 수록 책임 도 커진다
AOP 를 정확하게 사용 하려 면 소프트웨어 개발 의 최선 의 실천 을 이해 해 야 한다.
내 가 보기에,단지 당신 이 이 도 구 를 사용 한 후에 매우 큰 손 해 를 가 져 올 수 있 기 때문에,이 도구 가 좋 지 않다 는 것 을 설명 하기 에는 충분 하지 않다.왜냐하면 그것 도 많은 장점 을 가 져 올 수 있 기 때문이다.(즉,당신 은 많은 흔히 볼 수 있 는 논 리 를 집중 적 인 위치 로 추출 하고,당신 이 필요 로 하 는 어느 곳 에서 든 코드 로 그것 을 주입 할 수 있 기 때문이다.)나 에 게 있어 서 이것 은 강력 한 도구 로 배 울 가치 도 있 고 사용 할 가치 도 있다.
절단면 프로 그래 밍 은 OOP 의 완벽 한 보충 입 니 다.특히 자바 스 크 립 트 의 동적 특성 덕분에 우 리 는 그것 을 쉽게 실현 할 수 있 습 니 다(예 를 들 어 코드 프 리 젠 테 이 션).이 는 강력 한 기능 을 제공 하여 대량의 논리 에 대해 모듈 화 와 디 결합 을 할 수 있 고 나중에 다른 프로젝트 와 이런 논 리 를 공유 할 수 있다.
물론,만약 네가 그것 을 정확하게 사용 하지 않 는 다 면,너 는 일 을 엉망 으로 만 들 것 이다.하지만 당신 은 그것 을 이용 하여 대량의 코드 를 간소화 하고 정리 할 수 있 습 니 다.이것 이 바로 내 가 AOP 에 대한 생각 이다.너 는?AOP 라 고 들 어 본 적 있어 요?당신 은 이전에 그것 을 사용 한 적 이 있 습 니까?아래 에 댓 글 을 남기 고 당신 의 생각 을 공유 하 세 요!
자 바스 크 립 트 의 AOP 프로 그래 밍 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 js AOP 프로 그래 밍 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.