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ư
mockery
hoặcrewire
. - 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
fs
mô-đ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 import
cú 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?