자 바스 크 립 트 가 함수 리 셋 을 쉽게 지원 하도록 (Part 1 - 디자인)
JavaScript 는 함수 리 셋 을 지원 합 니까?지지 하지 않 는 다 고 할 수도 있 고 지지 라 고 할 수도 있다.지원 하지 않 는 다 고 말 하 는 것 은 JavaScript 가 다른 원생 지원 함수 가 다시 불 러 오 는 언어 처럼 여러 개의 동명 함 수 를 직접 써 서 컴 파일 러 로 하여 금 어떤 호출 에 대응 하 는 것 이 어떤 재 불 러 오 는 지 판단 하 게 할 수 없 기 때 문 입 니 다.지원 이 라 고 말 하 는 것 은 JavaScript 함수 가 매개 변수 목록 에 대해 어떠한 제한 도 하지 않 기 때문에 함수 내부 에서 함수 리 셋 에 대한 지원 을 모 의 할 수 있 습 니 다.
실제로 많은 유명한 오픈 소스 라 이브 러 리 에서 우 리 는 함수 내부 에서 재 부팅 지원 을 모 의 하 는 디자인 을 볼 수 있다.예 를 들 어 jQuery 의 jQuery. extend 방법 은 매개 변수 유형 을 통 해 선택 가능 한 매개 변수 가 존재 하 는 지 여 부 를 판단 하고 존재 하지 않 으 면 매개 변 수 를 이동 하여 뒤의 논리 가 정확하게 작 동 하도록 하 는 것 이다.나 는 많은 사람들 이 자바 스 크 립 트 를 쓸 때 도 비슷 한 코드 를 써 서 기능 이 풍부 한 함수 에 간단 한 호출 입 구 를 제공 할 것 이 라 고 믿는다.
그러나 하나의 근본 적 인 문 제 를 만 드 는 것 은 바로 DRY 원칙 을 위반 한 것 이다.리 셋 을 지원 하 는 함수 마다 내부 에 코드 가 한 단락 씩 더 나 와 매개 변수 개수 와 매개 변수 유형 에 따라 리 셋 을 처리 하 는데 사용 된다. 이 코드 들 은 중 복 된 논 리 를 내포 하고 있 지만 쓰 면 단락 마다 다르다.그 밖 에 이 코드 들 을 유지 하 는 것 도 쉽 지 않 습 니 다. 코드 를 읽 을 때 함수 가 지원 하 는 몇 가지 리 셋 방식 이 무엇 인지 한눈 에 알 수 없 기 때문에 리 셋 을 유지 하 는 것 도 어렵 습 니 다.
재 부팅 입 구 를 설명 하 는 DSL
나 는 자바 스 크 립 트 에서 재 부팅 입 구 를 간단 한 방식 으로 묘사 할 수 있 기 를 바란다.가장 좋 은 것 은 다른 언어 에서 처럼 함수 서명 을 사용 하여 리 셋 입 구 를 구분 하 는 것 입 니 다. 함수 서명 이 이 방면 에서 가장 좋 은 DSL 이 라 고 생각 하기 때 문 입 니 다.제 가상 에서 자 바스 크 립 트 문법 에 가장 부합 되 는 리 셋 입 구 는 DSL 이 이렇게 되 어야 합 니 다.
var sum = new Overload();
sum.add("Number, Number",
function(x, y) { return x + y; });
sum.add("Number, Number, Number",
function(x, y, z) { return x + y + z; });
리 셋 입구 와 대응 하 는 함수 체 를 설명 한 후 sum 함수 에 대한 호출 은 다음 과 같 아야 합 니 다.
sum(1, 2);
sum(1, 2, 3);
상기 코드 는 내 가 보기 에는 매우 뚜렷 하고 유지 하기 쉽다. 다시 불 러 오 는 입구 의 서명 을 한눈 에 볼 수 있 고 다시 불 러 오 는 입 구 를 수정 하거나 늘 리 는 것 도 쉬 운 일이 다.그러나 우 리 는 자바 스 크 립 트 의 함수 가 new 로 나 올 수 없다 는 문 제 를 만 났 습 니 다. new Overload () 를 통 해 얻 은 대상 은 반드시 호출 되 지 않 습 니 다. 이 를 위해 우 리 는 Overload 를 정적 클래스 로 만 들 수 있 습 니 다. 정적 방법 은 Function 인 스 턴 스 로 돌아 갑 니 다.
var sum = Overload
.add("Number, Number",
function(x, y) { return x + y; })
.add("Number, Number, Number",
function(x, y, z) { return x + y + z; });
필요 한 과부하 입구 지원
상기 DSL 로 설명 할 수 없 는 흔 한 JavaScript 함수 입 구 를 상상 해 보 세 요.내 가 아 는 것 은 두 가지 가 있다.
임의의 형식 매개 변수
만약 에 우리 가 each 함 수 를 쓰 려 고 한다 면 Array 에 대해 아래 표 시 를 교체 하고 다른 유형 에 대해 모든 구성원 을 교체 합 니 다. 이 두 함수 입구 의 매개 변수 목록 은 어떻게 설명 합 니까?C \ # 를 사용 하면 두 함수 입 구 를 이렇게 설명 합 니 다.
void Each(IEnumerable iterator) { }
void Each(object iterator) { }
그러나 자바 스 크 립 트 에서 Object 는 모든 유형의 기본 클래스 가 아 닙 니 다. (100) intance of Object 의 결 과 는 false 이기 때문에 우 리 는 Object 로 임의의 유형 을 가리 킬 수 없습니다. 새로운 기 호 를 도입 하여 임의의 유형 을 가리 켜 야 합 니 다.이 기 호 는 존재 할 수 있 는 모든 종류의 이름과 충돌 하지 말 아야 한 다 는 것 을 고려 하여 나 는 '*' 로 임의의 유형 을 표시 하 는 것 을 선택 했다.위 C \ # 코드 에 대응 하 는 JavaScript 는 다음 과 같 을 것 입 니 다.
var each = Overload
.add("Array",
function(array) { })
.add("*",
function(object) { });
임의의 수량 매개 변수
자 바스 크 립 트 함수 에서 임의의 매개 변 수 를 지원 하 는 것 은 흔 한 수요 입 니 다. C \ # 에 있 는 파 라 메 트릭 키워드 보다 사용률 이 훨씬 많 을 것 이 라 고 믿 습 니 다.우리 가 이전에 제정 한 규칙 에서 이것 도 묘사 할 수 없 기 때문에 우 리 는 유형 과 충돌 하지 않 는 기 호 를 도입 하여 C \ # 중의 params 를 표시 해 야 한다.나 는 "..." 로 params 를 표시 하 는 것 을 선택 했다. 여기 서 여러 개의 인자 가 나타 나 면 받 아들 일 수 있다 는 뜻 이다.jQuery. extend 의 무 거 운 짐 을 어떻게 설명 하 는 지 보 여 줍 니 다.
var extend = Overload
.add("*, ...",
function(target) { })
.add("Boolean, *, ...",
function(deep, target) { });
작은 매듭
이 글 에서 우 리 는 자바 스 크 립 트 에 적용 되 고 읽 기 쉬 우 며 유지 하기 쉬 운 함수 재 업로드 쓰기 방법 을 설계 하려 고 합 니 다.다음 글 에서 이 디자인 을 실현 하기 위해 Overload 클래스 를 작성 해 보 겠 습 니 다.놓 치고 싶 지 않다 면 구독 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.