머리말
이 장에서는 단단한 JavaScript의 5 가지 주요 원칙 인 인터페이스 분리 원칙을 구현 한 네 번째 장을 설명 할 것입니다.
오리지널 영어 텍스트 : http://freshbrewedcode.com/derekgreeer/2012/01/08/solid-javaScript--interface-Segation-principle/
참고 :이 기사의 저자는 상당히 감동적이므로 삼촌도 그것을 이해하기 위해 우울합니다. 원하는대로 읽으십시오.
인터페이스 격리의 원리에 대한 설명은 다음과 같습니다.
코드 사본은 다음과 같습니다.
고객은 사용하지 않는 방법에 의존해서는 안됩니다.
고객은 사용하지 않는 방법에 의존해서는 안됩니다.
사용자가 의존하는 인터페이스 방법이 다른 사용자 만 사용하고 사용하지 않으면 이러한 인터페이스를 구현해야합니다. 다시 말해, 사용자가 사용되지 않았지만 다른 사용자가 사용하는 인터페이스에 의존하는 경우 다른 사용자가 인터페이스를 수정하면 인터페이스에 의존하는 모든 사용자가 영향을받습니다. 이것은 분명히 개방 및 폐쇄의 원리를 위반하며 우리가 기대하는 것이 아닙니다.
인터페이스 격리 원리 ISP는 단일 책임과 다소 유사합니다. 둘 다 기능적 책임을 집계하는 데 사용됩니다. 실제로, ISP는 단일 책임이있는 프로그램을 공개 인터페이스의 객체로 변환하는 것으로 이해 될 수 있습니다.
JavaScript 인터페이스
우리는 JavaScript에 따라이 원칙을 어떻게 준수합니까? 결국 JavaScript에는 인터페이스 기능이 없습니다. 인터페이스가 우리가 특정 언어로 제공된 추상 유형을 통해 계약을 설정하고 분리하려는 경우, 괜찮다고 말할 수 있지만 JavaScript에는 다른 형태의 인터페이스가 있습니다. 책 디자인 패턴에서 재사용 가능한 객체 지향 소프트웨어의 요소는 인터페이스의 정의를 찾았습니다.
http://www.amazon.com/design-pattern-lements-reusable-object-oriented/dp/0201633612
객체로 선언 된 모든 작업에는 작업 이름, 매개 변수 개체 및 작업의 리턴 값이 포함됩니다. 우리는 그것을 연산자의 서명이라고 부릅니다.
객체에서 선언 된 모든 작업을이 객체의 인터페이스라고합니다. 객체의 인터페이스는이 객체에서 발생하는 모든 요청 정보를 나타냅니다.
언어가 인터페이스를 나타내는 별도의 구성을 제공하는지 여부에 관계없이 모든 객체는 객체의 모든 속성과 방법으로 구성된 암시 적 인터페이스를 갖습니다. 다음 코드를 참조하십시오.
코드 사본은 다음과 같습니다.
var ExampleBinder = {};
examplebinder.modelobserver = (function () {
/* 개인 변수*/
반품 {
관찰 : function (model) {
/* 코드*/
NewModel을 반환하십시오.
},
onchange : 함수 (콜백) {
/* 코드*/
}
}
}) ();
exampleBinder.ViewAdAptor = (function () {
/* 개인 변수*/
반품 {
bind : function (model) {
/* 코드*/
}
}
}) ();
exampleBinder.bind = function (model) {
/* 개인 변수*/
exampleBinder.ModelObServer.onChange (/ * 콜백 콜백 */);
var om = exampleBinder.ModelObserver.Observe (모델);
exampleBinder.ViewAdAptor.bind (OM);
Return OM;
};
위의 examplebinder 클래스 라이브러리는 양방향 바인딩을 구현합니다. 이 클래스 라이브러리에 노출 된 공개 인터페이스는 BIND 메소드이며, BIND에 사용 된 변경 알림 및 뷰 상호 작용의 함수는 각각 별도의 개체 ModelObserver 및 ViewAdaptor에 의해 구현됩니다. 이러한 객체는 어떤 의미에서 공개 인터페이스 바인드 방법의 특정 구현입니다.
JavaScript는 객체 계약을 지원하기위한 인터페이스 유형을 제공하지 않지만 객체의 암시 적 인터페이스는 여전히 프로그램 사용자에게 계약으로 제공 될 수 있습니다.
ISP 및 JavaScript
아래에서 논의하는 하위 섹션 중 일부는 JavaScript에서 인터페이스 격리 원리를 위반하는 영향입니다. 위에서 볼 수 있듯이 JavaScript 프로그램에서 인터페이스 격리 원칙을 구현하는 것은 유감이지만 정적으로 입력 한 언어만큼 강력하지는 않습니다. JavaScript의 언어 특성은 때때로 소위 인터페이스를 약간 스틱하지 않습니다.
타락의 실현
정적으로 입력 한 언어에서 ISP 원칙을 위반 한 이유 중 하나는 퇴화 구현입니다. Java 및 C#의 모든 인터페이스에 정의 된 방법은 구현되어야합니다. 몇 가지만 필요한 경우 다른 방법도 구현되어야합니다 (빈 또는 던지기 예외로 구현할 수 있음). JavaScript에서는 객체의 일부 인터페이스 만 필요하면 위의 인터페이스의 구현을 강요 할 필요는 없지만 퇴보 구현 문제를 해결할 수는 없습니다. 그러나이 구현은 여전히 Richter 교체의 원칙을 위반합니다.
코드 사본은 다음과 같습니다.
var 사각형 = {
영역 : function () {
/* 코드*/
},
드로우 : function () {
/* 코드*/
}
};
var geometryapplication = {
getLargestrectangle : 함수 (직사각형) {
/* 코드*/
}
};
var drawingApplication = {
DrawRectAngles : 함수 (직사각형) {
/* 코드*/
}
};
새로운 객체 GeometryApplication의 getLargestrectangle을 만족시키기위한 사각형 대안이 있으면 사각형 영역 () 메소드 만 필요하지만 LSP를 위반합니다 (DrawRectAngles 메소드에서만 사용할 수있는 드로우 방법을 사용할 수 없기 때문에).
정적 커플 링
정적으로 입력 한 언어에서 ISP 위반의 또 다른 이유는 정적 커플 링입니다. 정적으로 입력 한 언어에서 인터페이스는 느슨하게 결합 된 설계 프로그램에서 중요한 역할을합니다. 동적 또는 정적 언어이든, 때로는 객체가 여러 클라이언트 사용자 (예 : 공유 상태)간에 통신해야 할 수도 있습니다. 정적으로 타이핑 된 언어의 경우 최상의 솔루션은 역할 인터페이스를 사용하는 것입니다.이 인터페이스는 사용자가 사용자와 관련된 동작을 분리하기 위해 구현하여 객체 (여러 역할을 수행해야 할 수 있음)와 상호 작용할 수 있습니다. 객체는 동적 언어의 고유 한 장점에 의해 분리되기 때문에 JavaScript에는 그러한 문제가 없습니다.
시맨틱 커플 링
ISP를 위반하는 일반적인 이유 중 하나는 동적 및 정적으로 입력 한 언어이며, 이는 의미 론적 커플 링입니다. 소위 시맨틱 커플 링은 상호 의존성, 즉 객체의 동작은 다른 객체에 의존합니다. 즉, 사용자가 동작 중 하나를 변경하면 다른 사용자에게 영향을 줄 수 있음을 의미합니다. 이것은 또한 단일 책임의 원칙을 위반합니다. 이 문제는 상속 및 객체 대체를 통해 해결 될 수 있습니다.
확장 성
문제의 또 다른 이유는 확장성에 관한 것입니다. 많은 사람들이 콜백에 대한 예제를 제공하여 확장 성을 보여줍니다 (예 : AJAX에서 성공한 후 콜백 설정과 같은). 이러한 인터페이스에 구현이 필요 하고이 구현의 객체에 친숙하거나 방법이 많이 있다면 ISP가 매우 중요해질 것입니다. 즉, 인터페이스 인터페이스가 많은 메소드를 구현해야 할 필요성이되면 구현이 극도로 복잡해질 것이며 이러한 인터페이스가 끈적 끈적하지 않은 책임을지게 할 수 있습니다. 이것은 우리가 자주 언급 한 지방 인터페이스입니다.
요약
JavaScript의 동적 언어 특성은 정적으로 입력 된 언어보다 스틱이 아닌 인터페이스의 구현을 덜 영향을 미치지 만 인터페이스 격리의 원칙은 여전히 JavaScript 프로그래밍 모델에서 기능을 가지고 있습니다.