Javascript를 이용한 디자인 패턴의 중요성, NodeJs et al


36

향후 몇 년 동안 Javascript가 웹의 유비쿼터스 프로그래밍 언어 인 것처럼 보이면 5 분마다 새로운 프레임 워크가 나타나고 서버와 클라이언트 측 모두를 주도하는 이벤트 중심 프로그래밍이 이루어집니다.

Javascript 개발자로서 기존 디자인 패턴을 다른 언어 / 환경에서보다 중요하거나 덜 중요하게 생각하십니까?.

Javascript 개발자가 정기적으로 사용하는 상위 3 가지 디자인 패턴의 이름을 지정하고 Javascript 개발에 어떻게 도움이되었는지에 대한 예를 제공하십시오.


5
일부 사람들은 디자인 패턴 (특히 GoF 패턴)이 언어 부족의 징후라고 주장합니다 ( 이 토론 참조 ). JavaScript는 본질적으로 프로토 타입이며 기능적이므로 다른 패턴 세트가 적용 가능하고 유용하다고 말합니다.

답변에 매우 관심이 있습니다 ... +1 질문 :)
usoban

2
Stoyan Stefanov의 JavaScript Patterns 책 은 JS에서 사용할 수있는 수많은 패턴에 대한 훌륭한 자료입니다. 많은 언어가 JS 용으로 존재하지만 다른 언어 용으로는 존재하지 않습니다.
IgorGanapolsky

자바 스크립트는 고유 한 패턴을 가지고 있습니다. Igor가 언급 한 책 외에도 Addy Osmani의 Learning Javascript Design Patterns 도 무료입니다.
user16764

답변:


23

Javascript 개발자로서 기존 디자인 패턴을 다른 언어 / 환경에서보다 중요하거나 덜 중요하게 생각하십니까?.

클래식 디자인 패턴은 JavaScript에 적용되지 않습니다.

적용되는 것은 모듈 식 및 기능적 코드 작성입니다.

생성자와 일급 함수를 혼합하여 사용해야합니다.

JavaScript 개발자로서 저는 개인적으로 JavaScript를 Java가 아닌 LISP로 취급하려고합니다. 따라서 모나드와 고급 기능적 스타일 코드를 에뮬레이션하는 대신 고전적인 OOP 코드를 에뮬레이션하십시오.

Javascript 개발자가 정기적으로 사용하는 상위 3 가지 디자인 패턴의 이름을 지정하고 Javascript 개발에 어떻게 도움이되었는지에 대한 예를 제공하십시오.

다시 디자인 패턴은 그다지 적용되지 않지만 아래는 세 가지 중요한 구성입니다.

  1. 폐쇄 사용
  2. 일급 함수 사용
  3. 유무에 관계없이 객체 팩토리 사용 new

전통적인 디자인 패턴을 사용하여 동일한 종류의 코드를 수행하는 것과 비교할 때 이러한 기술의 예를 보여줄 수있는 컨텍스트를 남겨 두십시오.

고전적인 디자인 패턴 중 일부 와 js에서 구현하는 방법과 js에 더 적합한 대안 패턴을 살펴 보겠습니다 .

관찰자 패턴 :

에서 node.js이 단순히이다 events.EventEmitter. 에서 jQuery이입니다 $.fn.bind&& $.fn.trigger. 에서 backbone이것이다 Backbone.Events.trigger하고 Backbone.Events.bind. 이것은 일상적인 코드에서 사용되는 매우 일반적인 패턴입니다.

나는 멈추지 않고 "여기서 관찰자 패턴을 사용하고 있습니다!"라고 생각하지 않습니다. 아니요, 이는 메시지를 전달하는 낮은 수준의 방법이거나 변경 사항을 캐스케이드하는 방법 일뿐입니다.

예를 들어 백본에서 모든 MVC 뷰는 모델 onchange이벤트에 바인딩 되므로 모델을 변경하면 모든 변경 사항이 뷰에 자동으로 연계됩니다. 예, 이것은 강력한 패턴이지만, 사용되지 않는 이벤트 중심 프로그래밍에서는 매우 일반적으로 사용됩니다.

WebSocket프로토콜 에서는 이벤트 .on에 바인딩하는 데 사용 on("message", ...합니다. 다시 말하지만 이것은 매우 일반적이지만 클래식 OOP 기반이 아닌 스트림의 관찰자입니다 while (byte b = Stream.ReadNextByte()).

이것들은 모두 Observer 패턴을 강력하게 사용합니다. 그러나 이것은 사용하는 패턴이 아닙니다. 이것은 언어의 간단한 부분입니다. 이것은 단지 코드입니다.

메멘토 패턴 :

이것은 단순히 JSON입니다. 작업 상태를 취소 할 수 있도록 개체의 상태를 직렬화 할 수 있습니다.

function SomeObject() {
    var internalState;

    this.toJSON = function() {
        return internalState;
    }

    this.set = function(data) {
        internalState = data;
    }

    this.restore = function(json) {
        internalState = JSON.parse(json);
    }
}

var o = new SomeObject();
o.set("foo"); // foo
var memento = JSON.stringify(o);
o.set("bar"); // bar
o.restore(memento);

JavaScript에서는 기본적으로 mementos 용 API를 지원합니다. toJSON모든 객체에서 호출되는 메소드를 정의하십시오 . 호출 JSON.stringify하면 내부적으로 .toJSON객체를 호출 하여 JSON으로 직렬화하려는 실제 데이터를 가져옵니다.

이를 통해 사소한 코드 스냅 샷을 만들 수 있습니다.

다시 한 번 나는 이것을 기억할 수 없다. 이것은 단순히 JSON 인 직렬화 도구를 사용하는 것입니다.

상태 패턴 / 전략 패턴 :

상태 패턴이 필요하지 않습니다. 일급 함수와 동적 유형이 있습니다. 기능을 주입하거나 속성을 즉시 변경하십시오.


레이 노스, 좋은 대답. 예를 들어, 나는 개념적 수준에서 더 많은 생각을하고있었습니다. 예를 들면 : "상황에서 관찰자 패턴이 도움이되었습니다 ..."

@Lewis는 당신이 좋아하는 몇 가지 디자인 패턴을 고르고 나중에 더 적절한 기능 대안을 제안하려고 노력할 것입니다.
Raynos

노력 접근과 대답은 훌륭한 Raynos입니다. 감사.
Lewis

@Lewis 나는 몇 가지를 더 보려고했지만 엄격한 고전 OO 언어에 맞게 조정 되었기 때문에 혼란에 빠졌습니다. 다른 특정 디자인 패턴이 있으면 알려주세요.
Raynos

프로토 타입 패턴을 잊어 버렸습니다 -일명 어리석은 자바 스크립트에는 정상적인 oop가 없습니다 .)
c69

10

이 답변을 주관적인 의견으로 생각하십시오.

Javascript 개발자는 기존 디자인 패턴을 다른 언어 / 환경보다 중요하거나 덜 중요하다고 생각하십니까?

Gang of Four 와 같은 전통적인 디자인 패턴을 의미하는 경우 , 대부분의 기술은 "구현이 아닌 인터페이스에 대한 프로그램"또는 "클래스 상속에 대한 선호 객체 구성"과 같은 언어 / 플랫폼과 무관하며 JavaScript 개발자에게도 중요합니다.

언어 기능이 그 사용에 크게 영향을 줄 수 있기 때문에, 창조, 구조 및 행동과 같은보다 구체적인 패턴은 다른 언어에서와 같은 방식으로 또는 자주 사용하지 않아도됩니다. 따라서 일부 언어 (JavaScript 포함)는 제공하는 기능 또는 구문 설탕에 따라 고유 한 디자인 패턴을 갖습니다.

일반적으로 전통적인 디자인 패턴은 다른 언어와 마찬가지로 중요하지만 JavaScript 특정 패턴은 전통적인 패턴보다 중요합니다.

Javascript 개발자가 정기적으로 사용하는 상위 3 가지 디자인 패턴의 이름을 지정하고 Javascript 개발에 어떤 도움이되었는지에 대한 예를 제공하십시오.

필수 자바 스크립트 디자인 패턴 나는 대부분이를 사용합니다 :

1. 생성자 패턴 (시제품 포함)

특히 node.js를 작성할 때 서버 측에서는 네이티브 캡슐화가 없지만 모듈을 작성하는 데 적합하기 때문에. 또한 GitHub에서 리포지토리를 탐색하는 경우 다른 많은 개발자에게 인기가 있으므로이 패턴에 익숙하면 다른 코드를 더 잘 이해할 수 있습니다.

2. 공개 모듈 패턴

캡슐화와 모듈성을 제공합니다.

3. 건조 패턴

모든 개발자가 가능한 한 많이 사용해야하지만 이는 시나리오에 따라 다릅니다.


감사! 좋은 대답과 내가 기대했던 반응. 질문은 주관적인 것으로 볼 수 있지만 이와 같은 좋은 반응은 적절한 대답이 있음을 시사합니다. '로그 오프하기'전에 추가 응답을 기다립니다.

2

디자인 패턴은 CS의 디자인 수업에서 진행됩니다. 그것들은 필수적이지는 않지만 당신이 생각한 해결책을 가진 유사한 상황을 찾을 수 있다면 정말 도움이됩니다.

또한 프로그래머가보다 쉽게 ​​통신 할 수 있습니다. 패턴 측면에서 동료와 대화 할 수도 있습니다. 여기에 제 관찰자가 있다고 말하면, 무슨 일이 벌어지고 있는지 잘 이해할 수 있습니다.

사람들은 자연스럽게 디자인 패턴에 맞는 솔루션을 만들지 만, 디자인 패턴은 도움이 될 수있는 용어와 표준 아이디어를 정의하는 데 도움이됩니다.

패턴에 대해 눈에 띄는 것은 없으며, 가장 좋은 점은 반복적으로 유용한 방식으로 표준화되고 정의 된 아이디어라는 것입니다.


1

자바 스크립트 개발자로서 기존 디자인 패턴을 중요하거나 덜 중요하게 생각하십니까?

그들은 매우 중요합니다.

재사용 가능한 솔루션에 대한 개념이 언어를 초월 할 수 있기 때문입니다. -구문 변경-구현 변경-패턴에 대한 개념이 여전히 존재합니다.

모든 언어의 개발자는 구문이 아닌 패턴을 학습하여 고급 JS를 배울 수 있습니다. 이것을 모르는 사람들은 빠졌습니다.

Javascript 개발자가 정기적으로 사용하는 상위 3 가지 디자인 패턴을 지정하십시오.

어떤 사람들은 "논쟁"하는 데 자주 사용되는 패턴이 있습니다. 그러나 고급 JS에서는 매우 일반적이며 강력하기 때문에 알고 있어야합니다.

1- 네임 스페이스-코드를 객체로 감싸십시오.

var x = (함수 () {}) ();

2- 개체 구성, 공장형 패턴. -다수의 변수가 아닌 함수에 객체를 전달하십시오.

var product = factory ({});

3- 콜백 기능. -작업이 완료되면 호출 될 함수를 매개 변수로 전달하십시오.

function longTask (function () {// 완료되면 전화 걸기});

내가 말했듯이, 어떤 사람들은 이것이 패턴이 아니라고 주장 할 수도 있지만, 그것들은 매우 흔하고 매우 강력하며 실제로 일반적인 문제에 재사용 할 수있는 유용한 솔루션이기 때문에 언급해야합니다. 디자인 패턴의 정의는 다음과 같습니다.

훌륭한 질문입니다.

희망이 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.