요즘 질문이 떠 올랐습니다.
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
}
장점
- 향상된 테스트 가능성 : 이제
someModule
ES6 구문을 사용하더라도 스터브 / 모의 작업이 더 쉬워졌습니다 . - 그것은의 수 와 반드시는 아니지만, 클라이언트 모듈이 아직 구현하지 인터페이스에 프로그래밍 할 수있는 : 딥 명예.
단점
- 깨진 캡슐화 : 남은 주요 질문은 다음과 같습니다.
그렇다면 종속성을 누가 만들고 요구할 것인가?
- 모듈의 모든 클라이언트에서 그렇게하는 것은 매우 WET 것 같습니다 .
- 실제 프로젝트에서 실현하려면 DI 컨테이너를 사용해야 할 수도 있습니다.
실제 질문은 다음과 같습니다.
Javascript 개발자가 첫 번째 접근 방식에 의존하는 이유는 무엇입니까?
이것이 단지 "자바 스크립트 방식"입니까?
나는 스스로 이런 코드를 작성한다. 모의 라이브러리를 사용하여 테스트 설정을 공정하게 공유했지만 항상 그렇게 잘못 느꼈습니다.
뭔가 빠졌습니까?