Dependency Inversion khác gì Dependency Injection

Đây là câu hỏi đau đầu trong các buổi phỏng vấn. Trong bài viết nói chúng ta sẽ tìm hiểu xem chúng khác gì nhau
Dependency là gì?
Có một số loại phụ thuộc, bao gồm:
usage: thông dụng nhất, 1 class này dùng class khác bên trong nó
binding: class được gán một field hoặc 1 function khác ở runtime
realization: class implement interface
substitution: class con extends class chaĐ
Dependency Inversion Principle
Nguyên lý Dependency Inversion có thể đạt được bằng nhiều cách và Dependency Injection chỉ là 1 pattern có thể giúp thoả mãn nguyên lý này.
Ví dụ tôi có một RemoteControl chứa 1 field là Television
Vậy thì đây là sự phụ thuộc thông thường. Bây giờ đến lúc phù phép rồi:
Xong, giờ thì RemoteControl đã không còn phụ thuộc vào Television. Mà cả 2 cùng phụ thuộc vào 1 abstraction là OnOffDevice. Và ở đây chưa hề có Dependency Injection, nó sẽ không nói đến là ta có cần inject
cái OnOffDevice (abstract class hoặc interface) vào RemoteControl không
nhưng mà cũng có thể dùng Factory mà, ví dụ dùng như này cũng là Dependency Inversion rồi:
public class RemoteControl {
public RemoteControl() {
this.OnOffDevice = OnOffDeviceFactory.Create()
}
}
Dependency Injection Pattern
Tương tự, bạn có thể thoả mãn pattern dependency injection mà không sử dụng nguyên lý dependency inversion. RemoteControl depend trực tiếp vào Implementation:
public class RemoteControl {
public RemoteControl(Television television) {
_television = television;
}
}
Tada, vậy là chúng ta đã phân biệt được 2 thứ khó chịu này. Hẹn gặp lại các bạn.
Subscribe to my newsletter
Read articles from Anh Phan directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
