Vấn đề

Một ví dụ nhỏ, có một ông chú mới startup bán hàng online yêu cầu thực hiện chức năng thanh toán khi đã có sẵn danh sách các sản phẩm trong giỏ hàng. Với yêu cầu đó ta có một thiết kế như hình bên dưới, hàm checkout() sẽ tính tổng tiền từ danh sách các sản phẩm rồi thực hiện paymentService.pay() để tiến hành trả tiền. Tạm thời thiết kế này đã ổn.

Bạn đang xem: Dependency là gì

*

*

Sau vài tháng, do có khó khăn với đối tác giao hàng nên ông chú quyết định tạm thời bỏ phương thức thanh toán bằng tiền mặt (Cash) thay bằng chuyển khoản (Ebanking). Đội dev lập tức tiến hành “đập nhà” xây lại một loạt các thứ phải điều chỉnh liên quan đến nó (documents, test functions, objects relative), mọi thứ đã được build thành tập tin nhị phân điều đó kiến cho mọi việc càng khó khăn hơn.

*

*

Do chiến lược hợp lý 3 tháng sau, ông chú ăn nên làm ra yêu cầu tích hợp thêm nhiều phương thức thanh toán mới (PaymentApp, COD, Card) để tiện cho người dùng. Đội dev nghe như sét ngay tai, tiến hành một loạt quá trình đập phá như lần trước.

*

Nhận xét: trên đó chỉ là một thay đổi nhỏ trong những cái thay đổi lớn của ông chú. Sự việc trở nên phức tạp là do:

Thuộc tính paymentService của đối tượng ShoppingCart phụ thuộc trực tiếp vào đối tượng PaymentService cụ thể (CashPaymentService/EbinkingPaymentService) nếu muốn thay thế hoặc thêm nhiều phương thức thanh toán khác thì phải hiện thực lại cả ShoppingCart.ShoppingCart chỉ nên làm đúng với nhiệm vụ của nó, là cung cấp phương thức thanh toán từ danh sách sản phẩm đã có. Chứ không chịu trách nhiệm tạo ra phương thức thanh toán (new).

Xem thêm: Mrs Là Gì – Phân Biệt Giữa Miss, Mrs

Hãy nhớ rằng:

Trái đất luôn hoạt động theo quỹ đạo của nó, khách hàng sẽ luôn quay chúng ta theo cách mà họ muốn mặc cho chúng ta gào thét thế nào đi chăng nữa!

Để tồn tại, qua nhiều năm các lập trình viên đã đúc kết một kỹ thuật để giải quyết các vấn đề trên đó là Dependency Injection.

Hiện thực

Đầu tiên giải quyết vấn đề:

ShoppingCart chỉ nên làm đúng với nhiệm vụ của nó, là cung cấp phương thức thanh toán từ danh sách sản phẩm đã có. Chứ không chịu trách nhiệm tạo ra phương thức thanh toán (new).

Lớp ShoppingCart không trực tiếp tạo ra đối tượng CashPaymentService mà chỉ nhận thể hiện nó thông qua hàm khởi tạo (constructor). Việc làm này cũng được hiểu theo kiểu khác, từ một thể hiện CashPaymentService đã tạo sẵn rồi đem tiêm (inject) nó vào ShoppingCart thông qua con đường là phương thức khởi tạo.

Xem thêm: Hàm Counta Là Hàm Gì – Hàm Count, Count A, Countif Trong Excel

Vấn đề tiếp theo là làm thế nào để dễ mở rộng và mềm dẻo hơn:

Thuộc tính paymentService của đối tượng ShoppingCart phụ thuộc trực tiếp vào đối tượng PaymentService cụ thể (CashPaymentService/EbinkingPaymentService) nếu muốn thay thế hoặc thêm nhiều phương thức thanh toán khác thì phải hiện thực lại cả ShoppingCart.

Chuyên mục: Hỏi Đáp