Nguyên tắc đảo ngược phụ thuộc: Làm thế nào để xác định chính sách cấp cao của Hồi giáo và chi tiết cấp thấp của Hồi giáo cho người khác?


13

Tôi đang cố gắng giải thích nguyên tắc đảo ngược phụ thuộc cho các đồng nghiệp (chủ yếu là đàn em) của tôi. Làm cách nào chúng ta có thể định nghĩa cái nào là "chính sách cấp cao" và cái nào là "chi tiết cấp thấp" trong phần mềm? Ví dụ: nếu phần mềm của chúng tôi tự động hóa quy trình làm việc của một số ứng dụng kinh doanh, tại sao chúng tôi nói rằng tự động hóa quy trình làm việc là chính sách cấp cao và các ứng dụng kinh doanh là chi tiết?

Câu trả lời:


11

Lưu ý: điều này đã được viết lại hoàn toàn từ ví dụ trước của tôi

Hãy suy nghĩ về ổ cắm điện. Ở bất kỳ quốc gia nào, chính sách cấp cao là ổ cắm điện luôn giống nhau. Không quan trọng bạn lấy điện từ đâu (than, gas, hạt nhân), các ổ cắm trên tường phải luôn luôn cung cấp cùng một lượng điện, thông qua cùng một bộ kết nối.

Bây giờ bạn có thể cắm bất kỳ thiết bị nào vào ổ cắm đó, bởi vì tất cả chúng đều có giao diện chung là "phích cắm". Chính sách cấp cao không bao giờ phải ra lệnh cho bất kỳ phần nào của chi tiết triển khai đó. Chỉ cần cắm một cái gì đó vào và nó đi.

Bây giờ nếu bạn có một thiết bị không muốn nguồn AC - có thể nó chạy trên mạch DC 7V - bạn vẫn có thể sử dụng chính sách cấp cao đó, bạn chỉ cần một số loại bộ chuyển đổi giữa nguồn điện và thiết bị. Và, bởi vì mọi người đều có chính sách cấp cao giống nhau, nhà sản xuất có thể xây dựng điều đó thành việc thực hiện mà không có bất kỳ thay đổi nào đối với chính sách cấp cao. Người kết nối việc thực hiện với chính sách (bạn, cắm máy tính xách tay của bạn) cũng không thực sự cần phải hiểu.

Hơn nữa, nếu nhà sản xuất muốn bán cùng một thiết bị ở một quốc gia khác, tất cả những gì họ phải làm là phát triển một bộ chuyển đổi khác. Vì vậy, cùng một triển khai có thể làm việc với nhiều chính sách trong khi cùng một chính sách có thể chạy nhiều triển khai.

Đây là một ví dụ hoàn hảo của nghịch đảo phụ thuộc.

Nhưng đây là một chút thú vị: Quay trở lại những gì tôi nói đầu tiên. "Không quan trọng bạn lấy điện từ đâu." Đây cũng là một chi tiết thực hiện. Chính sách cấp cao vẫn là tất cả các ổ cắm điện có hình dạng giống nhau và phát ra cùng một loại năng lượng. Các chi tiết thực hiện ở cấp độ thấp là cả nguồn điện đến từ đâu và chạy như thế nào.

Theo thuật ngữ lập trình, điều đó có nghĩa là chính sách cấp cao là giao diện (Trường hợp ngôn ngữ hỗ trợ. Một dạng khác của DI là gõ vịt.) Mà API cung cấp và ứng dụng tiêu thụ và cả chi tiết triển khai cấp thấp đều là ứng dụng tiêu thụ nó và chính API, cả hai đều không cần phải hiểu nhau.

Bộ điều hợp có thể được sử dụng để phù hợp với việc thực hiện giống nhau trong các chính sách khác nhau.


+1 Crikey. Không biết tôi có thể học được nhiều như vậy từ một ổ cắm điện đơn giản :)
dreza

7

Cách tiếp cận cổ điển trong tái sử dụng phần mềm là xây dựng các thành phần phụ thuộc vào không có gì khác (đó là yếu tố khiến chúng ở mức thấp), sau đó xây dựng các thành phần cấp cao hơn phụ thuộc vào các thành phần cấp thấp hơn. "Cấp cao" và "cấp thấp" được xác định cụ thể theo hướng phụ thuộc, vốn không phải là chức năng của thành phần, mà thường chỉ là một quyết định kiến ​​trúc.

Vì vậy, khi các ứng dụng kinh doanh đơn lẻ được xây dựng không phụ thuộc vào tự động hóa quy trình công việc, nhưng bộ điều khiển luồng công việc của bạn có phụ thuộc trực tiếp vào ứng dụng kinh doanh, thì rõ ràng tự động hóa quy trình công việc là một "chính sách cấp cao" và ứng dụng kinh doanh là một Thành phần "cấp thấp". Lưu ý rằng cấu trúc này không bắt buộc - nếu thành phần tự động hóa quy trình công việc của bạn là một khung chung, không được kết hợp với các ứng dụng kinh doanh cụ thể của bạn, nhưng có thể được cấu hình để phục vụ các ứng dụng khác nhau, thì bạn đã bắt đầu áp dụng DIP. Trong tình huống này, sự phân tách "mức cao" / "mức thấp" có thể không còn ý nghĩa giữa hai điều đó nữa.

Vì vậy, tên "đảo ngược phụ thuộc" có phần gây hiểu nhầm - vì các phụ thuộc không bị "đảo ngược", nhưng bị loại bỏ hoàn toàn (hoặc chính xác hơn: thay đổi từ phụ thuộc thời gian biên dịch thành phụ thuộc thời gian chạy).


1
Không hẳn. Sự đảo ngược xảy ra bởi vì các cấp thấp hơn phụ thuộc vào giao diện. Áp dụng Nguyên tắc phân chia giao diện (chữ I trong RẮN), giao diện đó "thuộc về" máy khách. Vì vậy, mức độ thấp hơn ẩn dụ có một sự phụ thuộc vào khách hàng.
Michael Brown

2
@MikeBrown: đó là một quan điểm khả thi. Tôi thích quan điểm trong đó giao diện không thuộc về A hoặc B, mà thuộc về cơ sở hạ tầng hoặc môi trường của A và B.
Doc Brown

1

Tôi sử dụng một hình ảnh đơn giản để giải thích DIP. Quan điểm cổ điển về phát triển phần mềm là một quá trình xây dựng với mỗi lớp nằm trên cùng của các lớp thấp hơn hỗ trợ nó. Sử dụng Nguyên tắc đảo ngược phụ thuộc giống như xây dựng một điện thoại di động.Treo di động

Thay vì các lớp cao hơn ngồi ở các lớp thấp hơn, các lớp cao hơn trong giao diện di động với các lớp thấp hơn thông qua chuỗi kết nối chúng. Theo một cách nào đó, các lớp thấp hơn phụ thuộc vào giao diện đó để được hỗ trợ (không có chuỗi họ sẽ rơi). Đó là một cách ngắn gọn.


+1 để so sánh tốt. Trong ảnh này, bạn có thể thấy quan điểm của tôi - tất cả các lớp phụ thuộc vào giao diện, nhưng không phải các lớp thấp hơn trên các lớp cao hơn hoặc ngược lại.
Doc Brown

Tôi thấy những gì bạn đang nói, Giao diện không thuộc cấp cao hơn hoặc cấp thấp hơn.
Michael Brown

1
Anh ta không hỏi làm thế nào để giải thích DIP, anh ta hỏi làm thế nào để giải thích phần nào của ứng dụng là chính sách cấp cao và đâu là triển khai cấp thấp. Sự tương tự của bạn không cần phải mở rộng để làm điều đó. Bạn chỉ cần có thể thay đổi trang trí mà không cần thay đổi chuỗi (vì nếu bạn không thể thì chính sách di động cấp cao có quá nhiều chi tiết về việc triển khai trang trí).
pdr

1
(và, trên thực tế, bạn có thể xây dựng một điện thoại di động hoàn toàn mới từ chất liệu khác nhau và treo các đồ trang trí tương tự tắt nó - đó là điểm Doc Brown)
Lào
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.