javascript 디자인 모드 인터페이스 소개

7214 단어
이 책의 첫 번 째 중요 한 내용 은 바로 인터페이스 다.
인 터 페 이 스 는 낯 설 지 않 을 것 이다. 쉽게 말 하면 인 터 페 이 스 는 계약 이나 규범 이다.강 한 유형의 관상 대상 언어 에서 인 터 페 이 스 는 쉽게 이 루어 질 수 있다.그러나 자바 script 에 서 는 인 터 페 이 스 를 만 들 거나 실현 하 는 방식 이 없 거나 한 유형 이 특정한 인 터 페 이 스 를 실현 하 는 지 여 부 를 판단 할 수 있 습 니 다. 우 리 는 js 의 유연성 특징 을 이용 하여 인 터 페 이 스 를 모 의 할 수 밖 에 없습니다.
javascript 에서 인 터 페 이 스 를 실현 하 는 세 가지 방식 이 있 습 니 다. 주석 설명, 속성 검증, 오리 모델 입 니 다.
노트: 제 가 본 것 은 영어 책 이기 때문에 번역 수준 이 제한 되 어 있 습 니 다. 어떤 단어 들 이 어떻게 번역 하 는 지 모 르 겠 습 니 다. 여러분 들 은 정신 만 깨 달 을 수 있 습 니 다.
1. 주석 설명 (설명 인터페이스 와 주석 설명)
예:
 
  
/*
interface Composite {
  function add(child);
  function remove(child);
  function getChild(index);
}
interface FormItem {
  function save();
}
*/
var CompositeForm = function(id, method, action) { // implements Composite, FormItem
  ...
};
//Implement the Composite interface.
CompositeForm.prototype.add = function(child) {
...
};
CompositeForm.prototype.remove = function(child) {
...
};
CompositeForm.prototype.getChild = function(index) {
...
};
// Implement the FormItem interface.
CompositeForm.prototype.save = function() {
...
};

다른 대상 언어 를 모 의 하고 interface 와 implements 키 워드 를 사용 하지만 문법 오류 가 없 도록 주석 을 달 아야 합 니 다.
이렇게 하 는 목적 은 단지 다른 프로그래머 에 게 이런 것들 이 어떤 방법 을 실현 해 야 하 는 지 알려 주기 위해 서 이 며, 프로 그래 밍 할 때 주의해 야 한다.그러나 이러한 인터페이스 에서 의 방법 을 정확하게 실 현 했 는 지 검증 하 는 방식 을 제공 하지 않 았 다. 이런 방식 은 바로 문서 화 된 방법 이다.
2. 속성 검증 (속성 검사 와 에 뮬 레이 션 인터페이스)
예:
 
  
/* interface
Composite {
function add(child);
function remove(child);
function getChild(index);
}
interface FormItem {
function save();
}
*/
var CompositeForm = function(id, method, action) {
this.implementsInterfaces = ['Composite', 'FormItem'];
...
};
...
function addForm(formInstance) {
if(!implements(formInstance, 'Composite', 'FormItem')) {
    throw new Error("Object does not implement a required interface.");
  }
  ...
}
// The implements function, which checks to see if an object declares that it
// implements the required interfaces.
function implements(object) {
  for(var i = 1; i < arguments.length; i++) {
    // Looping through all arguments
    // after the first one.
    var interfaceName = arguments[i];
    var interfaceFound = false;
    for(var j = 0; j < object.implementsInterfaces.length; j++) {
      if(object.implementsInterfaces[j] == interfaceName) {
        interfaceFound = true;
        break;
      }
    }
    if(!interfaceFound) {
      return false;
      // An interface was not found.
   }
  }
  return true;
// All interfaces were found.
}

이런 방식 은 첫 번 째 방식 보다 개선 되 었 고 인터페이스의 정 의 는 주석 으로 이 루어 졌 으 나 검증 방법 을 추가 하여 한 유형 이 특정한 인 터 페 이 스 를 실현 하 는 지 판단 했다.
3. 오리 유형 (오리 타이 핑 과 에 뮬 레이 션 인터페이스)
 
  
// Interfaces.
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']);
var FormItem = new Interface('FormItem', ['save']);
// CompositeForm class
var CompositeForm = function(id, method, action) {
  ...
};
...
function addForm(formInstance) {
  ensureImplements(formInstance, Composite, FormItem);
  // This function will throw an error if a required method is not implemented.
  ...
}
// Constructor.
var Interface = function(name, methods) {
  if(arguments.length != 2) {
    throw new Error("Interface constructor called with "
             + arguments.length + "arguments, but expected exactly 2.");
  }
  this.name = name;
  this.methods = [];
  for(var i = 0, len = methods.length; i < len; i++) {
    if(typeof methods[i] !== 'string') {
      throw new Error("Interface constructor expects method names to be "
              + "passed in as a string.");
    }
    this.methods.push(methods[i]);
  }
};
// Static class method.
Interface.ensureImplements = function(object) {
  if(arguments.length < 2) {
    throw new Error("Function Interface.ensureImplements called with "
              +arguments.length + "arguments, but expected at least 2.");
  }
for(var i = 1, len = arguments.length; i < len; i++) {
    var interface = arguments[i];
    if(interface.constructor !== Interface) {
      throw new Error("Function Interface.ensureImplements expects arguments"
              + "two and above to be instances of Interface.");
    }
    for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
      var method = interface.methods[j];
      if(!object[method] || typeof object[method] !== 'function') {
        throw new Error("Function Interface.ensureImplements: object "
                + "does not implement the " + interface.name + " interface. Method " + method + " was not found.");
      }
    }
  }
};

인 터 페 이 스 는 언제 사용 합 니까?
엄격 한 유형 검증 을 사용 하 는 것 은 적합 하지 않 습 니 다. 대부분의 자바 script 프로그래머 들 은 인터페이스 와 인터페이스 검증 이 없 는 상태 에서 여러 해 동안 프로 그래 밍 되 었 기 때 문 입 니 다.디자인 모델 로 복잡 한 시스템 을 설계 하기 시 작 했 을 때 인 터 페 이 스 를 사용 하 는 것 이 더 좋다.인 터 페 이 스 를 사용 하 는 것 이 자바 script 의 유연성 을 제한 하 는 것 처럼 보이 지만, 실제로 그 는 당신 의 코드 를 더욱 부 드 럽 게 결합 시 켰 습 니 다.그 는 당신 의 코드 를 더욱 유연 하 게 만 들 었 습 니 다. 당신 은 모든 종류의 변 수 를 전송 할 수 있 고 그 가 원 하 는 방법 이 있다 는 것 을 보증 할 수 있 습 니 다.많은 장면 인터페이스 가 사용 하기에 매우 적합 하 다.
대형 시스템 에서 많은 프로그래머 들 이 개발 프로젝트 에 참여 하면 인터페이스 가 매우 필요 하 다.프로그래머 는 아직 실현 되 지 않 은 api 를 자주 방문 하거나 다른 프로그래머 에 게 다른 사람 이 의존 하 는 방법 을 제공 해 야 한다. 이런 상황 에서 인 터 페 이 스 는 상당히 가치 가 있다.그들 은 api 를 문서화 하고 프로 그래 밍 계약 으로 할 수 있다.캐 시 루트 가 실 현 된 api 가 바 뀌 었 을 때 개발 과정 에서 api 가 바 뀌 면 이 인 터 페 이 스 를 실현 하 는 다른 방법 으로 틈새 없 이 바 뀔 수 있다 는 것 을 바로 알 수 있 습 니 다.
어떻게 인 터 페 이 스 를 사용 합 니까?
우선 해결 해 야 할 문 제 는 코드 에 인 터 페 이 스 를 사용 하기에 적합 한 지 하 는 것 이다.작은 프로젝트 라면 인 터 페 이 스 를 사용 하면 코드 의 복잡 도 를 증가 시 킬 수 있다.그래서 인 터 페 이 스 를 사용 하 는 상황 에서 단점 보다 이 로 운 점 이 있 는 지 확인 해 야 한다.인 터 페 이 스 를 사용 하려 면 다음 과 같은 몇 가지 제안 이 있 습 니 다.
1. 인터페이스 클래스 를 페이지 파일 로 참조 합 니 다.interface 의 원본 파일 은 다음 사이트 에서 찾 을 수 있 습 니 다:http://jsdesignpatterns.com/.
2. 코드 를 확인 하고 어떤 방법 이 인터페이스 에 추상 화 되 어야 하 는 지 확인 하 세 요.
3. 인터페이스 대상 을 만 들 고 인터페이스 대상 에 관련 된 방법 이 포함 되 어 있 지 않 습 니 다.
4. 모든 구조 기 검증 을 제거 하고 우 리 는 세 번 째 인터페이스 실현 방식, 즉 오리 유형 을 사용 할 것 이다.
5. 구조 기 대신 인터페이스. ensureImplements 로 검증 합 니 다.

좋은 웹페이지 즐겨찾기