Làm cách nào để tận dụng các tham số mặc định của JavaScript JavaScript cho Dependency Injection

Ngày nay, nó khá phổ biến để sử dụng Dependency Injection, cho phép các mô-đun của dự án được ghép lỏng lẻo. Nhưng khi các dự án phát triển phức tạp, chúng ta có một số lượng phụ thuộc thiên văn để kiểm soát.

Để giải quyết vấn đề này, chúng tôi thường chuyển sang các thùng chứa phụ thuộc. Nhưng nó có cần thiết trong mọi tình huống không?

Trong bài đăng này, tôi sẽ trình bày cách các tham số mặc định của JavaScript có thể giúp chúng tôi giải đáp thắc mắc này. Để làm điều này, chúng tôi sẽ triển khai một ứng dụng đơn giản trong Node.JS. Nó sẽ có các chức năng tạo và đọc thông tin người dùng bằng cách sử dụng ba cách tiếp cận khác nhau:

  1. Không phụ thuộc tiêm
  2. Với tiêm phụ thuộc
  3. Với Dependency Injection và các tham số mặc định

Cơ cấu dự án

Chúng tôi sẽ cấu trúc dự án ví dụ của chúng tôi theo tính năng (nhân tiện - don cấu trúc các tệp của bạn xung quanh các vai trò). Vì vậy, cấu trúc sẽ là một cái gì đó như thế này:

├── người dùng /
├── người dùng-repository.js
├── users.js
├── người dùng.spec.js
Index ─── index.js
├── app.js

Lưu ý: Với mục đích của ví dụ này, chúng tôi sẽ lưu thông tin của người dùng vào bộ nhớ.

Không phụ thuộc tiêm

Phân tích mã trước đó, chúng tôi xác minh rằng chúng tôi bị giới hạn bởi câu lệnh: const usersRepo = quiries ('./ users-repository') trong người dùng. Mô-đun người dùng, với cách tiếp cận này, được kết hợp chặt chẽ với kho lưu trữ của người dùng.

Điều này giới hạn chúng tôi sử dụng việc triển khai kho lưu trữ khác mà không thay đổi câu lệnh yêu cầu. Khi yêu cầu được sử dụng, chúng tôi tạo ra một phụ thuộc tĩnh cho mô-đun được yêu cầu. Cùng với đó, chúng ta có thể sử dụng kho lưu trữ khác trong mô hình ứng dụng bên cạnh kho lưu trữ được xác định bởi mô đun kho lưu trữ người dùng.

Bên cạnh đó, chúng tôi cũng bị ràng buộc với kho lưu trữ người dùng trong thông số người dùng vì sự phụ thuộc tĩnh được đề cập trước đó. Các thử nghiệm đơn vị này chỉ dành cho thử nghiệm mô-đun người dùng và không có gì nữa. Hãy tưởng tượng nếu kho lưu trữ được kết nối với cơ sở dữ liệu bên ngoài. Chúng tôi sẽ phải tương tác với cơ sở dữ liệu để có thể kiểm tra.

Với tiêm phụ thuộc

Với Dependency Injection, mô đun người dùng không còn được ghép nối với mô đun kho lưu trữ người dùng.

Sự khác biệt chính so với cách tiếp cận trước đó là bây giờ chúng tôi không có sự phụ thuộc tĩnh trong mô-đun người dùng (chúng tôi không có tuyên bố: const usersRepo = quiries ('./ users-repository')). Thay vào đó, mô đun người dùng xuất một hàm xuất xưởng với một tham số cho kho lưu trữ. Điều này cho phép chúng tôi chuyển bất kỳ kho lưu trữ nào đến mô-đun ở mức cao hơn.

Một thay thế cho chức năng của nhà máy là thêm một tham số cho đối số kho lưu trữ trong các hàm tạo và đọc. Nhưng nếu hai hàm phụ thuộc vào cùng một kho lưu trữ, chúng ta có thể gói gọn chúng bằng một hàm và tận dụng các bao đóng JavaScript JavaScript.

Bây giờ, trong mô-đun ứng dụng, chúng tôi có quyền tự do xác định kho lưu trữ nào chúng tôi muốn sử dụng. Ngoài ra, nhìn vào các bài kiểm tra đơn vị. Bây giờ chúng ta có thể kiểm tra mô-đun người dùng mà không phải lo lắng về kho lưu trữ. Chỉ cần chế giễu nó!

Tuy nhiên, hãy để trung thực - chúng ta có thường xuyên xác định các phụ thuộc thay đổi trong suốt vòng đời của ứng dụng không? Thông thường, chúng tôi cố gắng tránh phụ thuộc tĩnh vì nó làm cho việc kiểm tra khó hơn. Nhưng bây giờ, vì chúng tôi muốn kiểm tra, chúng tôi phải chuyển một thể hiện của kho lưu trữ sang mô đun người dùng mỗi khi chúng tôi muốn sử dụng nó.

Bạn biết những gì sẽ thực sự tuyệt vời? Nếu chúng ta có thể sử dụng mô-đun mà không phải cung cấp cho nó một kho lưu trữ mỗi lần. Chúng ta có thể làm điều này trong JavaScript với các tham số mặc định.

Với Dependency Injection và các tham số mặc định

Với chiến lược này, ngoài Phương pháp tiêm phụ thuộc mà chúng tôi đã thấy trong cách tiếp cận trước đó, tham số được xác định trong chức năng xuất xưởng của mô-đun người dùng hiện là tham số mặc định: usersRepo = defaultUsersRepo.

Với tham số mặc định, nếu chúng ta không đưa ra một đối số, giá trị của tham số mặc định được hàm sử dụng. Mặt khác, giá trị đối số được sử dụng. Điều này giống như sử dụng kỹ thuật Tiêm phụ thuộc được xác định trong phương pháp trước.

Bây giờ, chúng ta có phụ thuộc tĩnh một lần nữa trong mô-đun người dùng. Tuy nhiên, phụ thuộc tĩnh này chỉ để xác định giá trị được sử dụng trong tham số mặc định nếu không có đối số nào được truyền cho hàm nhà máy.

Với phương pháp này, chúng tôi không bắt buộc phải vượt qua kho lưu trữ trong mô-đun ứng dụng khi yêu cầu mô-đun người dùng. Tuy nhiên, chúng ta có thể làm điều đó. Chúng tôi cũng có thể xác minh rằng các kiểm tra đơn vị có thể tiếp tục sử dụng kho lưu trữ giả, bởi vì chúng tôi có thể vượt qua nó thay vì sử dụng giá trị tham số mặc định.

Phần kết luận

Các tham số mặc định là một tính năng JavaScript đơn giản, nhưng mạnh mẽ. Với họ, chúng ta có thể thực hiện các giải pháp tốt hơn.

Hãy hỏi tôi bất cứ điều gì.

Nhiêu tai nguyên hơn

Kho GitHub với các ví dụ: tại đây.

Mattias Petter Johansson có một video giải thích Dependency Injection tuyệt vời:

Nếu bạn thích bài viết này, xin vui lòng cho tôi một số tiếng vỗ tay để nhiều người xem nó. Cảm ơn bạn!