javascript - 팩토리 - 패턴 디자인 프로그램




왜 모듈 패턴? (2)

왜 아무도이 문제에 적절하게 대답하지 않는 이유를 모릅니다. 프라이빗 vars를 상속받을 수 있도록하는 패턴에서 자동 호출 함수를 사용할 수있는 잠재력을 볼 수 있지만, 당신은 옳습니다.

핵심 언어 함수 생성자 대신 모듈 패턴을 사용하면 아무런 이점이 없습니다. 이는 동일한 내부 언어 변수가 더 많은 코드로만 접근 불가능한 엔티티로 존재할 수 있도록하는 정확한 언어 메커 니즘 (클로저)입니다.

JS에서 함수 생성자는 실행 된 함수와 동일한 범위 규칙을 따릅니다. 범위와 종료는 정의 지점에서 설정됩니다. 함수 생성자의 내부 var가 살아있는 이유는 var를 참조하는 동일한 생성자 내부에 정의 된 메서드를 사용하는 인스턴스가 살아 있기 때문입니다.

변경된 유일한 것은 생성자에서 프로토 타입 메소드의 사용을 제거하고 상속 된 메소드에 대한 고유 한 상속 메커니즘을 심사숙고해야한다는 것입니다.

모듈 패턴에 대해 많은 것을 읽었습니다. 좋아, 구조, 개인 메서드 등 ...하지만 아래의 코드를 사용하지 않고 동일한 동작을 얻을 수 있습니다.

function Human()
{
  // private properties
  var _name='';
  var _age=0;


  // private methods
  function created()
  {
    console.log("Human "+_name+" called");
  };

  // public
  this.setName = function(name){
    _name=name;
    created(); 
  };

}


var h1 = new Human();

h1.setName("John");

그렇다면 마침내 모듈 패턴의 실제 이점은 무엇입니까?


이 예제는 모듈 패턴 의 유용성을 명확히하는 데 도움이 될 수 있다고 생각합니다.

모듈 패턴

모듈 패턴은 구조를 제공하고 코드가 커질 때 구성하는 데 도움이되므로 널리 사용됩니다. 다른 언어와 달리 JavaScript에는 패키지에 대한 특수 구문이 없지만 모듈 패턴은 독립적 인 분리 된 코드 조각을 만들 수있는 도구를 제공합니다.이 코드 조각은 기능에 대한 검정 상자로 처리되고 추가 기능, 대체 기능 또는 제거 기능을 제공합니다. 당신이 쓰고있는 소프트웨어의 (끊임없이 변화하는) 요구 사항.

모듈 패턴은 다음과 같은 여러 패턴의 조합입니다.

  • 네임 스페이스
  • 즉각적인 기능
  • 사립 및 특권 회원
  • 종속성 선언

첫 번째 단계는 네임 스페이스를 설정하는 것입니다. 이 장 앞부분의 namespace () 함수를 사용하고 유용한 배열 메소드를 제공하는 예제 유틸리티 모듈을 시작하겠습니다.

MYAPP.namespace('MYAPP.utilities.array');

다음 단계는 모듈을 정의하는 것입니다. 이 패턴은 개인 정보 보호가 필요한 경우 개인 범위를 제공하는 즉각적인 기능을 사용합니다. 즉치 함수는 객체를 반환합니다. public 인터페이스를 가진 실제 모듈은 모듈의 소비자가 사용할 수 있습니다.

 MYAPP.utilities.array = (function () {
    return {
    // todo...
    };
 }());

다음으로 공용 인터페이스에 몇 가지 메소드를 추가해 보겠습니다.

MYAPP.utilities.array = (function () {
   return {
      inArray: function (needle, haystack) {
         // ...
      },
      isArray: function (a) {
         // ...
      }
   };
}());

즉치 함수가 제공하는 private 범위를 사용하여 필요에 따라 일부 개인 속성과 메서드를 선언 할 수 있습니다. 즉치 함수의 맨 위에는 모듈이 가질 수있는 모든 종속성을 선언하는 장소가됩니다. 변수 선언 다음에는 모듈을 설정하는 데 도움이되는 일회용 초기화 코드를 선택적으로 배치 할 수 있습니다. 최종 결과는 모듈의 공용 API가 포함 된 직접 함수가 반환하는 객체입니다.

MYAPP.namespace('MYAPP.utilities.array');
MYAPP.utilities.array = (function () {
   // dependencies
   var uobj = MYAPP.utilities.object,
       ulang = MYAPP.utilities.lang,
       // private properties
       array_string = "[object Array]",
       ops = Object.prototype.toString;
       // private methods
       // ...
       // end var
   // optionally one-time init procedures
   // ...
   // public API
   return {
      inArray: function (needle, haystack) {
         for (var i = 0, max = haystack.length; i < max; i += 1) {
            if (haystack[i] === needle) {
               return true;
            }
         }
      },
      isArray: function (a) {
         return ops.call(a) === array_string;
      }
      // ... more methods and properties
   };
}());

모듈 패턴은 코드를 구성 할 때 널리 사용되는 권장 방법이며, 특히 커질수록 좋습니다.

"Stoyan Stefanov (O'Reilly)의 JavaScript Patterns. Copyright 2010 Yahoo !, Inc., 9780596806750





design-patterns