2009-08-10 30 views
5

Ok điều tuyệt vời về lập trình cho giao diện là nó cho phép bạn trao đổi các lớp cụ thể miễn là các lớp mới thực hiện mọi thứ trong giao diện đó.C# khi nào lập trình cho giao diện?

ví dụ: tôi lập trình đối tượng dataSource của tôi vào một giao diện để tôi có thể thay đổi nó giữa một trình đọc xml và một trình đọc cơ sở dữ liệu sql.

điều này có nghĩa lý tưởng là mọi lớp học nên được lập trình cho giao diện? khi nào bạn không nên sử dụng giao diện?

Trả lời

11

Khi nguyên tắc YAGNI áp dụng.

Giao diện tuyệt vời nhưng bạn quyết định khi nào cần thêm thời gian để phát triển giao diện. Tôi đã sử dụng giao diện nhiều lần nhưng có rất nhiều tình huống mà họ hoàn toàn không cần thiết.

+2

+1, rất dễ dàng để trích xuất một giao diện ra khỏi lớp bằng cách sử dụng công cụ tái cấu trúc, vì vậy không có lý do để làm điều đó trước khi bạn biết chắc chắn rằng bạn cần một giao diện. –

4

Không phải mọi lớp cần phải được thay đổi linh hoạt với một số lớp khác. Thiết kế hệ thống của bạn nên xác định các điểm mà các mô-đun có thể hoán đổi cho nhau và sử dụng các giao diện cho phù hợp. Sẽ là ngớ ngẩn khi ghép nối mọi lớp với một tệp giao diện bổ sung nếu không có cơ hội nào cho lớp đó là một phần của một số nhóm chức năng.

Mọi giao diện bạn thêm vào dự án đều làm tăng thêm độ phức tạp cho cơ sở mã. Khi bạn đối phó với các giao diện, khả năng phát hiện của chương trình hoạt động khó khăn hơn, bởi vì nó không phải lúc nào cũng rõ ràng mà IComponent đang điền vào cho công việc khi mã người tiêu dùng đang xử lý giao diện một cách rõ ràng.

0

Câu hỏi thực sự là: lớp học của bạn làm gì? Nếu bạn đang viết một lớp thực sự thực hiện một giao diện ở đâu đó trong khung công tác .NET, hãy khai báo nó như vậy! Hầu như tất cả các lớp thư viện đơn giản sẽ phù hợp với mô tả đó.

Nếu, thay vào đó, bạn đang viết một lớp bí truyền chỉ được sử dụng trong ứng dụng của bạn và không thể lấy bất kỳ biểu mẫu nào khác, thì sẽ không có ý nghĩa gì khi nói về giao diện mà nó thực hiện.

Bắt đầu từ tiền đề của ", tôi có nên triển khai giao diện không?" là thiếu sót. Bạn không nên cũng không nên. Bạn chỉ cần viết các lớp bạn cần, và khai báo những gì chúng làm khi bạn đi, bao gồm những giao diện mà chúng thực hiện.

1

Sử dụng giao diện khi bạn mong muốn cần các hành vi khác nhau được sử dụng trong cùng một ngữ cảnh. I E. nếu hệ thống của bạn cần một lớp khách hàng được xác định rõ, có thể bạn không cần sử dụng giao diện ICustomer. Nhưng nếu bạn mong đợi một lớp học tuân thủ một hành vi nhất định s.a. "đối tượng có thể được lưu" áp dụng cho các knids khác nhau của các đối tượng sau đó bạn shoudl có lớp thực hiện một giao diện ISavable.

Một lý do khác để sử dụng giao diện là nếu bạn mong đợi các triển khai khác nhau của một loại đối tượng. Ví dụ: nếu ypu lập kế hoạch một SMS-Gateway sẽ định tuyến SMS thông qua một số dịch vụ của bên thứ ba khác nhau, các lớp học của bạn có thể sẽ ngụ ý một giao diện chung s.a. ISmsGatewayAdapter để hệ thống cốt lõi của bạn độc lập với việc triển khai cụ thể mà bạn sử dụng.

cũng Điều này dẫn đến 'dependecy tiêm' mà là một kỹ thuật để tách thêm lớp học của bạn và được thực hiện tốt nhất bằng cách sử dụng giao diện

0

Tôi thích mã càng nhiều càng tốt với một giao diện. Tôi thích nó bởi vì tôi có thể sử dụng một công cụ như StructureMap để nói "hey ... cho tôi một ví dụ của IWidget" và nó làm việc cho tôi. Nhưng bằng cách sử dụng một công cụ như thế này tôi có thể lập trình hoặc bằng cấu hình xác định trường hợp nào được lấy ra.Điều này có nghĩa là khi tôi thử nghiệm, tôi có thể tải lên một đối tượng giả phù hợp với giao diện, trong môi trường phát triển của tôi, tôi có thể tải lên bộ đệm cục bộ đặc biệt, khi tôi đang trong quá trình sản xuất, tôi có thể tải lên một lớp trang bộ nhớ đệm. chống lại một giao diện cung cấp cho tôi rất nhiều quyền lực hơn là không lập trình chống lại một giao diện. Tốt hơn để có và không cần thiết hơn là cần thiết và không áp dụng ở đây rất tốt. Và nếu bạn vào lập trình SOLID, cách dễ nhất để đạt được nhiều nguyên tắc đó bắt đầu bằng cách lập trình dựa vào giao diện.

4

IMHO, bạn nên cố gắng sử dụng giao diện rất nhiều. Sẽ dễ dàng hơn nếu không sử dụng giao diện bằng cách sử dụng giao diện đó.

Lý do chính của tôi về điều này là vì các giao diện giúp bạn tạo mã dễ kiểm tra hơn. Nếu một hàm tạo lớp hoặc phương thức có lớp bê tông như tham số, thì khó hơn (đặc biệt trong C#, trong đó không có khung mocking miễn phí cho phép các phương thức không ảo của các lớp cụ thể) .

Tôi tin rằng nếu bạn có đối tượng giống DTO, hơn là quá mức cần thiết để sử dụng giao diện, một khi chế nhạo, có thể thậm chí còn khó hơn việc tạo một giao diện.

Nếu bạn không thử nghiệm, sử dụng tiêm phụ thuộc, đảo ngược kiểm soát; và hy vọng không bao giờ làm bất kỳ cái nào trong số này (xin hãy tránh ở đó hehe), sau đó tôi khuyên bạn nên sử dụng giao diện bất cứ khi nào bạn thực sự cần phải triển khai khác nhau hoặc bạn muốn giới hạn mức độ hiển thị của một lớp.

+0

Chúng tôi khuyên bạn nên thực hiện phương pháp tốt nhất để tạo phương thức ảo theo mặc định trên các lớp "cụ thể", có thể mô phỏng hoàn toàn. – womp

+0

Không có khung mocking miễn phí? –

+0

@Steven none cho phép chế nhạo các phương thức không ảo –

0

Theo nguyên tắc chung, tôi nghĩ bạn nên sử dụng quá nhiều giao diện hơn là sử dụng chúng một chút. Err ở phía bên sử dụng giao diện.

Nếu không, YAGNI sẽ áp dụng.

0

Nếu bạn đang sử dụng Visual Studio, sẽ mất khoảng hai giây để đưa lớp học của bạn và trích xuất một giao diện (thông qua trình đơn ngữ cảnh). Sau đó, bạn có thể mã hóa cho giao diện đó và hầu như không tốn thời gian.

Nếu bạn chỉ đang thực hiện một dự án đơn giản, thì nó có thể quá mức cần thiết. Nhưng trên các dự án có kích thước trung bình +, tôi cố gắng viết mã cho các giao diện trong suốt dự án, vì nó sẽ làm cho việc phát triển trong tương lai trở nên dễ dàng hơn.

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