Inversion of control là gì? Tìm hiểu Dependency Inversion

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é!

Inversion of Control là gì? Có gì giống và khác với Dependency Injection?
Tìm hiểu về khái niệm Inversion of Control. Nguồn: Unsplash

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:

  1. Single responsibility principle
  2. Open/closed principle
  3. Liskov substitution principle
  4. Interface segregation principle
  5. 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.

Inversion of Control và Dependency Inversion có quan hệ mật thiết
Inversion of Control liên quan gì tới Dependency Inversion? Nguồn: Unsplash

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.

Inversion of Control giúp các kỹ sư bảo dưỡng mã tốt hơn.
Inversion of Control giúp việc bảo dưỡng mã tốt hơn. Nguồn: Unsplash

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

Nếu bạn quan tâm, hãy xem các vị trí đang tuyển dụng của Got It tại: bit.ly/gotit-hanoi và đọc thêm về quy trình tuyển dụng tại đây.

https://vn.got-it.ai/blog/wp-content/uploads/2021/04/1_QAG9RXQyyMAY7i9OYo84FA.png
Got It Vietnam
February 09, 2021
Share this post to:
Tags:
0 Comments
Inline Feedbacks
View all comments
Các bài viết liên quan
4 khóa học lập trình hướng đối tượng miễn phí cho người mới

4 khóa học lập trình hướng đối tượng miễn phí cho người mới

Nếu bạn muốn theo nghề IT thì sớm muộn cũng phải học lập trình hướng đối tượng. Đây là một kiến thức cơ bản, bắt buộc phải biết. Bài viết sẽ chia sẻ với bạn 4 khóa học miễn phí, phù hợp với người mới bắt đầu. Mục lục1. Học lập trình hướng đối tượng […]
Phương pháp lập trình hướng đối tượng và các ưu, nhược điểm

Phương pháp lập trình hướng đối tượng và các ưu, nhược điểm

Từ lâu phương pháp lập trình hướng đối tượng đã không còn xa lạ với các lập trình viên. Bài viết sẽ chia sẻ với các bạn một số ưu điểm và nhược điểm của phương pháp này. Mục lục1. Phương pháp lập trình hướng đối tượng là gì?2. Ưu điểm của phương pháp lập […]
4 khái niệm bạn phải biết khi lập trình hướng đối tượng

4 khái niệm bạn phải biết khi lập trình hướng đối tượng

Lập trình hướng đối tượng (Object-oriented programming) là một phương pháp quen thuộc đối với các chuyên gia phát triển phần mềm. Sau đây là 4 khái niệm bạn bắt buộc phải biết để hiểu về lập trình hướng đối tượng. Mục lục1. Class (Lớp)2. Objects (Đối tượng)3. Attributes (Thuộc tính)4. Methods (Phương thức) 1. […]
Bài tập lập trình hướng đối tượng cơ bản, nâng cao

Bài tập lập trình hướng đối tượng cơ bản, nâng cao

Đọc về Object-Oriented Programming (OOP) thôi là chưa đủ, quan trọng là bạn phải thực hành. Làm các bài tập lập trình hướng đối tượng sẽ giúp bạn nắm chắc hơn về OOP. Dưới đây là một số bài tập OOP Got It đã tổng hợp được. Hãy cùng làm để thành thạo lập trình […]
Tìm hiểu về Dependency Injection

Tìm hiểu về Dependency Injection

Trong bài viết trước về Inversion of Control (IoC), Got It cũng đã đề cập tới khái niệm Dependency Injection (DI). Nhiều kỹ sư vẫn đang gặp khó khăn trong việc phân biệt DI, Dependency Inversion và IoC. Vậy chúng là gì? Hãy cùng tìm hiểu câu trả lời qua bài viết sau nhé! Mục […]
Design Patterns for Dummies: Nhập môn Design Patterns

Design Patterns for Dummies: Nhập môn Design Patterns

Kể từ khi khái niệm Design Patterns được phổ biến nhờ Gang of Four, nhiều cuốn sách về Design Patterns đã ra đời. Design Patterns for Dummies là một ví dụ tiêu biểu. Trong bài viết dưới đây, bạn sẽ được cung cấp các thông tin và review chi tiết về cuốn sách này. Mục lục1. […]