자바 스크립트에서 모듈 요구와 의존성 주입


24

요즘 질문이 떠 올랐습니다.

Javascript 방식이 전통적인 소프트웨어 개발에서 우수 사례로 간주되는 거의 모든 것에 반대합니까?

이 진술과 관련된 일련의 질문 / 관찰 사항이 있지만 StackExchange의 형식을 존중하기 위해 다른 질문으로 나누면 더 좋습니다.

필요한 모듈

오늘날 표준 자바 스크립트 코드는 다음과 같습니다.

const someModule = require('./someModule')

module.exports = function doSomethingWithRequest() {
  // do stuff
  someModule.someFunc()
  // do other stuff
}

장점

  • 캡슐화 : 모듈은 독립형으로 작동하며 기능을 수행하는 데 필요한 모든 것을 알고 있습니다.
  • 색상으로 클라이언트가 모듈을 사용하는 것이 더 쉽습니다.

단점

  • 불량 테스트 용이성 : DI를 사용하지 않을 때이 표준이지만, 같은에 javscript 같은 동적 언어에 같은 모듈에 의해 피할 *이 될 수 mockery또는 rewire.
  • 의존성 주입과 혼동되지 않도록 DIP를 확실히 위반합니다 . 콘크리트 모듈 만 가져올 수 있기 때문입니다.
  • 아마도 OCP를 위반했을 것 입니다. 예를 들어, 파일 시스템에 fs모듈을 통해 쓰는 로그 모듈이 있다고 상상해보십시오 . 이 로그 모듈을 확장하여 네트워크로 보내려면 매우 어려울 것입니다.

* CommonJS 또는 심지어 AMD 모듈은 대부분 사용자 영역에서 구현되므로 작동 할 수 있습니다. 그러나 ES6 import구문 으로 어떻게 이것이 가능한지 잘 모르겠습니다 .

의존성 주입

의존성 주입을 사용하면 다음과 같습니다.

module.exports = function doSomethingWithRequest(someModule) {
  // do stuff
  someModule.someFunc()
  // do other stuff
}

장점

  • 향상된 테스트 가능성 : 이제 someModuleES6 구문을 사용하더라도 스터브 / 모의 작업이 더 쉬워졌습니다 .
  • 그것은의 와 반드시는 아니지만, 클라이언트 모듈이 아직 구현하지 인터페이스에 프로그래밍 할 수있는 : 딥 명예.

단점

  • 깨진 캡슐화 : 남은 주요 질문은 다음과 같습니다.

    그렇다면 종속성을 누가 만들고 요구할 것인가?

  • 모듈의 모든 클라이언트에서 그렇게하는 것은 매우 WET 것 같습니다 .
  • 실제 프로젝트에서 실현하려면 DI 컨테이너를 사용해야 할 수도 있습니다.

실제 질문은 다음과 같습니다.

Javascript 개발자가 첫 번째 접근 방식에 의존하는 이유는 무엇입니까?

이것이 단지 "자바 스크립트 방식"입니까?

나는 스스로 이런 코드를 작성한다. 모의 라이브러리를 사용하여 테스트 설정을 공정하게 공유했지만 항상 그렇게 잘못 느꼈습니다.

뭔가 빠졌습니까?


최근 NodeJ에 관심이있는 .Net 사람으로서 나는 이것으로도 어려움을 겪고 있습니다. 나는 수 (많은 ReWire를 같은) Proxyquire와 종속 패치 원숭이 발견 괜찮 테스트 목적을하지만, 의존성 때로는 합법적 필요성을 여러 구현 ...
RubberDuck

답변:


6

저는 주로 PHP 프로그래머이지만 지난 1 년 동안 4 개의 JavaScript 팀과 연락을 취했습니다.

객체 지향 프로그래머로서 의존성 주입 원칙이 가장 좋은 방법처럼 보이지만 JS 개발자는 그렇지 않다고 들었습니다. JS는 완전히 다른 세상입니다.

JavaScript를 사용하면 매우 간단한 기술을 사용하여 모든 것을 원숭이 패치 할 수 있으므로 JavaScript 개발자는 대규모 JavaScript 응용 프로그램을 작성하는 방법에 대해 다른 기술을 적용하는 방법을 배웠습니다. 이들 중 대부분은 독립된 모듈 세트로 빌드되며 공개 내보내기를 통해 기능을 노출하고 모듈의 내부를 숨겨 다른 사용자가 의존하는 기능을 다시 작성할 수 없도록합니다.

일반적인 접근 방식은 일반적으로 생성자를 노출시키지 않고 팩토리 랩퍼를 사용하여 객체의 구성을 노출시키는 것까지 똑같은 방식으로 수행하는 것입니다. 동일한 이유 : 누군가에게 객체에 대한 액세스 권한을 부여하면 직접 인스턴스화 할 수 있습니다 무엇이든 바꿀 수 있습니다.

모듈 식 디자인을 이용하면 다른 사람들이 원하는 기능을 사용하지 못하도록 거부하지만, 필요한 파일의 공개 API, 생성 한 API를 통해 모듈을 테스트 할 수 있습니다.

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