Có gì mới

Một trong những kĩ thuật giúp chúng ta thực hiện quy tắc Dependency Inversion nêu trên chính là Dependency Injection

Dependencies là gì ?

Để dễ hiểu chúng ta sẽ định nghĩa dependency như bất kì modules nào mà chúng ta sẽ sử dụng trong chương trình của chúng ta. Hãy cùng xem hàm dưới đây (hàm này nhận vào hai số và trả về một số ngẫu nhiên nằm trong khoảng giữa của hai số nhận vào).

const getRandomInRange = (min: number, max: number): number => Math.random() * (max - min) + min;

Hàm này phụ thuộc vào hai tham số là min, max.

Thế nhưng bạn có thể thấy hàm này không những phụ thuộc vào hai tham số như đã nói ở trên mà còn phụ thuộc vào hàm Math.random. Nếu hàm Math.random không hoạt động vì một lí do nào đó thì hàm getRandomInRange của chúng ta cũng sẽ không hoạt động theo. Và đây chính là dẫn chứng cụ thể về việc phụ thuộc vào chức năng của một module khác. Do đó Math.random còn được gọi là dependency.

Chúng ta hãy cùng nhau thử truyền dependency thông qua tham số hàm xem sao.

const getRandomInrange = (
  min: number,
  max: number,
  random: () => number,
): number => random() * (max - min) + min;

Bây giờ khi muốn gọi đến hàm getRandomInRange ta cần truyền tham số như sau:

const result = getRandomInRange(1, 10, Math.random);

Để tránh việc lúc nào cũng phải truyền hàm Math.random vào như trên, ta có thể thiết lập nó như là giá trị mặc định (default value) cho tham số cuối cùng của hàm là random.

const getRandomInRange = (
  min: number,
  max: number,
  random: () => number = Math.random
): number => random() * (max - min) + min;

Đây chính là cách triển khai cơ bản nhất của Dependency Inversion. Đó là chúng ta sẽ truyền vào module của chúng ta tất cả những dependencies mà nó cần


trong News