Dependency la gì
Dependency Injection đối với 1 số bạn vẫn là 1 khái niệm khá mơ hồ. Nếu bạn cũng nằm trong số người mơ hồ đấy hãy theo dõi bài viết này nhé
Dependency injection là một kỹ thuật lập trình giúp tách một class độc lập với các biến phụ thuộc. Giải nghĩa theo Wikipedia ta có: Trong công nghệ phần mềm, Dependency injection là một kỹ thuật nhờ đó một đối tượng (hoặc phương thức tĩnh) có thể cung cấp các phụ thuộc của một đối tượng khác. Một biến phụ thuộc là một đối tượng có thể sử dụng (như một dịch vụ). Và việc chuyển nhiệm vụ tạo đối tượng cho người khác và trực tiếp sử dụng biến phụ thuộc được gọi là dependency injection. Các dependency injection phổ biến
Nhiệm vụ của dependency injection
Nếu có bất kỳ thay đổi nào xảy ra với các đối tượng, DI sẽ xem xét các thay đổi đó mà không quan tầm đến lớp đang sử dụng các đối tượng đó. Như vậy, nếu các đối tượng thay đổi trong tương lai, trách nhiệm của DI là cung cấp các đối tượng thích hợp cho lớp sử dụng các đối tượng đó. Một số lợi ích và hạn chế từ việc sử dụng DI
Một số hạn chế của DI
Đảo ngược kiểm soát — khái niệm đằng sau DIMột lớp không nên được cấu hình với các biến phụ thuộc tĩnh mà nên được cấu hình bởi 1 số lớp khác từ bên ngoài. Đây là nguyên tắc thứ năm trong S.O.L.I.D - năm nguyên tắc cơ bản của lập trình hướng đối tượng – theo như nguyên tắc này, một lớp nên dựa vào abstraction chứ không phải concretions (theo thuật ngữ đơn giản, mã hóa cứng – hard-coded). Theo đó, một lớp nên tập trung vào việc hoàn thành nhiệm vụ của mình chứ không phải tạo ra các đối tượng cần thiết cho việc thực hiện các nhiệm vụ đó. Dependency trong phần mềm xảy ra khi một phần của phần mềm phụ thuộc vào phần mềm khác để hoạt động. Ví dụ: một số trò chơi máy tính để bàn chạy trên Microsoft Windows phụ thuộc vào Microsoft DirectX. Vì trò chơi sử dụng công nghệ có trong thư viện phần mềm DirectX, nên DirectX phải được cài đặt trước khi trò chơi có thể chạy. Dependency trong lập trình là một chức năng thiết yếu, thư viện (library) hoặc đoạn mã cần thiết để một phần khác của mã hoạt động. Ví dụ: một dòng mã nhất định phụ thuộc vào một thư viện cụ thể. Dependency có nghĩa là thành phần A phụ thuộc vào thành phần B. Nếu thành phần B thay đổi, thì A nên thay đổi tương ứng. Ở đây, một thành phần có thể là một lớp (class), một hàm (function), interface, một phương thức. Thước đo mức độ phụ thuộc của A vào B có thể mạnh hoặc yếu. Dependency đôi khi tốt và đôi khi xấu. 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: + 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ý.
|
Bài Viết Liên Quan
Which keyword can be used in subclass to call the constructor of superclass?
Subclasses inherit public methods from the superclass that they extend, but they cannot access the private instance variables of the superclass directly and must use the public accessor and mutator ...
Chú thích đồ thị trong Matlab
Tài liệu Chú thích đồ thị và vẽ biểu đồ trong Matlab có mã là 583056, file định dạng pdf, có 16 trang, dung lượng file 394 kb. Tài liệu thuộc chuyên mục: Tài ...
How can we avoid NullPointerException in Java if condition?
Improve ArticleSave ArticleReadDiscussImprove ArticleSave ArticleIn order to learn how to avoid an error, we must first understand the error.NullPointerExceptionNullPointerException is a ...
Are member variables are accessible by all the member functions of the class?
Let us revise the basics of OOP with an example of modeling 2D points with integer coordinates (x, y) in a class called returnType functionName(parameter-type-list);4, as shown in the class ...
What methods deletes the file or directory denoted by this abstract pathname?
User interfaces and operating systems use system-dependent pathname strings to name files and directories. This class presents an abstract, system-independent view of hierarchical pathnames. An ...
Minecraft Java & Bedrock Edition for PC free
For players *not* using Windows 10 or Windows 11, please go to Minecraft.net/download to get the launcher for your operating system and access to your game. For more information on how to use the ...
Caác hàm xử lý date trong php
Hàm date() sẽ xuất ra một chuỗi thời gian dựa theo định dạng được truyền vào và số nguyên timestamp.Bài viết này được đăng tại freetuts.net, ...
How to learn Java for free
If you want to be a developer, create applications, or learn how to code, then Java is the best programming language to work with.In this article, we will introduce some of the best Java ...
Hàm execve sự dụng như thế nào
Một vài nét riêng biệt không được chạm vào đây:Với exec (), bạn có thể truyền một biến param tùy chọn sẽ nhận được một mảng các dòng đầu ra. Trong ...
Khuyết giá trị auto_increment thì phải làm sao
dq_ninh03-08-2009, 14:17khi tạo bảng CSDL thì có 1 trường auto increment để tăng Id lên 1 giá trịMình thấy làm như vậy rất lợi, nhưng mình ko hiểu tại sao một số ...