Cơ bản về dependency injection
PHP
96
dependency injection
13
White

Le An viết ngày 24/05/2020

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.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Le An

3 bài viết.
1 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
5 2
Giả sử bạn đang cần tạo mới user và không biết là Linux cung cấp lệnh gì phù hợp. Bạn có thể gõ câu lệnh sau: sh $ man k user | grep 8 | grep cre...
Le An viết 7 tháng trước
5 2
Bài viết liên quan
Male avatar
0 1
Introduction Dependency injection (DI) is a technique widely used in programming and well suited to Android development, where dependencies are pr...
Hades viết 5 tháng trước
0 1
White
4 2
Bash script to fast serve Laravel project Lười gõ dòng lệnh quá nên tạo ra cái script để gõ nhanh :D laravelstart.sh /bin/bash if z "$1" ] ...
Vũ Hoàng Chung viết hơn 3 năm trước
4 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
1 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!