2009-12-04 42 views
16

Tôi thường nghe/đọc về lập trình dựa trên giao tiếp nhưng tôi không rõ ràng về những gì thực sự có ý nghĩa. Là giao tiếp dựa trên lập trình một chủ đề thực tế đứng một mình mà thực sự có sách viết về nó? Nếu vậy, bất cứ ai có thể giới thiệu bất kỳ những cái tốt?Chính xác "lập trình dựa trên giao diện" là gì?

Tôi bắt gặp lập trình dựa trên giao diện khi tôi đang đọc về cách các API tốt được thiết kế và muốn tìm hiểu thêm về nó. Ngay bây giờ tôi không rõ ràng làm thế nào để đúng cách đi về thiết kế một API xung quanh giao diện.

Mọi thông tin đều được đánh giá cao.

+0

Đây là bản sao. Xem, ví dụ, câu hỏi 1413543 (http://stackoverflow.com/questions/1413543). – jason

+0

Bạn có thể muốn xem cuốn sách Head First Design Patterns. Mặc dù các ví dụ được viết bằng Java nó là một khởi đầu tốt. – kragan

+1

@Jason: Lập trình cho một giao diện không nhất thiết phải bằng cách lập trình dựa trên giao diện. Có nhiều "lập trình dựa trên giao diện" hơn là chỉ sử dụng các giao diện, nó thường có ý nghĩa nhiều hơn như một quyết định kiến ​​trúc. –

Trả lời

24

Về cơ bản, việc thể hiện các phụ thuộc phụ thuộc về mặt giao diện thay vì các lớp cụ thể (hoặc các phương pháp tĩnh, tệ hơn). Vì vậy, nếu một trong các lớp học của bạn cần thực hiện xác thực, nó sẽ được cung cấp IAuthenticator (hoặc bất kỳ thứ gì).

Điều này có nghĩa rằng:

  • Bạn có thể viết mã của bạn trước khi thực hiện phụ thuộc thực
  • Bạn có thể kiểm tra thông qua chế giễu thực sự dễ dàng (mà không cần phải đến các lớp học giả, mà được xấu xí)
  • Rõ ràng những gì bạn phụ thuộc vào về API thay vì thực hiện (nghĩa là bạn có khớp nối lỏng lẻo hơn)
+0

Có một cuốn sách hay giải thích về "phong cách" lập trình này trong C# không? – koumides

+1

@koumides: Không cụ thể, nhưng tìm kiếm "đảo ngược kiểm soát" và "tiêm phụ thuộc" để tìm nhiều bài viết. –

9

Chương 6 của "Practical API Design" by Jaroslav Tulach có tiêu đề "Mã chống lại giao diện, Không Triển khai ". Nó giải thích rằng, bằng cách mã hóa một giao diện chứ không phải là một triển khai cụ thể, bạn có thể tách các mô-đun (hoặc các thành phần) trong một hệ thống và do đó nâng cao chất lượng hệ thống.

Bertrand Meyer trong OOSC2 giải thích rõ ràng lý do tại sao "đóng" hệ thống và làm cho mô đun tăng thêm chất lượng.

3

Nếu bạn google cho giao diện, bạn sẽ tìm thấy nhiều thông tin về cách giao diện hữu ích có thể.

Khái niệm này là để xác định giao diện rõ ràng, sẽ được sử dụng bởi các thành phần/bộ phận/lớp/mô-đun khác nhau để giao tiếp và tương tác. Khi bạn đã xác định được đầu vào/đầu ra của các giao diện này, bạn có thể cho phép các nhóm khác nhau phát triển bất cứ điều gì cần thiết để đáp ứng các yêu cầu giao diện, bao gồm kiểm tra đầu vào/đầu ra, ... vv

Nếu bạn làm theo mô hình này, các đội khác nhau có thể bắt đầu phát triển phần của mình mà không cần chờ các phần khác sẵn sàng. Ngoài ra, bạn có thể sử dụng kiểm tra Đơn vị (sử dụng các đối tượng giả để mô phỏng các phần khác mà bạn không phát triển và kiểm tra phần của bạn).

Phương pháp này hoàn toàn là tiêu chuẩn cho bất kỳ dự án lập trình mới nào và mọi người sẽ chấp nhận điều này.

2

Đây là điều mà tôi không khuyên bạn nên sử dụng nhiều trong phát triển C#.

Interface-based programming về cơ bản là lập trình cho giao diện. Bạn phát triển các giao diện bạn sẽ sử dụng một Hợp đồng, và việc thực hiện thực tế của các giao diện được ẩn đằng sau các hợp đồng này.

Nó rất phổ biến trước .NET. Cách tốt nhất để lấy các thành phần có thể tái sử dụng trong Windows là qua COM, hoạt động thông qua giao diện ở mọi nơi. Tuy nhiên, được đưa ra.Khả năng hỗ trợ nhiều ngôn ngữ với một thời gian chạy (CLR), cũng như hỗ trợ tốt hơn cho phiên bản khi so sánh với mã gốc, tính hữu ích của lập trình dựa trên giao diện được giảm đáng kể khi bạn lập trình trong C# (trừ khi bạn cố gắng tạo các thành phần COM, trong trường hợp đó, bạn vẫn sẽ tạo các giao diện COM gián tiếp từ các lớp C# của bạn).

+0

Để downvoters: Tôi không gợi ý rằng các giao diện, trong và của chính họ, là xấu - đúng hơn, rằng tính hữu dụng của thiết kế toàn bộ API của bạn xung quanh giao diện, thường là những gì "giao diện lập trình dựa trên" là đề cập đến, không nhất thiết hợp lệ đối với các nhà phát triển C# như trong COM ngày. –

+0

Mocking dễ dàng hơn nhiều so với giao diện so với các lớp cụ thể (đặc biệt là các lớp được niêm phong không có phương thức ảo). Ngoài ra tôi vẫn tin rằng nó làm rõ những gì bạn thực sự phụ thuộc vào ... –

+0

@ Jon SKeet: True. Mocking có thể dễ dàng chống lại các giao diện hơn là các lớp kín hoặc không ảo, nhưng các lớp trừu tượng có thể được mô phỏng dễ dàng và có một số ưu điểm khi phiên bản, nếu bạn đang sử dụng C# (được gắn thẻ trong câu hỏi). –

3

Những gì bạn gọi là "lập trình dựa trên giao diện" thường được gọi là lập trình cho giao diện. Đây là một ví dụ bên dưới. Lợi ích là ẩn thực hiện thực tế của giao diện và cho phép mã của bạn được linh hoạt hơn và dễ dàng duy trì trong tương lai.

YourInterface foo = CreateYourInterface(); 
foo.DoWork(); 
foo.DoMoreWork(); 

CreateYourInterface() sẽ trả về triển khai thực hiện cụ thể YourInterface. Điều này cho phép bạn thay đổi các chức năng của ứng dụng bằng cách thay đổi một dòng:

YourInterface foo = CreateYourInterface(); 
+0

Bạn đã thay đổi một dòng mã ở đó? Cái nào? Có lẽ bạn có thể làm rõ? – DOK

+0

YourInterface foo = CreateYourInterface() là dòng tôi đang đề cập đến. Tôi đã chỉ ra rằng nếu bạn chỉ định một đối tượng khác để foo cũng triển khai thực hiện giao diện, bạn sẽ nhận được chức năng khác nhau với cùng một mã. –

0

Giao diện lập trình dựa trên có thể được coi là tách việc thực hiện các chức năng và làm thế nào bạn truy cập vào các chức năng.

Bạn định nghĩa một giao diện
interface ICallSomeone { public bool DialNumber(string number); }

và bạn viết thực hiện của bạn

public class callsomeone: ICallSomeone {
public bool DialNumber(string number) {
//dial number, return results }}

Bạn sử dụng giao diện mà không cần quan tâm đến việc thực hiện. Nếu bạn thay đổi việc triển khai, không có gì quan tâm bởi vì nó chỉ sử dụng giao diện.

0

Từ chế độ xem rất trừu tượng, lập trình dựa trên giao diện giống như các thành phần được sử dụng bởi thợ sửa ống nước (đường ống và đường ống).

Miễn là các đường ống và khớp được sản xuất theo giao diện được chỉ định (số lượng chủ đề và khoảng cách, v.v.), các nhà sản xuất khác nhau có thể cung cấp khớp nối với các ống có khả năng được sản xuất bởi một số nhà cung cấp khác (nhưng tôn trọng giao diện chung/ống nói trên).

Vì vậy, có nhiều khả năng tương tác của các thành phần và tự do cho thợ sửa ống nước để lựa chọn từ các nhà cung cấp khác nhau, phạm vi giá vv để tạo hệ thống ống nước chức năng.

Thay thế các đường ống và khớp với các thành phần phần mềm và các điểm tương đồng thật đáng kinh ngạc.

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