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

Chúng tôi rất vui mừng chia sẻ kiến thức sâu sắc về từ khóa Dependency injection la gi để tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Bài viết cung cấp phương pháp tìm kiếm, phân tích và lựa chọn từ khóa phù hợp, cùng với chiến lược và công cụ hữu ích. Hy vọng thông tin này sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog để cập nhật kiến thức mới nhất.

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

Bạn Đang Xem: 6 Phút Để Hiểu Rõ Về Dependency Injection

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

Tuy nhiên nếu sau thời điểm đọc xong thuật ngữ trên bạn vẫn chưa hiểu gì thì hãy coi đây là chuyện thông thường vì các khái niệm về một design pattern thường khá trừu tượng (abstract) mà không đi vào cụ thể. Việc đi sử dụng Dependency Injection thế nào sẽ phụ thuộc vào cách triển khai trong từng tình huống 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 một số khái niệm.

Theo Wikipedia:

“Trong kỹ thuật phần mềm, dependency injection là một kỹ thuật Từ đó một đối tượng người tiêu dùng (hoặc static method) cung cấp các phụ thuộc của đối tượng người tiêu dùng khác. Một phụ thuộc là một đối tượng người tiêu dùng có thể được sử dụng (service).”

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

Trước nhất, dependency hay dependent tức thị phụ thuộc vào tương trợ của một chiếc gì, việc gì đó. Ví dụ như nếu tất cả chúng ta phụ thuộc quá nhiều vào smartphone, thì có thể hiểu là tất cả chúng ta đã dependent lên smartphone, tất cả chúng ta phụ thuộc vào robot, đấy đó là tất cả chúng ta đã dependent lên robot.

Xem Thêm : Spec là gì? Tìm hiểu quy định về Chỉ dẫn kỹ thuật dành cho Kỹ sư xây dựng

Trước lúc nói về dependency injection, hãy hiểu xem dependency trong lập trình tức thị gì trước.

Khi mà class A sử dụng một số chức năng của class class B, thì nói theo cách là class A có quan hệ phụ thuộc với class B.

Trong java, trước lúc ta có thể sử dụng method của class khác, ta phải lập một object của class đấy (hay A cần 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 đó cho một ai khác và trực tiếp sử dụng các dependency này được gọi là dependency injection.

Hay nói một cách chuẩn xác và khách quan hơn là:

Dependency injection (DI) là một kỹ thuật lập trình giúp tách một class độc lập với những biến phụ thuộc. Với lập trình hướng đối tượng người tiêu dùng, tất cả chúng ta hầu như luôn phải thao tác với rất nhiều class trong một lớp học. Các class được liên kết với nhau theo một quan hệ nào đó. Dependency là một loại quan hệ giữa 2 class mà trong đó một class hoạt động độc lập và class còn sót lại phụ thuộc bởi class kia.

Nếu nó là design pattern, vậy có mấy loại Dependency Injection ?

Thông thường, tất cả chúng ta chỉ thường gặp ba loại Dependency Injection sau:

  • Constructor injection: Các dependency (biến phụ thuộc) được cung cấp thông qua constructor (hàm tạo lớp).
  • Setter injection: Các dependency (biến phụ thuộc) sẽ tiến hành truyền vào 1 class thông qua các setter method (hàm setter).
  • Interface injection: Dependency sẽ cung cấp một Interface, trong đó có chứa hàm mang tên là Inject. Các client phải triển khai một Interface mà có một setter method già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 đó.

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

  1. Tạo ra các object.
  2. Biết được class nào có nhu cầu các object đấy.
  3. Cung cấp cho những class đó những object chúng cần.

Không chỉ vậy, các bạn cũng nên lưu ý tới một số khái niệm tương tự như Dependency Inversion, Inversion of Control (IoC), Dependency Injection (DI). Ba khái niệm này tương tự nhau nhưng không hoàn toàn giống nhau, nếu có thể, bạn nên tìm hiểu từng cái để tránh những lộn lạo không cấp thiết.

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

Vì sao phải dùng Dependency Injection ? Khi nào dùng tới nó ? Thực hiện nó ra sao ?

Xem Thêm : ” Saudade Là Gì – 13 Từ Ngữ Không Thể Dịch Nghĩa Tiếng Anh

Dependency Injection có thể được thực hiện dựa trên các quy tắc sau:

  • Các class sẽ không còn phụ thuộc trực tiếp lẫn nhau mà thay vào đó chúng sẽ liên kết với nhau thông qua một Interface hoặc base class (so với một số tiếng nói không tương trợ Interface)
  • Việc khởi tạo các class sẽ do các Interface quản lí thay vì class phụ thuộc nó

Giả sử, tất cả chúng ta có một class Car, trong đó có vài object khác ví như Wheel, hay Battery:

class Car{ private Wheels wheel = new MRFWheels(); private Battery battery = new ExcideBattery(); … … }

Ở đây, class Car chịu trách nhiệm khởi tạo tất cả những dependency object. Nhưng chuyện gì sẽ xẩy ra nếu tất cả chúng ta muốn bỏ MRFWheels và thay thế bằng BMWWheels.

Lúc này tất cả chúng ta phải tạo lại đối tượng người tiêu dùng car mới với phụ thuộc mới (new dependecy) là BMWWheels. Rồi sau này nữa, bạn lại muốn độ bánh xe lên, hay thay bánh khác thì sao??? Mỗi lần vậy thêm một loạt code và khi đó chưa chắc chúng đã chạy được, chưa tính là cực kỳ khó đọc.

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

Chúng ta có thể hiểu là dependency injection là một người trung gian chịu trách nhiệm tạo ra các loại wheel khác nhau, rồi cung cấp chúng cho class Car. Việc đó làm cho class Car ko phải phụ thuộc vào Wheels cụ thể nào hay Battery cụ thể nào nữa.

class Car{ private Wheels wheel; private Battery battery; /*Ở đâu đó trong project, ta khởi tạo những objects mà đc yêu cầu 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 method */ // Dựa vào constructor Car(Wheel wh, Battery bt) { this.wh = wh; this.bt = bt; } // Dựa vào Setter method void setWheel(Batter bt){ this.bt = bt; } … … }

Lợi ích và chưa ổn khi sử dụng Dependency Injection

Lợi ích khi sử dụng Dependency Injection:

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

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

  • Nó khá là phức tạp để học, và nếu dùng quá trớn thì có thể dẫn tới một số vấn đề khác.
  • Rất nhiều các lỗi ở compile time có thể bị đẩy sang runtime, dẫn đến thỉnh thoảng sẽ khó debug. Vì sử dụng các Interface nên có thể gặp khó khăn khi ta debug source code vì không biết implement nào thực sự được truyền vào.
  • Có thể làm tác động tới chức năng auto-complete hay find references của một số IDE. Cụ thể vì Dependency Injection ẩn các dependency nên một số lỗi chỉ xẩy ra khi chạy lớp học thay vì có thể phát hiện khi biên dịch lớp học.
  • Khó khăn lớn nhất là khi người mới vào làm bằng DI sẽ không 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à không thoát hẳn ra theo tư tưởng của DI.

Tạm kết

Phía bên trên tôi đã tổng kết lại một số tri thức về Dependency Injection qua những thông tin mình tìm tìm kiếm ra trên mạng, hy vọng nội dung bài viết giúp ích được phần nào cho mọi người. Nếu có sơ sót, xin hãy để lại phản hồi phía phía dưới, mình sẽ update 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 nội dung bài viết tiếp theo. Cảm ơn mọi người !

You May Also Like

About the Author: v1000