Dependency injection java là gì
Nếu các bạn đã biết về nguyên lý SOLID thì biết tới nguyên tắc cuối cùng được nhắc đến là Đảo ngược phụ thuộc – Dependency Inversion Principle (DIP). Nhắc lại nguyên tắc này, chúng ta có định nghĩa: Show + Các module cấp cao không nên phụ thuộc vào module cấp thấp. + Các class giao tiếp với nhau nên thông qua interface, không nên thông qua các implemention. Chi tiết có thể xem lại trong bài viết ” Nguyên lý solid PHP “. Dựa vào đó có 1 khái niệm chúng ta sẽ tìm hiểu trong bài viết này là Dependency Injection. Dependency Injection là 1 design pattern cho phép xóa bỏ sự phụ thuộc hard code, làm cho ứng dụng dễ dàng mở rộng cũng như maintain về sau. Có 3 khái niệm cần phân biệt: Dependency Inversion: Đây là nguyên lý để thiết kế và viết code. Inversion of Control: Đây là 1 design pattern được tạo ra để code tuân thủ nguyên lý Dependency Inversion. Có nhiều cách để thực hiện pattern này: ServiceLocator, Event, Delegate… và Dependency Injection chỉ là 1 trong các cách đó. Inversion of Control (IoC)Dependency Injection giúp chúng ta mở rộng code, và giảm sự phụ thuộc giữa các Dependency với nhau. Tuy nhiên lúc này code của chúng ta phải kiêm thêm nhiệm vụ đựa các phụ thuộc vào ( thông qua, constructor, setter, ….). Ví dụ: Chúng ta thực hiện hành động checkout giỏ hàng khi đó cần thực hiện. Chú ý đây chỉ là ví dụ, trong thực tế mọi thứ sẽ khác đi rất nhiều. + Lưu dữ liệu vào database. + Ghi log nội dung. + Thông báo cho người dùng qua email. Đoạn mã ví dụ sẽ như sau: checkout(); Câu hỏi đặt ra từ ví dụ trên là, nếu như chúng ta có rất nhiều phụ thuộc thì sẽ như thế nào? Không phải là lúc đó sẽ phải hàm khởi tạo sẽ rất dài và rối sao. Chưa kể đến là chúng ta cũng phải khởi tạo hàng tá đối tượng đưa vào. Để giảm thiểu độ rắc rối của đoạn mã có thể set phụ thuộc qua các setter, tuy vậy công sức bỏ ra cho chương trình như vậy không hề nhỏ. Và chúng ta ước rằng giá có công cụ hoặc ai đó làm hộ phần này thì tốt biết mấy. Và Inversion of Control chính là giải pháp để chúng ta thực hiện việc này. Theo wiki: Inversion of Control là một nguyên tắc lập trình, luồng điều khiển của ứng dụng thì không được quản lý bởi ứng dụng đó mà bởi 1 khung định nghĩa cơ bản khác. Phân tích về Dependency Injection.Bài toán ví dụ:Chúng ta xây dựng ứng dụng sử dụng cơ sở dữ liệu với Mysql. Đương nhiên khi đó, các lớp của chúng ta sẽ dạng như là Mysqlconnection… để thực hiện thao tác với Mysql. Nhưng một ngày đẹp trời vì yêu cầu khách hàng,hay đơn giản là chúng ta thích đổi sang SQL Server thì sẽ phải làm như thế nào? Chúng ta phải lần từng file để sửa, điều này vô cùng tốn công sức, thời gian mà còn chứa nhiều rủi ro… Khi đó Dependency Injection chính là giải pháp chúng ta giải quyết bài toàn này. Các phương pháp thực hiện Dependency InjectionTham khảo ở https://en.wikipedia.org/wiki/Dependency_injection#Interface_injection. + Constructor Injection: Các dependency sẽ được truyền vào 1 class thông qua hàm khoải tạo, Đây là cách thông dụng nhất được sử dụng nhiều ngôn ngữ lập trình và nhiều framework. Với PHP thì có thể thấy ở Laravel hay Magento… + Setter Injection: Các dependency sẽ được truyền vào 1 class thông qua các hàm Setter/Getter. + Interface Injection. Ưu và nhược điểm của Dependency InjectionƯu điểm+ Giảm hard code, tạo linh động giữa các module và cả linh hoạt trong việc mở rộng hành vi của 1 class. + Code dễ dạng bảo trì, thay thế, nâng cấp. + Dễ test, unit test. + Cho phép phát triển đồng thời nhiều module tính năng do sự phụ thuộc gắn kết giữa các module chỉ còn phụ thuộc vào các interface mà thôi. + Đây là một phương pháp thường sử dụng trong việc refactoring (tái cấu trúc) code. Nhược điểm+ Khó hiểu với người mới, cũng như khó xác định được đối tượng nào đang được Injection vào class hiện tại. + Khó debug, và chúng ta phải xem nhiều file, class hơn để thực hiểu được chương trình. + Cũng có 1 số hạn chế khi sử dụng để tìm code nhanh trên IDE, tìm tài liệu, hoặc xử lý các tham chiếu… + Các đối tượng được tạo từ ban đầu làm giảm performance Áp dụng Dependency Injection với PHPKhông chỉ trong Asp, java (spring)… mà ngay trong PHP chúng ta cũng có thể áp dụng các kỹ thuật này. Mà điển hình nhất trong PHP chính là cách vận hành của Laravel. Chúng ta cùng xây dựng 1 ví dụ cho việc này. Vẫn là ví dụ bên trên với việc checkout giỏ hàng. Khai báo các interface cho hành động cần xử lý.
|