2008-09-21 30 views
10

Có thể vượt qua giao diện không? khi thiết kế một hệ thống ngay bây giờ, tôi sẽ bắt đầu từ các giao diện và dần dần viết các bài kiểm tra đơn vị cùng với các giao diện cho đến khi tôi có một mô hình hoạt động tốt .. Tôi sẽ chuyển sang viết một số lớp cụ thể và thiết lập các bài kiểm tra đơn vị chống lại các ...NET - Bạn có thể trên giao diện hay không và khi nào bạn không nên giao diện

Bây giờ tôi là một người yêu giao diện, tôi thường sẽ chỉ kết thúc/trả lại nguyên thủy hoặc giao diện xung quanh khi tôi kiểm soát mã .. cho đến nay tôi thấy điều này là lý tưởng, bạn có thể dễ dàng điều chỉnh và nâng cao một hệ thống nói chung mà không ảnh hưởng đến các hệ thống phụ thuộc.

Tôi rõ ràng không cần phải bán lý do sử dụng giao diện, nhưng tôi tự hỏi liệu nó có quá tải để giao tiếp mọi thứ hay không, ps. Tôi không nói về giao diện trống như trong một cái gì đó điên rồ như:

interface IStringCollection : ICollection<string> 
{ 
} 

Tôi đang nói nhiều cái gì đó như:

interface ISomethingProvider 
{ 
    ISomething Provide(ISomethingOptions options); 
} 

Đây có phải là thực sự trên đầu? lý do của tôi là bất kỳ loại nào có thể đạt được từ interfacing tại một số điểm .. và vấn đề thực sự duy nhất tôi đã có là tôi đã phải tìm hiểu những gì tôi nghĩ là một cách tốt hơn để thiết kế các lớp học, như bạn không có daft tương tác và 'hack' đang diễn ra.

Rất thích phản hồi của bạn về nếu điều này là một timebomb, và khi bạn quyết định giao diện vs không ..

PS này là không thực sự rất nhiều về cách viết giao diện.

Trả lời

1

Nó có thể là một nỗi đau thực sự để làm việc ra các cuộc gọi stack cuối cùng trước khi bạn bước với trình gỡ rối nếu bạn có giao diện ở khắp mọi nơi. Tôi có xu hướng thích giao diện chỉ khi:

  1. bạn cần thành viên trong nhóm để thống nhất về việc ai nên làm gì trước khi họ bắt đầu mã hóa - một giao diện sau đó tài liệu biên giới chính xác
  2. khi bạn thực sự cần một giao diện để giải quyết vấn đề , vì vậy ít nhất hai hiện thực mà không mở rộng nhau
  3. bạn mong đợi trường hợp 2
1

tôi thấy rằng các giao diện phức tạp thiết kế, đặc biệt là cho những người khác để cowork trên công cụ của bạn. Đừng hiểu lầm tôi, giao diện rất tuyệt vời cho rất nhiều thứ, nhưng chủ yếu là nếu bạn muốn hai hoặc nhiều lớp để chia sẻ một giao diện chung.

Nếu bạn thấy mình trong tình huống mà bạn đột nhiên cần một giao diện, cấu trúc lại với các công cụ như Resharper là một làn gió :)

4

Như với bất cứ điều gì khác - sử dụng với điều độ và khi cần thiết. Hãy tự hỏi mình "Bạn sẽ cần nó?".

5

Giao diện mô tả hợp đồng cho hành vi. Nếu bạn cần giải quyết một số tập hợp các đối tượng theo một mẫu hành vi, các giao diện là hữu ích, không quá nhiều nếu bạn chỉ mô tả cấu trúc của các đối tượng.Tôi nghĩ bạn cần phải có một lý do chính đáng để sử dụng chúng, chẳng hạn như sử dụng một nhà máy tạo ra các đối tượng liên quan đến hành vi hoặc thiết lập một hợp đồng hành vi cho một phần của thư viện. Sử dụng giao diện một cách vô mục đích có thể làm cho một thư viện khó đọc/hiểu/duy trì.

1

Đây không chỉ là một điều .NET. Vấn đề tương tự cũng xảy ra trong Java khá thường xuyên.

Trừ khi đó là yêu cầu hoàn toàn rõ ràng, tôi bỏ phiếu cho việc không sử dụng giao diện và chỉ đơn giản là tái cấu trúc khi nhu cầu trở nên rõ ràng.

Cách tiếp cận thực dụng nói rằng chỉ cần thực hiện điều đơn giản nhất có thể làm việc và không bị bắt trong các phi hành gia kiến ​​trúc.

5

Trong ngắn hạn, bạn có thể giao diện trên một dự án. Hãy xem xét khi tình hình thực sự yêu cầu một lớp cơ sở trừu tượng và một giao diện, trong khi cả hai đều giống nhau có những lợi thế riêng biệt để sử dụng cả hai See Here. Thông thường tôi đã nhận thấy rằng mọi người sử dụng giao diện khi họ thực sự nên sử dụng lớp cơ sở trừu tượng. Từ một giao diện quan điểm OO nên được sử dụng để liệt kê hành vi phổ biến có thể trải rộng các lớp khác nhau. Ví dụ, bạn có thể có một giao diện IMove với một phương thức gọi là Move(). Bây giờ hãy tưởng tượng bạn có một lớp Máy bay, Xe hơi, Người và Côn trùng. Máy bay và xe hơi có thể kế thừa từ một lớp xe trừu tượng nhưng vẫn cần phải sử dụng IMove và như vậy sẽ côn trùng và người nhưng tất cả họ sẽ thực hiện di chuyển khác nhau. Tôi đã nhận thấy, tôi tự đưa vào, mọi người có xu hướng sử dụng Giao diện để "nhóm" các lớp với nhau khi thực sự nên được xử lý bởi một lớp cơ sở.

+1

Đúng, nếu bạn thấy mình viết về cơ bản cùng một phương pháp để triển khai giao diện trên hai lớp, bạn cần một lớp cơ sở trừu tượng. –

1

Tôi có xu hướng không sử dụng quá nhiều giao diện cho mục đích thử nghiệm. Tôi thà tạo ra một giá trị riêng và/hoặc loại bỏ các lớp và/hoặc các phương thức tạm thời trong khi xây dựng và thử nghiệm cho đến khi tôi đang xây dựng các đối tượng và thử nghiệm khác mà cuối cùng sẽ thực hiện những gì tôi cần. Đôi khi nó là một nỗi đau trong mông để rack thay đổi của bạn theo cách đó, nhưng các xét nghiệm của bạn sẽ cho bạn biết khi bạn quên thay đổi một cái gì đó.

3

Có thể giao diện quá mức. Quy tắc mà tôi làm việc là nếu bạn có một giao diện trong ứng dụng của mình, bạn cần phải có ít nhất hai lớp thực hiện nó (hoặc có một kỳ vọng hợp lý rằng bạn sẽ bổ sung thêm các lớp triển khai trong tương lai gần).

Nếu bạn cần tạo các đối tượng giả để kiểm tra, thì có lớp mô phỏng và lớp thực hiện thực hiện giao diện chung là lý do hợp lệ để sử dụng giao diện.

Tôi sẽ không khuyên bạn nên tự động sử dụng giao diện cho mọi thứ trong ứng dụng của bạn, đặc biệt là vì một lớp đơn thường có thể dễ dàng được cấu trúc lại thành giao diện nếu cần.

+1

Vẻ đẹp của các công cụ tái cấu trúc hiện đại là bạn không cần phải bắt đầu bằng cách sử dụng một giao diện để có sự linh hoạt để sử dụng một trong tương lai. –

2

Bất cứ khi nào tôi nhìn thấy hoặc nghe ai đó nói này

Giao diện mô tả một hợp đồng cho hành vi

Tôi biết tôi đã tìm thấy một người không hiểu giao diện.

Giao diện không thể làm điều đó. Nó là không thể. Giao diện không quy định, buộc hoặc theo bất kỳ cách nào hạn chế hoạt động.

Giao diện mô tả hợp đồng cho giao diện , do đó tên. Họ không có hành vi.

Bạn có thể hy vọng rằng tên bạn cung cấp cho các phương thức của giao diện sẽ hàm ý hành vi bắt buộc đối với bất kỳ ai đang triển khai nó, nhưng không yêu cầu họ làm như vậy. Không có hợp đồng hành vi, cũng không bao giờ có thể có một.

Nếu bạn yêu cầu một loại hành vi nhất định thì bạn phải sử dụng các lớp để thực thi nó (ví dụ như với mẫu Khuôn mẫu) - đó là nơi mà tất cả các hành vi là.

Giao diện thường xuyên bị lạm dụng như một cấu trúc thiết kế và một trong những lý do là do niềm tin rộng rãi vào sai lầm này.

+0

Tôi cho rằng giao diện _documented_ có thể mô tả một hợp đồng cho hành vi. Bạn có thể mô tả một hợp đồng mà không nhất thiết phải thực thi hợp đồng; nhà phát triển vẫn có trách nhiệm tôn trọng tài liệu. –

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