Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Cơ bản về dependency injection
Làm lập trình một thời gian có thể bạn sẽ nghe nói đến thuật ngữ "Dependency Injection". Hôm nay mình sẽ nói sơ qua để bạn có cái nhìn tổng quan chung trước khi đi sâu vào tìm hiểu và vận dụng pattern rất hữu ích này.
Mục đích
Trừ những dự án làm ngoài giờ cho vui, để thử nghiệm kiến thức mới rồi bỏ đi, thì hầu hết các dự án đều yêu cầu bạn phải bảo trì sourcecode đã viết ra, viết các chức năng mới trên nền code cũ (khả năng bảo trì - maintainable) . Và để đạt được tính "maintainable", thì code của bạn phải ít dính lẹo vào nhau, để tránh sửa 1 chỗ là bể app và phải sửa thêm 10 chỗ khác (tính ít kết dính - loose coupling). Dependency Injection là 1 pattern, cách triển khai code để giúp bạn đạt được loose coupling. Mục đích cuối cùng cũng chỉ là giúp code dễ bảo trì.
Giải nghĩa
Có 3 đối tượng liên quan đến dependency injection:
- service: là object giúp giải quyết vấn đề
- component: là object cần nhờ service để giải quyết vấn đề
- injector: nơi cung cấp service cho component, thường là hàm main hoặc file index
Ví dụ
<?php
//index.php
$generator = new StringGenerator();
$voucher = new Voucher($generator);
echo 'The code is: ' . $voucher->generate();
class StringGenerator implement GeneratorInterface
{
public function generate() {
return substr(md5(rand()), 0, 7);
}
}
class Voucher
{
private $generator;
public function __construct(GeneratorInterface $generator)
{
$this->generator = $generator;
}
public function getCode()
{
return $this->generator->generate();
}
}
Trong ví dụ trên ta thấy 3 đối tượng:
- component: class Voucher, có nhu cầu tạo ra code nhưng không biết tạo, phải nhờ service bên ngoài tạo giúp
- StringGenerator: có hàm generate giúp tạo string code
- injector: Các hàm bên ngoài file
index.php
, giúp khởi tạo service để gắn vào component, quá trình này gọi là dependency injection (service là dependency của component, vì component phải phụ thuộc vào service để làm điều mình muốn).
Trên đây là ví dụ đơn giản nhất về dependency injection, mục đích là để đạt được loose coupling dẫn đến đạt được maintainable. Trường hợp trên mặc dù cần sử dụng service StringGenerator, nhưng Voucher chỉ làm việc trên interface GeneratorInterface, nên sau này khi mình cần đổi code từ string sang code số thì chỉ cần tạo thêm NumberGenerator implement GeneratorInterface là được, khi đó ta không cần đổi lại code của Voucher, do đó đạt được loose coupling giữa Voucher và StringGenerator.





