Làm thế nào là tiêm phụ thuộc không chỉ chuyển sự phức tạp vào một lớp riêng biệt?


9

Tôi đã xem xét sử dụng khung Typhoon để tiêm phụ thuộc trong tuần này. Tôi nhận thấy rằng việc tách rời việc xây dựng các đối tượng có lợi cho việc thay thế các thành phần tùy ý bằng các mô phỏng trong quá trình thử nghiệm đơn vị, và cho đến nay tôi đã thấy lợi ích từ việc này một mình.

Nhưng tôi không thể không nghĩ rằng trước đây khi tôi có một lớp trình điều khiển chế độ xem khiêm tốn có hàng chục lần nhập tiêu đề, thì bây giờ tôi có một lớp nhà máy khiêm tốn có hàng chục lần nhập tiêu đề. Tôi có nên tránh có một lớp nhà máy lớn?


6
Trong một thập kỷ, tôi hy vọng DI sẽ tiếp quản danh sách bashing từ Singleton, nhưng lần này là vì những lý do chính đáng. Nó có một số công dụng tốt nhưng tôi đề nghị nên rất cẩn thận đánh giá tác động.
Balog Pal

5
Tôi không nghĩ rằng tiêm phụ thuộc là một cách để giảm độ phức tạp nhưng là cách để tránh phụ thuộc ngầm (sử dụng các ký hiệu toàn cục / biến tự do) có lợi cho các phụ thuộc rõ ràng (sử dụng tham số rõ ràng / biến bị ràng buộc). Vì vậy, sự phức tạp vẫn còn đó, nhưng bạn buộc phải đối phó với nó bởi vì bạn làm cho nó rõ ràng trong chữ ký phương thức / hàm tạo của bạn.
Giorgio

7
Lưu ý rằng hầu như bất kỳ hệ thống nào để tổ chức mã có thể được mô tả là "chỉ di chuyển sự phức tạp ở một nơi khác". Nó không phải là về việc loại bỏ sự phức tạp nhiều như việc tổ chức nó theo cách hợp lý, hữu ích nhất.

1
Nếu bạn phải nhập 50 tiêu đề, bạn phải làm điều đó ở đâu đó. DI giúp bạn dễ dàng hơn trong việc kiểm tra mã của bạn.
BЈовић

2
Vì vậy, bạn đang nói rằng bây giờ bộ điều khiển của bạn tập trung vào kiểm soát và nhà máy nhập tiêu đề của bạn tập trung vào nhập khẩu tiêu đề? Làm thế nào điều đó có thể trở thành một điều xấu, cho dù bạn đang sử dụng khung DI hay không?
pdr

Câu trả lời:


16

Dependency Injection chỉ đơn giản là giúp xác định cách một đối tượng biết về đối tượng phụ thuộc khác. Nó sẽ không giúp bạn giảm độ phức tạp chung của hệ thống. Nếu bạn cần hàng chục lần nhập trước DI, bạn vẫn sẽ cần hàng chục lần nhập sau. Sự khác biệt là những lần nhập này sẽ ở một vị trí (lớp) có ý nghĩa hơn (nhà máy, nhà xây dựng, v.v.).

Bằng cách cho phép các phụ thuộc được cung cấp thông qua một hàm tạo hoặc phương thức, bạn cho phép mình linh hoạt cung cấp một đối tượng phụ thuộc khác, nhưng vẫn hợp lệ cho lớp của bạn và tăng sự gắn kết của lớp đã nói bằng cách loại bỏ các mối quan tâm.

Có một số nguyên tắc tương tự nhau và thường được sử dụng cùng nhau: Dependency Injection (DI), Inversion of Control (IoC) và Nguyên tắc đảo ngược phụ thuộc (DIP)

Từ bài viết này http://martinfowler.com/articles/dipInTheWild.html

DI là về hệ thống dây điện, IoC là về hướng và DIP là về hình dạng


2
+1, cho trích dẫn cuối cùng. Đó là sự làm rõ tốt nhất về 3 khái niệm này mà mọi người thường hiểu sai.
haylem

Các bài viết liên kết ở trên là thực sự nổi bật. Một lời giải thích đủ sâu sắc và rất rõ ràng.
DemetriKots

10

Tiêm phụ thuộc không làm giảm độ phức tạp, nhưng nó làm tăng khả năng điều trị thông qua việc tách các mối quan tâm và giảm khớp nối.

Nhưng tôi không thể không nghĩ rằng trước đây khi tôi có một lớp trình điều khiển chế độ xem khiêm tốn có hàng chục lần nhập tiêu đề, thì bây giờ tôi có một lớp nhà máy khiêm tốn có hàng chục lần nhập tiêu đề. Tôi có nên tránh có một lớp nhà máy lớn?

Bạn nên tránh các lớp học "kỳ cục". Vì vậy, giả sử bạn chia bộ điều khiển xem thành các lớp nhỏ hơn, dễ bảo trì hơn. Bây giờ tất cả trong số họ có trách nhiệm để có được sự phụ thuộc của họ. DI giúp bạn chuyển quản lý phụ thuộc này từ tất cả các lớp đó sang một lớp cấu hình / nhà máy chỉ chịu trách nhiệm quản lý phụ thuộc - xem Nguyên tắc Trách nhiệm duy nhất. Và mặc dù nó chắc chắn sẽ ít "hài hước" hơn bộ điều khiển xem ban đầu, nhưng nếu nó quá lớn, bạn luôn có tùy chọn để chia nó thành các lớp quản lý phụ thuộc nhỏ hơn chịu trách nhiệm cho các phần khác nhau của ứng dụng.


2

Theo cách nói của giáo dân:

Tiêm phụ thuộc di chuyển phức tạp đến nơi mà nó ít gây hại.

EDIT cho @gnat: DI không chỉ chuyển sự phức tạp sang một lớp riêng biệt, nó chuyển nó đến nơi gây ra ít tác hại hơn.


Làm thế nào để trả lời câu hỏi này?
gnat

@gnat đã thêm một chỉnh sửa, câu trả lời của tôi giải thích theo ý kiến ​​của tôi làm thế nào DI không chỉ chuyển sự phức tạp thành một lớp riêng biệt.
Tulains Córdova
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.