Khái niệm về Dependency Inversion & Inversion of control (IoC) là gì
Dependency Inversion, Dependency Injection hay Inversion of Control được định nghĩa như thế nào đều là những câu hỏi khó kể cả với các kỹ sư kỳ cựu có nhiều kinh nghiệm.
Dependency Inversion, Dependency Injection hay Inversion of Control được định nghĩa như thế nào đều là những câu hỏi khó kể cả với các kỹ sư kỳ cựu có nhiều kinh nghiệm. Rất nhiều bạn mặc dù đã đi làm được vài năm nhưng vẫn chưa thực sự hiểu rõ về các khái niệm kể trên mà chỉ biết sử dụng chúng trong công việc. Vậy hãy cùng chúng tôi gỡ rối và tìm ra câu trả lời ngay trong bài viết dưới đây nhé!
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 là quy tắc lập trình mà trong đó modules cấp cao không nên phụ thuộc vào module cấp thấp, mà cả module cấp cao và module cấp thấp nên phụ thuộc vào abstraction. Ngoài ra, nguyên tắc Dependency Inversion còn 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 được qua implementation
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.Xem thêm: gửi hàng đường biển từ nhật về việt nam
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ày
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 có thể hiểu là một nguyên lý thiết kế trong công nghệ phần mềm. Các kiến trúc phần mềm được được áp dụng thiết kế này sẽ được đảo ngược quyền điều khiển so với kiểu lập trình hướng thủ tục. Trong lập trình hướng thủ tục thì các đoạn mã được thêm vào sẽ gọi các thư viện nhưng với IoC thì các IoC container sẽ chích những dependencies vào khi nó khởi tạo beanNói một cách tóm tắt thì IoC là một nguyên lý thiết kế được tạo ra để các code tuân thủ theo nguyên lý Dependency Inversion.Xem thêm: vận chuyển đường biển từ nhật về việt nam
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
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
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ó
Kết luận:
Các khái niệm về Dependency Inversion, Dependency Injection hay Inversion of Control đều là những kiến thức cần thiết mà mọi lập trình viên phải biết, hiểu cũng như sử dụng chúng một cách thuần thục. Hy vọng bài viết này phần nào đó giúp bạn hiểu hơn về các khái niệm trên. Hãy cùng chia sẻ các thông tin cũng như kiến thức mà bạn có với chúng tôi nhé!
ITNavi - Nền tảng kết nối việc làm IT
Nguồn: Khái niệm về Dependency Inversion & Inversion of control (IoC) là gì