2009-03-03 29 views
6

Làm "Nguyên tắc đảo ngược phụ thuộc" (DIP) và "Thiết kế cho nguyên tắc giao diện" thể hiện cùng một nguyên tắc? Nếu không, sự khác biệt là gì?"Nghịch đảo phụ thuộc" và "Thiết kế giao diện" có cùng nguyên tắc không?

EDIT

Để làm rõ và thu hẹp bối cảnh một chút: bởi giao diện tôi là một giao diện chương trình, giống như một Java interface hoặc một lớp cơ sở trừu tượng thuần túy trong C++. Không có 'hợp đồng' khác có liên quan.

+0

Bạn có nghĩa là Injection phụ thuộc (còn gọi là Inversion of Control)? – tehvan

+0

Tôi không thể tìm thấy bất kỳ thông tin nào trên Google về "Nguyên tắc thiết kế giao diện" - bạn có thể giải thích ý của bạn bằng cách đó không? – Trumpi

+0

Bạn có thể có nghĩa là "thiết kế theo hợp đồng" – troelskn

Trả lời

-1

"thiết kế theo hợp đồng" và "tiêm phụ thuộc" có liên quan rất chặt chẽ, nhưng có mức độ trừu tượng khác nhau. "thiết kế theo hợp đồng" là một nguyên tắc thiết kế rất chung chung, có thể được hỗ trợ bởi các kỹ thuật khác nhau; Trong một ngôn ngữ có một hệ thống lớp giống như Java, bạn có một kỹ thuật là sử dụng các giao diện để tránh các phụ thuộc lớp bê tông. "tiêm phụ thuộc" là một kỹ thuật khác, thường dựa vào sự tồn tại của các giao diện để hoạt động (nhưng không cần phải luôn luôn làm điều đó - Nó phụ thuộc vào ngôn ngữ). Tôi sẽ nói "tiêm phụ thuộc" hỗ trợ nguyên tắc "thiết kế theo hợp đồng".

0

Thiết kế giao diện (dưới dạng biến thể của design by contract) hỗ trợ đảo ngược phụ thuộc. Cả hai giảm khớp nối. Tuy nhiên:

  • Thiết kế giao diện và DBC không nói gì về cách đối tượng được tạo (ví dụ: DIP, abstract factories, factory methods).
  • Nghịch đảo phụ thuộc (dependency injection) thường dựa trên giao diện, nhưng tập trung vào vòng đời đối tượng thay vì thiết kế lớp. Bạn có thể sử dụng DIP với các lớp cơ sở trừu tượng nếu bạn muốn, vì vậy bạn không thực sự cam kết với các giao diện thuần túy.

Phương pháp tiếp cận có xu hướng bổ sung cho nhau.

+0

Giao diện lớp cơ sở trừu tượng (thuần túy) =. – eljenso

+1

Và ở đâu DIP nói về tạo đối tượng/vòng đời? Có lẽ một số mẫu rơi vào danh mục "sáng tạo" hoặc "vòng đời" hoạt động tốt với DIP, nhưng chắc chắn DIP là nguyên tắc không quan tâm đến điều đó và là tất cả về thiết kế. – eljenso

+2

Sự phụ thuộc * đảo ngược * và sự phụ thuộc * tiêm * cũng không kém phần giống nhau. –

2

Tôi chỉ muốn quảng cáo và trích dẫn Derek Greer trên another question very similar to this one, vì nó trả lời câu hỏi này một cách độc đáo, theo ý kiến ​​của tôi.

"Những gì phụ thuộc Inversion Nguyên tắc không đề cập đến là việc thực hành đơn giản của trừu tượng hóa phụ thuộc thông qua việc sử dụng các giao diện (ví dụ MyService → [ILogger ⇐ Logger])."

Trong khi điều này tách riêng một thành phần từ các chi tiết thực hiện cụ thể của sự phụ thuộc, nó không đảo ngược mối quan hệ giữa người tiêu dùng và sự phụ thuộc (ví dụ [MyService → IMyServiceLogger] ⇐ Logger)."

2

phụ thuộc đảo ngược được đảm bảo module mức độ cao hơn của bạn Do đó, logic ứng dụng của bạn không phụ thuộc vào mô hình kinh doanh hoặc logic nghiệp vụ của bạn. Có một sự phân tách rõ ràng các mối quan tâm. phải thực hiện. cách tầng nghiệp vụ của bạn phụ thuộc vào giao diện được xác định của ứng dụng của bạn. Do đó các phụ thuộc được đảo ngược. Mở rộng này ra, nếu bây giờ bạn có ba ứng dụng, mỗi ứng dụng có giao diện riêng của họ được tầng kinh doanh của bạn thực hiện có thể thay đổi và miễn là chúng triển khai giao diện vì chúng phải là ứng dụng của bạn.

Một java tốt ví dụ về nguyên tắc này và làm thế nào một dự án như vậy sẽ được cấu trúc có thể được tìm thấy ở đây, trên trang web của tôi: http://www.jeenisoftware.com/maven-dip-principle-example/

phụ thuộc đảo ngược không phải là quá nhiều về thiết kế giao diện, mặc dù đó là những gì đang xảy ra , đó là thêm về việc triển khai dịch vụ. Nói cách khác, một loại mẫu thiết kế hướng dịch vụ.

Các vấn đề liên quan