Nguyên tắc đảo ngược phụ thuộc: Hiểu cách cả hai thành phần cấp thấp và thành phần cấp cao phụ thuộc vào trừu tượng


10

Tôi đang tìm hiểu về Nguyên tắc đảo ngược phụ thuộc. Nó nói rằng:

Các mô-đun cấp cao không nên phụ thuộc vào các mô-đun cấp thấp. Cả hai nên phụ thuộc vào trừu tượng.

Trong một thời gian, tôi đã cố gắng hiểu điều đó có nghĩa là cả các thành phần cấp cao và các thành phần cấp thấp, đều dựa vào sự trừu tượng và phụ thuộc vào chúng .

Tôi cho rằng cả hai nên phụ thuộc vào cùng một sự trừu tượng theo một cách nào đó. Xin hãy sửa cho tôi nếu điều này là sai.

Tôi đã đi đến một số kết luận về điều này có nghĩa là gì. Vui lòng xác nhận nếu điều này là chính xác.

nhập mô tả hình ảnh ở đây

" Các thành phần cấp cao phụ thuộc vào sự trừu tượng" - Ý nghĩa:

Các thành phần cấp cao nói chuyện với một giao diện để giao tiếp với các thành phần cấp thấp , thay vì giao tiếp trực tiếp với các thành phần cấp thấp cụ thể. Các thành phần cấp thấp thực hiện giao diện này.

" Các thành phần cấp thấp phụ thuộc vào sự trừu tượng" - Ý nghĩa:

Các thành phần cấp thấp được xác định và thiết kế theo các điều khoản của giao diện. Chúng được thiết kế để phù hợp với giao diện . Chúng phụ thuộc vào giao diện, theo cách mà giao diện xác định cách chúng được thiết kế. (Thường các lớp cấp thấp thực hiện giao diện đó).

Theo cách này, cả các thành phần cấp cao và cấp thấp đều "phụ thuộc vào sự trừu tượng", nhưng theo những cách khác nhau.

Đây có phải là một sự hiểu biết tốt?


8
Bạn có khá nhiều vị trí trên. Phần cuối cùng của câu đố là giao diện được xác định bởi thành phần cấp cao chứ không phải cấp thấp. Nói cách khác, mối quan tâm cấp cao (ví dụ: mô hình miền) được chọn cách thuận tiện nhất để nói chuyện với mã cấp thấp (như mã truy cập dữ liệu) và đó là công việc của mã cấp thấp để tuân thủ đến giao diện đó. Khi bạn hiểu rằng giao diện là một phần của hành vi cấp cao, thuật ngữ 'đảo ngược phụ thuộc' có ý nghĩa hơn nhiều.
Benjamin Hodgson

1
@BenjaminHodgson Tôi thấy. Hãy để tôi xem nếu tôi hiểu. Rõ ràng một đối tượng không thể định nghĩa một giao diện, đó là công việc của lập trình viên. Vì vậy, 'giao diện được xác định bởi thành phần cấp cao' , tôi giả sử bạn có nghĩa là 'lập trình viên định nghĩa giao diện theo cách thuận tiện cho các thành phần cấp cao nói chuyện với các thành phần cấp thấp '. Bạn có xác nhận không?
Aviv Cohn

(vì những người cấp thấp sau này sẽ thực hiện giao diện này và được xây dựng theo nó).
Aviv Cohn

Vâng, rõ ràng tất cả các mã được viết bởi lập trình viên. Tôi đã cố gắng truyền đạt ý tưởng rằng giao diện là một phần của mối quan tâm cấp cao; bạn nên đặt nó trong cùng một gói với mã cấp cao của bạn và nó sẽ thay đổi theo các yêu cầu nghiệp vụ, không đáp ứng với các thay đổi trong chi tiết triển khai.
Benjamin Hodgson

1
Tôi chỉ muốn thêm một lời cảnh báo rằng mặc dù đó là lý tưởng, nhưng không phải lúc nào bạn cũng có được sự sang trọng trong việc xác định giao diện cấp thấp theo bất kỳ yêu cầu nào của thành phần cấp cao. Ví dụ: nếu bạn đang tích hợp một thư viện hiện có cung cấp một số chức năng hữu ích vào ứng dụng của mình, rất có thể bạn có các thành phần cấp cao đại diện cho chức năng kinh doanh mà bạn đang cố gắng thực hiện. Họ sử dụng thư viện cấp thấp đó (ví dụ như có thể là iText) để thực sự làm việc. Bạn có thể sẽ không có sự xa xỉ trong việc xác định sự trừu tượng mà không quan tâm đến những gì iText cần.
Calphool

Câu trả lời:


6

Sự hiểu biết của bạn về khái niệm này là rất chính xác.

Chỉ ra các trường hợp ngoại lệ, trường hợp đặc biệt hoặc các chi tiết triết học ngay bây giờ sẽ chuyển hướng bạn khỏi sự rõ ràng hiện tại của bạn về khái niệm.

Tuy nhiên, tôi sẽ đề nghị bạn sử dụng các ký hiệu UML:

nhập mô tả hình ảnh ở đây

  • Mũi tên mở: sử dụng
  • Mũi tên kín: kế thừa hoặc thực hiện
  • << tên trong ngoặc >>: giao diện hoặc lớp trừu tượng

0

Vâng, nhiều người nghĩ về xây dựng phần mềm như trong xây dựng công trình. DB là "nền tảng" mà DAL nằm trên nó, Lớp doanh nghiệp ngồi trên DAL, Giao diện người dùng nằm trên Lớp doanh nghiệp ...

Thay vào đó hãy nghĩ về nó như một chiếc điện thoại di động treo. Trong đó các "lớp" treo từ một neo chung. Cả UI và Lớp doanh nghiệp đều treo từ Giao diện doanh nghiệp, Lớp doanh nghiệp và DAL đều treo từ giao diện DAL, DAL và Cơ sở dữ liệu kết nối thông qua Giao diện DB.

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.