자 바스 크 립 트 가 함수 리 셋 을 쉽게 지원 하도록 (Part 2 - 구현)

5870 단어
텍스트 서명 식별
지난 글 에서 언급 한 Overload 사례 를 살 펴 보 겠 습 니 다.
 
  
var extend = Overload
.add("*, ...",
function(target) { })
.add("Boolean, *, ...",
function(deep, target) { });

다시 불 러 오 는 서명 을 표시 하 는 문자열 을 입력 할 수 있 습 니 다.사용자 가 함 수 를 호출 할 때, 우 리 는 사용자 가 입력 한 매개 변수 인 스 턴 스 를 가지 고 서명 한 매개 변수 유형 과 비교 해 야 하기 때문에, 우 리 는 먼저 이 문자열 을 유형 배열 로 변환 해 야 합 니 다.문자열 'Boolean, Number, Array' 를 배열 [Boolean, Number, Array] 로 변환 해 야 한 다 는 것 이다.
전환 을 진행 하기 전에 우 리 는 먼저 두 가지 특수 유형 을 처리 하 는 것 을 고려 해 야 한다. 바로 임 의 유형 을 대표 하 는 '*' 와 임 의 수량 을 대표 하 는 '...' 이다.오 버 로드 에서 특별한 호환성 처 리 를 할 수 있 도록 두 가지 고유 유형 을 정의 할 수 있 습 니 다.
 
  
Overload.Any = function() {};
Overload.More = function() {};

이 두 가지 유형 이 있 으 면 문자열 'Boolean, *,...' 은 배열 [Boolean, Overload. Any, Overload. More] 로 정확하게 전 환 됩 니 다.Overload. Any 와 Overload. More 는 모두 함수 이기 때문에 자 연 스 럽 게 유형 으로 볼 수 있 습 니 다.
이 두 가지 유형 이 정확하게 처 리 된 후에 우 리 는 텍스트 서명 을 식별 하 는 변환 함 수 를 작성 할 수 있 습 니 다.
 
  
if (signature.replace(/(^\s+|\s+$)/ig, "") == "") {
signature = [];
} else {
signature = signature.split(",");
for (var i = 0; i < signature.length; i++) {
var typeExpression = signature[i].replace(/(^\s+|\s+$)/ig, "");
var type = null;
if (typeExpression == "*") {
type = Overload.Any;
} else if (typeExpression == "...") {
type = Overload.More;
} else {
type = eval("(" + typeExpression + ")");
}
signature[i] = type;
}
}

나 는 이 코드 가 상당히 이해 하기 쉬 워 서 더 이상 설명 하지 않 을 것 이 라 고 생각한다.제 가 이 코드 를 처음 썼 을 때 첫 번 째 if 를 쓰 는 것 을 잊 어 버 려 서 공백 서명 문자열 을 만 들 었 습 니 다. "공백 서명 배열 [] 로 정확하게 인식 되 지 못 했 습 니 다. 다행히 제 유닛 test 코드 는 이 결함 을 최초 로 발 견 했 습 니 다.유닛 test 코드 를 만 드 는 것 이 중요 한 것 같 습 니 다.
일치 함수 서명
함수 서명 의 형식 배열 을 얻 은 후에 우 리 는 그것 을 입력 매개 변수의 인 스 턴 스 배열 과 일치 시 켜 정확 한 재 부팅 을 찾 을 수 있 습 니 다.함수 서명 과 어떻게 일치 하 는 지 에 대해 토론 하기 전에 C \ # 또는 VB. NET 같은 언어 가 함수 재 업로드 와 일치 하 는 지 살 펴 보 겠 습 니 다.일반 언어 에서 함수 리 셋 이 일치 하 는 프로 세 스 는 다음 과 같 습 니 다.
매개 변수 개수 - 매개 변수 개수 가 맞지 않 는 리 셋 은 제 거 됩 니 다.
매개 변수 형식 - 매개 변수 형식 을 서명 형식 으로 숨 길 수 없 는 것 은 제 외 됩 니 다.
일치 개수 - 제거 완료 후 나머지 일치 하 는 서명 개수 에 따라 처리 방법 이 다 릅 니 다.
0 개 일치 - 적중 일치 없 음
1 개 일치. - 이게 명중 의 일치 야.
2 개 이상 의 일치 - 이 일치 에서 가장 좋 은 일치 하 는 것 을 찾 을 수 있다 면 가장 좋 은 일치 하 는 것 을 명중 시 킵 니 다.그렇지 않 으 면 일치 하 는 것 이 명중 되 지 않 습 니 다.
이 절 에서 우 리 는 먼저 프로 세 스 의 앞의 두 단 계 를 처리 하고 매개 변수 개수 나 매개 변수 유형 이 일치 하지 않 는 서명 을 제거 합 니 다.
 
  
var matchSignature = function(argumentsArray, signature) {
if (argumentsArray.length < signature.length) {
return false;
} else if (argumentsArray.length > signature.length && !signature.more) {
return false;
}
for (var i = 0; i < signature.length; i++) {
if (!(signature[i] == Overload.Any
|| argumentsArray[i] instanceof signature[i]
|| argumentsArray[i].constructor == signature[i])) {
return false;
}
}
return true;
};

길 이 를 비교 하기 위해 서 우 리 는 이 함수 밖에서 모든 매개 변수 개 수 를 나타 내 는 "..." 에 대해 특수 처 리 를 해 야 합 니 다.
 
  
if (signature[signature.length - 1] == Overload.More) {
signature.length = signature.length - 1;
signature.more = true;
}

이 코드 는 1 절 변환 함수 말단 에 통합 되 어 match Signature 함수 가 서명 과 일치 하 는 지 여 부 를 쉽게 판단 할 수 있 도록 합 니 다.가장 이상 적 인 상황 에서 우 리 는 입력 매개 변수 유형 에 대해 0 개 또는 1 개의 과부하 에 일치 합 니 다. 그러면 우 리 는 어느 과부하 에 명중 하 는 지 쉽게 판단 할 수 있 습 니 다.그러나 2 개 이상 의 과부하 가 일치 하면 우 리 는 그 중에서 가장 좋 은 것 을 선택해 야 한다. 이것 이 바로 다음 절 에서 토론 할 내용 이다.
다 중 일치 처리
C \ # 다 중 일치 에서 일치 하 는 리 셋 을 어떻게 선택 하 는 지 에 대해 서 는 C \ # Language Specification 의 관련 장 을 볼 수 있 습 니 다.나 는 세 가지 간단 한 예 를 통 해 문 제 를 설명 할 수 있다 고 생각한다.
 
  
long Sum(int x, int y) { return x + y; }
long Sum(long x, long y) { return x + y; }
Sum(0, 1);

0 과 1 이라는 두 매개 변 수 는 컴 파일 러 에 의 해 int 형식 으로 이해 되 기 때문에 첫 번 째 리 셋 에 대해 서 는 유형 전환 을 하지 않 고 두 번 째 리 셋 과 유형 전환 을 해 야 하기 때문에 첫 번 째 리 셋 이 좋 습 니 다.
 
  
long Sum(int x, long y) { return x + y; }
long Sum(long x, int y) { return x + y; }
Sum(0, 1);

첫 번 째 매개 변수 에서 첫 번 째 적재량 이 비교적 좋다.두 번 째 매개 변수 에 서 는 두 번 째 과부하 가 좋 습 니 다.이런 상황 에서 어떤 과부하 도 다른 것 보다 좋 지 않 고 비교적 좋 은 과부하 컴 파일 러 를 찾 지 못 하면 잘못 보고 합 니 다.
 
  
long Sum(int x, int y) { return x + y; }
long Sum(int x, long y) { return x + y; }
long Sum(long x, int y) { return x + y; }
Sum(0, 1);

첫 번 째 매개 변수 에서 첫 번 째 적재량 은 세 번 째 적재량 보다 낫 고 두 번 째 적재량 과 다름없다.두 번 째 매개 변수 에서 첫 번 째 적재량 은 두 번 째 적재량 보다 낫 고 세 번 째 적재량 과 다름없다.비록 두 번 째 적재량 이 세 번 째 적재량 에 있어 서 우열 을 가 릴 수 없 지만, 우 리 는 첫 번 째 적재량 이 그것들 보다 좋다 는 것 을 확정 할 수 있 기 때문에 컴 파 일 러 는 첫 번 째 적재량 을 선택 했다.
만약 에 우리 가 overload Comparator 의 비교 함수 가 있다 고 가정 하면 임의의 두 서명 간 의 우열 을 비교 할 수 있 습 니 다. 우 리 는 서명 에 대해 두 가지 만 비교 해서 가장 좋 은 무 거 운 짐 을 찾 아야 합 니까?사실 필요 하지 않 습 니 다. 우 리 는 Array 의 sort 방법 을 이용 하여 overload Comparator 를 호출 하여 순 서 를 매 긴 후에 앞의 두 명의 관 계 를 검증 하면 됩 니 다. 병렬 하면 그 어떠한 것 도 명중 시 키 지 않 습 니 다.선착순 이 있 으 면 첫 번 째 를 명중한다.
구체 적 인 overload Comparator 코드 는 여기 서 제시 되 지 않 습 니 다. 이 는 다른 inheritance Comparator 라 는 비교 함수 에 의존 하여 두 서명 의 매개 변수 유형 중 어느 것 이 실제 들 어 오 는 매개 변수 유형 을 비교 하 는 지, 그 안에 비교적 교묘 한 방법 으로 두 유형 이 계승 관계 인지, 그리고 누가 누 구 를 계승 하 는 지 판단 합 니 다.
작은 매듭
현재 우 리 는 JavaScript 의 함수 리 셋 라 이브 러 리 가 있 습 니 다. 전체 코드 는 여 기 를 보십시오. 함수 리 셋 라 이브 러 리 Overload.이 라 이브 러 리 가 자바 스 크 립 트 코드 의 가 독성 을 향상 시 키 고 대형 Ajax 프로젝트 의 유지 비용 을 낮 추 는 데 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기