Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wordpress-seo domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /var/www/vinascript/html/wp-includes/functions.php on line 6114
Tìm hiểu về Dependency Inversion & Inversion of control (IoC) - VinaScript

Latest Post

Triển khai dự án PHP, Mysql với Nginx trên Docker Tìm hiểu về HTML – Ưu điểm, nhược điểm và cách hoạt động của HTML

Dependency Inversion, Dependency Injection, và Inversion of Control là những khái niệm quan trọng trong lập trình hướng đối tượng và thiết kế phần mềm. Dù bạn là một kỹ sư kỳ cựu hay mới bước vào nghề, việc hiểu rõ và áp dụng đúng các khái niệm này có thể là một thách thức. Trong bài viết này, chúng tôi sẽ giúp bạn gỡ rối những khái niệm này và tìm hiểu cách chúng hoạt động trong thực tế.
Khái niệm Inversion of control (IoC) là gì?

Khái niệm Inversion of control (IoC) là gì?

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

Trước khi muốn tìm hiểu Inversion of control (IoC) thì bạn cần phải hiểu rõ Dependency Inversion là gì và quy tắc SOLID trong thiết kế, lập trình hướng đối tượng (OOP)Quy tắc SOLID thì bao gồm 5 quy tắc cơ bản, đó là:

  • Single responsibility principle
  • Open/closed principle
  • Liskov substitution principle
  • Interface segregation principle
  • Dependency inversion principle

Trong bài viết này ta chỉ cần quan tâm đến Dependency inversion principle. Để dễ hiểu bạn có thể hiểu rằng Dependency Inversion (DI) là một kỹ thuật trong đó một đối tượng nhận các phụ thuộc cần thiết của nó từ bên ngoài, thay vì tự tạo hoặc tìm kiếm chúng. Các phụ thuộc này thường được cung cấp thông qua constructor, setter hoặc phương thức giao diện. Dependency Injection giúp tách biệt việc tạo các phụ thuộc từ việc sử dụng chúng, làm cho mã dễ kiểm tra và bảo trì hơn.

Một ví dụ để dễ hiểu về Dependency Inversion: Mặc dù có hình dáng khác nhau nhưng đèn huỳnh quang hoặc đuôi tròn đều có thể dễ dàng thay thế nhauỞ đây ta có thể hiểu interface chính là đuôi tròn còn implementation là bóng đèn tròn và bóng đèn huỳnh quang.

Ta có thể hoán đổi giữa 2 loại bóng đèn bởi ổ điện chỉ quan tâm tới interface là cái đuôi tròn chứ không cần quan tâm tới implementationTrong code cũng tương tự như vậy, khi áp dụng Dependency Inversion, bạn chỉ cần quan tâm tới interface. Để kết nối với database, bạn chỉ cần gọi hàm Get hay Save … của Interface IDataAccess. Khi thay database, chỉ cần thay implementation của interface nàySự liên quan giữa Inversion of Control và Dependency Inversion là gì?

Sự liên quan giữa Inversion of Control và Dependency Inversion là gì?

Inversion of Control là gì?

Vậy thì Inversion of Control (IoC) là gì? Inversion of Control (IoC) là một nguyên tắc thiết kế trong đó sự điều khiển của chương trình được đảo ngược, từ việc lập trình viên điều khiển luồng xử lý sang việc framework hoặc container điều khiển. Dependency Injection là một cách để thực hiện Inversion of Control. IoC giúp giảm sự phụ thuộc giữa các thành phần trong hệ thống và thúc đẩy tính tái sử dụng và mở rộng.

Một vài mô hình được sử dụng để triển khai Inversion of Control (IoC) như: Service Locator, Events hay DI (Dependency InjectionĐể có thể hiểu rõ hơn về IoC, ta có thể lấy một ví dụ như sau: Giả sử có 1 class mẹ là A và hai class con là B và C ( lúc này B và C sẽ được gọi là các dependencies) Với mô hình không sử dụng IoC thì Class A cần phải khởi tạo và điều khiển hai class B và C, bất kỳ thay đổi nào ở Class A đều dẫn đến thay đổi ở Class B và C. Một thay đổi sẽ kéo theo hàng loạt những thay đổi khác từ đó làm giảm khả năng bảo trì của code. Trong khi đó, nếu 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 một bên thứ ba, từ đó các class không phụ thuộc lẫn nhau mà chỉ phụ thuộc vào interface. Điều này cũng đồng nghĩa rằng sự thay đổi ở class cấp cao sẽ không ảnh hưởng tới các class cấp thấp hơnMột số lợi ích mà IoC đem lại:

  • Có sự tách rời việc thực hiện một nhiệm vụ nhất định khỏi quá trình thực thi
  • Giúp việc chuyển đổi giữa các implementations trở nên dễ dàng hơn
  • Việc thay thế các mô-đun không có tác dụng phụ đối với các mô-đun khác
  • Dễ dàng hơn trong việc test chương trình bằng cách tách một thành phần hoặc mock các dependencies của nó, cho phép chúng communicate thông qua contracts

Inversion of Control giúp cho việc bảo dưỡng code tốt hơn

Inversion of Control giúp cho việc bảo dưỡng code tốt hơn

Spring IoC là gì?

IoC Container chính là thành phần thực hiện IoCTrong Spring, công việc của Spring Container (IoC Container) là sẽ tạo các đối tượng rồi lắp ráp chúng lại với nhau, cấu hình các đối tượng và quản lý vòng đời của chúng từ lúc được tạo ra cho đến khi bị hủySpring container sẽ sử dụng DI để quản lý các thành phần, đối tượng để tạo nên 1 ứng dụng. Các thành phần, đối tượng này được gọi là Spring Bean Để tạo đối tượng, cấu hình và lắp ráp chúng thì Spring Container sẽ đọc các thông tin từ  file xml sau đó thực thi chúng

Để tạo đối tượng, cấu hình và lắp ráp chúng thì Spring Container sẽ đọc các thông tin từ  file xml sau đó thực thi chúng

IoC Container trong Spring có 2 kiểu là: BeanFactory và ApplicationContextSự khác nhau 2 kiểu BeanFactory và ApplicationContext là: BeanFactory hay ApplicationContext đều là các interface thực hiện IoC Container. ApplicationContext được xây dựng như BeanFactory nhưng nó có thêm một vài chức năng mở rộng: tích hợp với Spring AOP, xử lý message và context cho web applicationMời bạn tham khảo thêm về Spring là gì? Lợi ích mà Spring mang lại cho người dùng

Dependency injection là gì?

Dependency injection – DI cũng là một trong những design pattern được sử dụng để triển khai IoCNguyên tắc cơ bản của DI là làm cho module cấp cao phụ thuộc vào module cấp thấp thông qua injector, hay nói cách khác, muốn tạo instance module cấp cao, ta phải tạo instance của module cấp thấp và inject nó vào module cấp cao thông qua injector. Injector ở đây có thể là constructor hay setter và interfaceTheo nguyên tắc trên giường như bạn cảm thấy nó có vẻ mâu thuẫn với Dependency inversion principle (DIP), tuy nhiên nếu xem xét kỹ thì không hẳn là vậy. Nguyên tắc của DI khác ở chỗ nó sẽ tạo ra sự phụ thuộc của module cấp cao và module cấp thấp thông qua abstraction chứ không phải theo cách trực tiếp. Như vậy, module cấp cao sẽ sử dụng Service (module cấp thấp abstraction) thông qua injector mà không cần quan tâm đến việc khởi tạo của nó

Mối quan hệ giữa DIP, DI và IoC

  • Dependency Inversion Principle (DIP) là nguyên tắc thiết kế hướng tới việc giảm sự phụ thuộc giữa các module cấp cao và cấp thấp thông qua abstraction.
  • Dependency Injection (DI) là một cách cụ thể để thực hiện Inversion of Control (IoC), giúp cung cấp các phụ thuộc cho đối tượng từ bên ngoài thay vì tự tạo ra chúng.
  • Inversion of Control (IoC) là một nguyên tắc rộng hơn, trong đó việc điều khiển luồng chương trình được đảo ngược, và Dependency Injection là một trong những cách phổ biến để thực hiện nguyên tắc này.

Kết luận

Như vậy, hiểu rõ về Dependency Inversion, Dependency Injection và Inversion of Control không chỉ giúp bạn áp dụng chúng một cách hiệu quả trong công việc, mà còn giúp bạn thiết kế các hệ thống phần mềm linh hoạt, dễ kiểm tra và bảo trì hơn.

Để lại một bình luận

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 *