
Theo qui ước, Client không được phép sử dụng concrete class LoginService mà chỉ depend trên ILoginService. Việc khởi tạo object LoginService sẽ do Spring đảm trách.
Cách thiết kế này có vấn đề gì? Tăng tính flexible vì dễ dàng thêm và thay thế bằng AnotherLoginService thông qua cấu hình Spring mà Client không cần thay đổi. Không đáng để như thế. Tại sao chúng ta không tạo IKeyNotFoundException và "spring" nó với KeyNotFoundException?
OK. Vậy có tính chất khác đủ thuyết phục hơn cách lập luận phủ định không?
Có. Thiết kế như trên làm giảm tính cohension của package WebUI. Tất cả các lớp trong cùng một package cần có mối liên kết chặt chẽ nhất có thể. LoginService và Client cùng package nên lệ thuộc trực tiếp với nhau và gia tăng tính cohensive của package.
Dường như đây không phải lời khuyên thường thấy? Có thể đúng, có thể không chính xác.
Client depend lên ILoginService thì tốt hơn, có thể bằng cách nhận ILoginService trong hàm khởi tạo:
class Client {
public Client(ILoginService login) { ... }
...
}
Cũng có nghĩa là ở một nơi nào đó trong package WebUI, sẽ có 1 nơi khởi tạo object từ class LoginService. Điều này vẫn giúp duy trì tính cohension chặt.
Dependency Injection không cần thiết mặc dù chương trình vẫn chạy.
Taiichi Ohno nói rằng: hao phí lớn nhất trong sản xuất chính là sản xuất thừa.
No comments:
Post a Comment