Architecture

Dependency Injection Explained: Dependency

Phần 1: Dependency là gì ? có ăn được không ?

Updated: Video cho bài viết này. Các bạn có thể xem tại đây:


Trước khi đi vào tìm hiểu về dependency injection, ở trong bài viết này mình muốn cùng các bạn tìm hiểu về khái niệm dependency trước. Một khi đã hiểu rõ về dependency thì việc hiểu về dependency injection sẽ trở nên vô cùng dễ dàng thôi.

Aware of communication

Không giống như anh chàng John Wick trong bộ phim cùng tên một mình san bằng tất cả, đạn bắn bao nhiêu cũng không chết nổi. Trong một ứng dụng (hay một phần mềm nói chung) các modules, các classes, các hàm giao tiếp với nhau để hoạt động. Lý tưởng là khi mỗi component đó thực hiện và thực hiện tốt duy nhất một nhiệm vụ mà nó được giao phó, rồi kết hợp hay giao tiếp để thực hiện một chức năng nào đó trong requirement.

Ngày trước mình không hề có ý niệm gì về khái niệm giao tiếp giữa các components với nhau, mình từng nhét mọi thứ vào chung một class khiến cho class đó dài cả ngàn dòng, đoạn code này dính vào đoạn code kia, không thể nào refactor nổi. Hậu quả thì khỏi phải nói, maintain nó khó như chạy trốn John Wick sau khi giết chó của ổng vậy 😰.

Khi các components giao tiếp với nhau chúng tạo ra một khái niệm gọi là dependency.

Definition

Về cơ bản khi bạn có component A sử dụng component B thì ta nói, component A phụ thuộc (depends) vào component B hay component B là một dependency của component A.

“Đơn giản vậy thôi hở ?“ — Chuẩn ! chỉ đơn giản như vậy thôi đấy 😆.
Component ở đây có thể là một class, một struct hay nói rộng ra thì có thể là một framework, một module…

Types of dependency

Implicit Dependency

Cái tên cũng đã phần nào thể hiện ý nghĩa của nó. Implicit dependency là kiểu dependency mà khi nhìn vào interface của component phụ thuộc ta không thể thấy được nó. Cùng xem xét ví dụ sau đây:

Trong ví dụ trên, FeedViewModel là một dependency của FeedViewController, tuy nhiên do được khởi tạo bên trong component phụ thuộc ta không thể thấy FeedViewModel khi nhìn vào interface của FeedViewController mà phải nhìn vào implement của class này.

interface of FeedViewController

Explicit Dependency

Ngược lại với implicit dependency, khi nhìn vào interface của component phụ thuộc ta có thể thấy được nó đang có những dependencies nào. Mình sẽ sửa ví dụ ở trên để hô biến implicit thành explicit:

Và đây là interface của FeedViewController

interface of FeedViewController

Meaning of dependency

Khi ta nói A phụ thuộc vào B hay B là một dependency của A, thì điều đó có ý nghĩa là gì ?

Uhm… nó có nghĩa rằng A không thể hoạt động mà thiếu B. Như các ví dụ ở trên, nếu mình comment out FeedViewModel class thì compiler sẽ báo lỗi ngay

Còn thằng B thì sao ? Chẳng sao cả, do B không phụ thuộc vào A nên B vẫn có thể hoạt động cho dù có tồn tại A hay không.


Conclusion

Vậy là mình đã cùng các bạn tìm hiểu xong về khái niệm dependency và hai loại dependency, hy vọng qua bài viết này các bạn đã hiểu rõ về nó. Trong phần sau chúng ta sẽ tiếp tục đi vào Dependency Injection để xem nó có gì hay ho nha.

Cảm ơn các bạn đã đọc 🥰.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *