Các khái niệm như Dependency Injection, Dependency Inversion hay Inversion of Control là gì đều là những câu hỏi khó kể cả với những kỹ sư kỳ cựu. Nhiều bạn dù đã đi làm vài năm nhưng vẫn chưa thực sự hiểu rõ về các khái niệm này mà chỉ biết sử dụng chúng trong công việc. Hãy để Got It Vietnam gỡ rối cho các bạn qua bài viết sau nhé!
Mục lục
1. Tìm hiểu về Dependency Inversion
Trước khi tìm hiểu về Inversion of Control (IoC), chúng ta cần hiểu rõ khái niệm về Dependency Inversion và quy tắc SOLID trong thiết kế và lập trình hướng đối tượng (OOP). Quy tắc SOLID bao gồm 5 nguyên tắc cơ bản tương ứng với chữ cái viết tắt của mỗi quy tắc:
- Single responsibility principle
- Open/closed principle
- Liskov substitution principle
- Interface segregation principle
- Dependency inversion principle
Trong bài viết này, chúng ta chỉ cần quan tâm đến chữ D – Dependency Inversion Principle. Nói một cách dễ hiểu, Dependecy Inversion là quy tắc lập trình trong đó các modules cấp cao không nên phụ thuộc vào các module cấp thấp, mà cả 2 nên phụ thuộc vào abstraction. Ngoài ra, nguyên tắc Dependency Inversion quy định rằng các class phải giao tiếp với nhau thông qua giao diện (interfaces) chứ không phải qua implementation.
Một ví dụ về Dependency Inversion trên trang Toidicodedao.com như sau:
Chúng ta đều biết dù có hình dáng khác nhau, hai đèn huỳnh quang hay đuôi tròn đều có thể thay thế nhau dễ dàng.
Ở đây, interface chính là đuôi tròn, implementation là bóng đèn tròn và bóng đèn huỳnh quang. Ta có thể swap dễ dàng giữa 2 loại bóng vì ổ điện chỉ quan tâm tới interface (đuôi tròn), không quan tâm tới implementation.
Trong code cũng vậy, khi áp dụng Dependency Inverse, ta chỉ cần quan tâm tới interface. Để kết nối tới database, ta chỉ cần gọi hàm Get, Save … của Interface IDataAccess. Khi thay database, ta chỉ cần thay implementation của interface này.
2. Vậy Inversion of Control là gì?
Nói một cách tóm tắt, IoC là một design pattern được tạo ra để các code tuân thủ nguyên lý Dependency Inversion. Có một vài mô hình được sử dụng để triển khai để triển khai Inversion of Control, bao gồm:
- Service Locator
- Events
- DI (Dependency Injection)
Để hiểu rõ hơn về IoC, chúng ta có thể lấy ví dụ như sau: Giả dụ có 1 class mẹ A và hai class con B và C ( lúc này B và C sẽ được gọi là các dependencies)
Ở trong mô hình không sử dụng IoC, Class A sẽ phải khởi tạo và điều khiển hai class B và C, bất cứ thay đổi nào ở Class A cũng sẽ dẫn tới thay đổi ở Class B,C. Một thay đổi sẽ kéo theo hàng loạt các thay đổi khác, làm giảm khả năng bảo trì của code. Trong khi đó, trong mô hình sử dụng IoC, các class B và C sẽ được đưa đến độc lập so với class A thông qua bên thứ ba, do đó các class không phụ thuộc lẫn nhau mà chỉ phụ thuộc vào interface. Điều này đồng nghĩa rằng sự thay đổi ở class cấp cao không ảnh hưởng tới class cấp thấp hơn.
3. Giới thiệu về Service Locator
Trong bài viết này, Got It Vietnam sẽ giới thiệu tới các bạn một mô hình được triển khai từ IoC – Service Locator. Riêng phần Dependency Injection chúng tôi sẽ có bài viết chi tiết sau.
3.1. Service Locator là gì?
Service Locator đóng vai trò như một tổng đài dịch vụ vậy. Đây sẽ là một trugm tâm quản lý tất cả các tiến trình (bao gồm đối tượng, dịch vụ) và class nào muốn sử dụng dịch vụ nào thì Service Locator sẽ đưa tới dịch vụ đó, hoặc khởi tạo nếu chưa có.
3.2. Lợi ích của Service Locator
Việc sử dụng Service Locator đem tới nhiều lợi ích cho các kỹ sư công nghệ:
- Service Locator là một mô hình đơn giản liên kết với nhau, cho phép có thêm code được thêm vào lúc chạy mà không cần dịch lại hoặc khởi động lại tiến trình
- Ứng dụng tự tối ưu trong lúc chạy bằng cách thêm bớt các nội dung từ trung tâm
- Các thư viện lớn, ứng dụng lớn có thể được chia nhỏ và kết nối với nhau thông qua việc sử dụng Service Locator.
Tuy nhiên, do các nội dung bên trong mô hình là hộp đen, tách biệt hoàn toàn với hệ thống nên trong nhiều trường hợp có thể không phát hiện ra lỗi. Ngoài ra, việc các tiến trình quá nhiều có thể gây tắc nghẽn Service Locator, đồng thời những mã được inject thêm vào có thể gây tổn hại tới quá trình thiết kế phần mềm.
Hy vọng qua bài viết này, các bạn đã có câu trả lời rõ ràng về Inversion of Control là gì, Cũng như có thêm kiến thức về mô hình Service Locator dựa trên nguyên lý IoC