Mô-đun Yêu cầu vs Phụ thuộc tiêm trong Javascript


24

Ngày nay, một câu hỏi xuất hiện trong đầu tôi:

Liệu cách chúng tôi Javascript đi ngược lại với hầu hết mọi thứ được coi là một thông lệ tốt trong Phát triển phần mềm truyền thống?

Tôi có một loạt các câu hỏi / quan sát liên quan đến tuyên bố này, nhưng để tôn trọng định dạng của StackExchange, sẽ tốt hơn nếu tôi chia chúng thành các câu hỏi khác nhau.

Mô-đun yêu cầu

Mã Javascript tiêu chuẩn hiện nay trông giống như:

const someModule = require('./someModule')

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

Ưu điểm

  • Đóng gói: mô-đun hoạt động độc lập và biết mọi thứ cần thiết để thực hiện các chức năng của nó.
  • Là một màu sắc, khách hàng dễ dàng sử dụng mô-đun hơn.

Nhược điểm

  • Khả năng kiểm tra kém: đây là tiêu chuẩn khi không sử dụng DI, nhưng trong các ngôn ngữ động, chẳng hạn như Javscript, nó có thể bị phá vỡ * bởi các mô-đun như mockeryhoặc rewire.
  • Nó chắc chắn vi phạm DIP - không bị nhầm lẫn với Dependency Injection. - vì tôi chỉ có thể nhập các mô-đun cụ thể.
  • Nó có thể vi phạm OCP - ví dụ, hãy tưởng tượng rằng tôi có một mô-đun nhật ký ghi vào hệ thống tệp (thông qua fsmô-đun). Nếu tôi muốn mở rộng mô-đun nhật ký này để gửi nó đến mạng, nó sẽ rất khó.

* Điều này có thể hoạt động với các mô-đun CommonJS hoặc thậm chí AMD vì chúng được triển khai chủ yếu ở vùng đất người dùng. Tuy nhiên, tôi không chắc làm thế nào điều này có thể thực hiện được với importcú pháp ES6 .

Phụ thuộc tiêm

Sử dụng tiêm phụ thuộc, nó sẽ giống như:

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

Ưu điểm

  • Tăng khả năng kiểm tra: giờ đây việc khai thác / giả dễ dàng hơn someModule, thậm chí sử dụng cú pháp ES6.
  • Đó là có thể để tôn vinh các DIP: không nhất thiết mặc dù, như các mô-đun khách hàng vẫn có thể được lập trình để thực hiện và không phải là một giao diện.

Nhược điểm

  • Đóng gói bị hỏng: câu hỏi chính còn lại là:

    Ok, sau đó ai sẽ tạo / yêu cầu phụ thuộc?

  • Làm điều đó trong mọi máy khách của mô-đun có vẻ rất WET .
  • Điều này có lẽ sẽ yêu cầu tôi sử dụng DI Container để có thể khả thi trong một dự án thực tế.

Vì vậy, câu hỏi thực sự ở đây là:

Tại sao các nhà phát triển Javascript có xu hướng nghiêng về cách tiếp cận đầu tiên?

Đây có phải chỉ là "cách Javascript"?

Bản thân tôi viết mã như thế này hầu hết thời gian. Tôi đã chia sẻ công bằng thiết lập thử nghiệm của mình bằng các thư viện chế giễu, nhưng nó luôn cảm thấy có lỗi khi làm như vậy.

Tui bỏ lỡ điều gì vậy?


Là một người .Net gần đây đã trở nên quan tâm đến NodeJs, tôi cũng đã phải vật lộn với điều này. Tôi đã tìm thấy các phụ thuộc vá khỉ với Proxyquire (giống như ReWire) để ổn cho mục đích thử nghiệm, nhưng đôi khi bạn hợp pháp cần nhiều triển khai của một phụ thuộc ...
RubberDuck

Câu trả lời:


6

Tôi chủ yếu là một lập trình viên PHP, nhưng đã liên hệ với 4 nhóm JavaScript trong năm qua hoặc lâu hơn.

Là một lập trình viên hướng đối tượng, nguyên tắc tiêm phụ thuộc có vẻ là cách tốt nhất, tuy nhiên tôi đã được một số nhà phát triển JS nói khác. JS là một thế giới hoàn toàn khác.

Vì JavaScript cho phép bạn vá mọi thứ và mọi thứ bằng các kỹ thuật rất đơn giản, các nhà phát triển JavaScript đã học cách điều chỉnh một công nghệ khác về cách xây dựng các ứng dụng JavaScript quy mô lớn hơn. Hầu hết trong số này được xây dựng dưới dạng tập hợp các mô-đun độc lập, thể hiện chức năng thông qua xuất khẩu công cộng, ẩn nội bộ của mô-đun là không cho phép người khác viết lại các chức năng mà bạn dựa vào.

Cách tiếp cận thông thường thường là thậm chí không đi xa đến mức không để lộ một nhà xây dựng như vậy mà chỉ phơi bày việc xây dựng một đối tượng bằng cách sử dụng trình bao bọc của nhà máy - vì lý do chính xác: nếu bạn cho ai đó truy cập vào một đối tượng, họ có thể khởi tạo trực tiếp họ được phép thay đổi bất cứ điều gì.

Bằng cách tận dụng thiết kế mô-đun, bạn từ chối người khác sử dụng các chức năng mà bạn mong đợi để làm việc, nhưng bạn vẫn có khả năng kiểm tra các mô-đun của mình - thông qua API công khai của tệp được yêu cầu, API bạn đã tạo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.