6 Phút Để Hiểu Rõ Về Dependency Injection

Những dự án có độ phức tạp cao bên cạnh việc thiết kế tính năng cho ứng dụng, tổ chức code luôn luôn là vấn đề được đặt lên hàng đầu. Tổ chức phải chăng giúp lập trình viên dễ dàng bảo trì, cũng như mở rộng code về sau.

Để có thể tiết kiệm chi phí tổn và thời kì cho quá trình này nhưng vẫn đem lại hiệu quả cao, việc nắm vững về những design sample sẽ giúp ích siêu nhiều. Dependency Injection là 1 dạng design sample được thiết kế có phần đích ngăn chặn sự phụ thuộc giữa những class, để làm cho code dễ hiểu hơn, trực quan hơn, nhằm dùng cho cho phần đích bảo trì và nâng cấp code.

Tuy nhiên giả dụ sau khoản thời gian đọc xong thuật ngữ trên bạn vẫn chưa hiểu gì thì hãy coi đây là chuyện bình thường vì những định nghĩa về 1 design sample thường khá trừu tượng (summary) mà ko đi vào cụ thể. Việc đi dùng Dependency Injection như thế nào sẽ phụ thuộc vào phương pháp triển khai trong từng vấn đề cụ thể (cũng như kỹ năng lập trình của developer).

Vậy Dependency Injection cụ thể là gì ?

Trước lúc đi sâu tìm hiểu, hãy cùng xem qua 1 số khái niệm.

Theo Wikipedia:

“Trong kỹ thuật phần mềm, dependency injection là 1 kỹ thuật theo ấy 1 đối tượng (hoặc static methodology) phân phối những phụ thuộc của đối tượng khác. 1 phụ thuộc là 1 đối tượng có thể được dùng (service).”

Nhưng nó vẫn khá khó hiểu, vậy hãy cũng làm cho rõ nó.

Trước tiên, dependency hay dependent nghĩa là phụ thuộc vào tương trợ của 1 dòng gì, việc gì ấy. Dí dụ như giả dụ chúng ta phụ thuộc quá nhiều vào smartphone, thì có thể hiểu là chúng ta đã dependent lên smartphone, chúng ta phụ thuộc vào robotic, đấy chính là chúng ta đã dependent lên robotic.

Trước lúc nói về dependency injection, hãy hiểu xem dependency trong lập trình nghĩa là gì trước.

Lúc mà class A dùng 1 số chức năng của class class B, thì có thể nói là class A có quan hệ phụ thuộc có class B.

Trong java, trước lúc ta có thể dùng methodology của class khác, ta buộc phải khởi tạo 1 object của class đấy (hay A cần buộc phải tạo 1 thực thể của B). Vậy ta có thể hiểu, việc chuyển giao nhiệm vụ khởi tạo object ấy cho 1 ai khác và quản lý dùng những dependency ấy được gọi là dependency injection.

Xem Thêm  10 giải pháp “Lên Trình” nhanh lúc chơi Liên Minh Huyền Thoại (Phần 1) – Liên Minh 360

Hay nói 1 phương pháp chính xác và khách quan hơn là:

Dependency injection (DI) là 1 kỹ thuật lập trình giúp tách 1 class độc lập có những biến phụ thuộc. Có lập trình hướng đối tượng, chúng ta hầu như luôn buộc phải làm cho việc có siêu nhiều class trong 1 chương trình. Những class được hợp tác có nhau theo 1 mối quan hệ nào ấy. Dependency là 1 loại quan hệ giữa 2 class mà trong ấy 1 class hoạt động độc lập và class còn lại phụ thuộc bởi class kia.

Ví dụ nó là design sample, vậy có mấy loại Dependency Injection ?

Thông thường, chúng ta chỉ thường gặp bố loại Dependency Injection sau:

  • Constructor injection: Những dependency (biến phụ thuộc) được phân phối thông qua constructor (hàm tạo lớp).
  • Setter injection: Những dependency (biến phụ thuộc) sẽ được truyền vào 1 class thông qua những setter methodology (hàm setter).
  • Interface injection: Dependency sẽ phân phối 1 Interface, trong ấy có chứa hàm có tên là Inject. Những shopper buộc phải triển khai 1 Interface mà có 1 setter methodology dành cho việc nhận dependency và truyền nó vào class thông qua việc gọi hàm Inject của Interface ấy.

Vậy cụ thể nhiệm vụ của Dependency Injection là:

  1. Tạo ra những object.
  2. Biết được class nào cần những object đấy.
  3. Phân phối cho những class ấy những object chúng cần.

Kế bên ấy, người mua cũng nên chú ý tới 1 số khái niệm tương tự động như Dependency Inversion, Inversion of Management (IoC), Dependency Injection (DI). Bố khái niệm này tương tự động nhau nhưng ko hoàn toàn giống nhau, giả dụ có thể, bạn nên tìm hiểu từng dòng để giảm thiểu những lẫn lộn ko cần thiết.

IoC là hướng đi, DIP là định hình cụ thể của hướng đi, còn DI là 1 hiện thực cụ thể.

Tại sao buộc phải dùng Dependency Injection ? Lúc nào dùng tới nó ? Thực hành nó ra sao ?

Dependency Injection có thể được thực hành dựa trên những quy tắc sau:

  • Những class sẽ ko phụ thuộc quản lý lẫn nhau mà thay đổi vào ấy chúng sẽ hợp tác có nhau thông qua 1 Interface hoặc base class (đối có 1 số ngôn ngữ ko tương trợ Interface)
  • Việc khởi tạo những class sẽ do những Interface quản lí thay đổi vì class phụ thuộc nó
Xem Thêm  Sau Trạng Từ Là Gì – Vị Trí Trạng Từ Trong Tiếng Anh

Giả sử, chúng ta có 1 class Automobile, trong ấy có vài object khác như Wheel, hay Battery:

class Automobile{ non-public Wheels wheel = new MRFWheels(); non-public Battery battery = new ExcideBattery(); … … }

Trên đây, class Automobile chịu trách nhiệm khởi tạo hầu hết những dependency object. Nhưng chuyện gì sẽ xảy ra giả dụ chúng ta muốn bỏ MRFWheels và thay đổi thế bằng BMWWheels.

Lúc này chúng ta buộc phải tạo lại đối tượng automotive new có phụ thuộc new (new dependecy) là BMWWheels. Rồi sau này nữa, bạn lại muốn độ bánh xe lên, hay thay đổi bánh khác thì sao??? Từng lần vậy thêm 1 loạt code và lúc ấy chưa chắn chắn chúng đã chạy được, chưa nói là vô cùng khó đọc.

Dependency Injection là 1 dạng design sample được thiết kế nhằm ngăn chặn sự phụ thuộc nêu trên, lúc dùng dependency injection, chúng ta có thể đổi wheel trên runtime vì dependency có thể được truyền vào (inject) trên runtime thay đổi vì complile time, điều này giúp giảm chi phí tổn trong việc sửa đổi và nâng cấp hệ thống. Nhờ có vậy lúc bạn thực thiện thay đổi đổi 1 class A thì những class chứa biến kiểu class A cũng ko cần buộc phải thay đổi đổi theo.

Bạn có thể hiểu là dependency injection là 1 người trung gian chịu trách nhiệm tạo ra những loại wheel khác nhau, rồi phân phối chúng cho class Automobile. Việc ấy làm cho cho class Automobile ko buộc phải phụ thuộc vào Wheels cụ thể nào hay Battery cụ thể nào nữa.

class Automobile{ non-public Wheels wheel; non-public Battery battery; /*Trên đâu ấy trong venture, ta khởi tạo những objects mà đc bắc buộc bởi class này Có 2 phương pháp để implement dependency injection 1. Dựa vào constructor 2. Dựa vào Setter methodology */ // Dựa vào constructor Automobile(Wheel wh, Battery bt) { sentayho.com.vn = wh; sentayho.com.vn = bt; } // Dựa vào Setter methodology void setWheel(Batter bt){ sentayho.com.vn = bt; } … … }

Xem Thêm  Bảng Chữ Chiếc Viết Hoa ❤️ 1001 Mẫu In Hoa Kiểu Đẹp Nhất

Lợi ích và bất cập lúc dùng Dependency Injection

Lợi ích lúc dùng Dependency Injection:

  • Dễ check và viết Unit Check: Dễ hiểu là lúc ta có thể Inject những dependency vào trong 1 class thì ta cũng dễ dàng “tiêm” những mock object vào class (được check) ấy.
  • Dễ dàng thấy quan hệ giữa những object: Dependency Injection sẽ inject những object phụ thuộc vào những interface thành phần của object bị phụ thuộc nên ta dễ dàng thấy được những dependency của 1 object.
  • Dễ dàng hơn trong việc mở rộng những ứng dụng hay tính năng.
  • Giảm sự kết dính giữa những thành phần, giảm thiểu tương tác quá nhiều lúc có thay đổi đổi nào ấy.

Bất lợi của Dependency Injection:

  • Nó khá là phức tạp để học, và giả dụ dùng quá đà thì có thể dẫn tới 1 số vấn đề khác.
  • Siêu nhiều những lỗi trên compile time có thể bị đẩy sang runtime, dẫn tới đôi lúc sẽ khó debug. Vì dùng những Interface nên có thể gặp khó khăn lúc ta debug supply code vì ko biết implement nào thực sự được truyền vào.
  • Có thể làm cho tương tác tới chức năng auto-complete hay discover references của 1 số IDE. Cụ thể vì Dependency Injection ẩn những dependency nên 1 số lỗi chỉ xảy ra lúc chạy chương trình thay đổi vì có thể tìm ra lúc biên dịch chương trình.
  • Khó khăn lớn nhất là lúc người mới vào làm bằng DI sẽ ko hiểu rõ ràng tư tưởng, khiến quá trình làm DI vẫn bị nhập nhằng và các injector bị ràng buộc mà ko thoát hẳn ra theo tư tưởng của DI.

Tạm kết

Bên trên mình đã tổng kết lại 1 số tri thức về Dependency Injection qua những thông tin mình kiếm tìm được trên mạng, hy vọng bài viết giúp ích được phần nào cho mọi người. Ví dụ có sai sót, xin hãy để lại bình luận phía bên dưới, mình sẽ cập nhật nhanh nhất có thể.

Sự ủng hộ của mọi người là động lực để mình tiếp tục cho ra những bài viết tiếp theo. Cảm ơn mọi người !