2012-03-30 39 views
7

Tôi biết và hiểu giá trị của giao diện trong Java. Bạn mã vào giao diện, và sau đó bạn có thể thay đổi triển khai của bạn mà không cần phải thay đổi bất kỳ mã nào bằng cách sử dụng giao diện. Thường thì thuật ngữ "hợp đồng" được sử dụng trong kết nối với các giao diện. Cách tôi hiểu nó là giao diện xác định "hợp đồng" giữa ứng dụng và việc thực hiện.Giao diện Java - Chính xác trong hợp đồng là gì?

Vì vậy, khi tôi tạo triển khai, tôi phải hoàn thành hợp đồng. Câu hỏi của tôi là, chính xác trong hợp đồng mà tôi phải thực hiện là gì?

Rõ ràng, ở mức tối thiểu bạn phải cung cấp các phương thức có cùng chữ ký với giao diện. Mã sẽ không biên dịch theo cách khác. Đó có phải là tất cả "hợp đồng" đòi hỏi phải không? Có vẻ như sẽ có nhiều hơn.

Ví dụ: tôi đã đọc các bài báo tranh luận về giá trị của thử nghiệm cho giao diện so với việc triển khai thử nghiệm cụ thể hoặc thực hiện cả hai. Tôi thấy giá trị lớn trong việc kiểm tra giao diện để bạn biết đầu vào nào có kết quả mong đợi. Dường như với tôi rằng điều này cũng sẽ là một phần của giao diện "hợp đồng". Mỗi lần thực hiện giao diện sẽ tạo ra cùng một kết quả đầu ra từ cùng một đầu vào. Rõ ràng không có cách nào để thực thi hợp đồng này trong mã, nhưng nó có thể được thực thi thông qua các trường hợp thử nghiệm. Tôi có sai trong suy nghĩ của tôi ở đây không?

Cuối cùng, những tác dụng phụ mà triển khai có? Ở đây, tôi chủ yếu nói về bất kỳ sự kiên trì nào có thể xảy ra như là một phần của việc thực hiện. Nói rằng tôi có một thực hiện đó là tiết kiệm một số hồ sơ để DB trong khi nó preforms hoạt động. Điều này bằng cách nào đó sẽ là một phần của giao diện "hợp đồng"? Nếu vậy, làm thế nào bạn có thể thực thi hợp đồng này? Từ cấp độ giao diện, tôi không có ý tưởng thực hiện những gì đang thực sự làm. Tất cả những gì tôi biết là tôi cung cấp cho nó đầu vào, và nó cho tôi một đầu ra, mà tôi có thể kiểm tra. Có bất kỳ sự kiên trì nào xảy ra cũng được coi là "đầu ra" không? Nếu vậy, tôi chỉ không thấy làm thế nào điều này có thể được kiểm tra và thi hành. Tôi là người đề xuất về sự thiếu hiểu biết kiên trì, vì vậy tôi có thể biết rằng một số nội dung nào đó phải được giữ nguyên, nhưng tôi không biết cách giữ nguyên trạng thái. Vì vậy, tôi chỉ không làm thế nào để nói khi một cái gì đó thực sự tồn tại. Nó có thể đơn giản nếu giao diện của bạn có một số hoạt động CRUD đơn giản, nhưng tôi muốn suy nghĩ về các giao diện phức tạp hơn.

Tôi hy vọng câu hỏi của tôi có ý nghĩa và ai đó có thể cung cấp một số phản hồi tốt. Tôi muốn thảo luận về điều này nói chung, nhưng tôi có thể cung cấp một ví dụ cụ thể nếu nó không rõ ràng những gì tôi đang nói về.

+0

Để kiểm tra 'hợp đồng', hãy viết các bài kiểm tra đơn vị cho giao diện, mà mọi triển khai đều phải gọi trước (có cách để thực hiện việc này). Nếu có các phần cụ thể cho việc triển khai cần phải được kiểm tra, điều đó sẽ xuất hiện tiếp theo. Nói chung, bạn muốn tất cả các bài kiểm tra có hiệu quả phụ ít nhất có thể. Vì vậy, khi thử nghiệm các công cụ kiên trì, bạn thường sử dụng các đối tượng giả thay cho các đối tượng tồn tại (Thực tế); từ đoạn mã gọi, nó _is_ một đối tượng tồn tại - nó không bao giờ kết thúc trong một cơ sở dữ liệu. –

+0

http://en.wikipedia.org/wiki/Design_by_contract tìm kiếm "hợp đồng cho mỗi phương pháp thường sẽ chứa các thông tin sau đây ..." Không áp dụng nghiêm ngặt cho Java, nhưng vâng ... – Corbin

+2

tài liệu. Đó là những gì xác định rất nhiều thông tin bổ sung về hợp đồng của một giao diện cụ thể. Lưu ý: "Mọi việc triển khai giao diện sẽ tạo ra cùng một kết quả đầu ra từ cùng một đầu vào". sẽ không đúng đối với một giao diện IBook và một GetPage (1) gọi nếu mỗi thực hiện đại diện cho một cuốn sách khác nhau ... –

Trả lời

2

Tôi nghĩ bạn đang thực hiện một thỏa thuận quá lớn về thuật ngữ "hợp đồng".

"Eiffel" có triết lý "thiết kế theo hợp đồng" rất cụ thể. Cá nhân, tôi nghĩ rằng các ngôn ngữ khác sẽ được hưởng lợi từ một cái gì đó tương tự.

Không chính thức, bạn chắc chắn có thể nghĩ về "giao diện" của Java như là một "hợp đồng". Định nghĩa của bạn về giao diện Java chắc chắn là tốt:

ở mức tối thiểu bạn phải cung cấp các phương thức có cùng chữ ký như giao diện. Mã sẽ không biên dịch theo cách khác.

Q: Đó có phải là tất cả "hợp đồng" đòi hỏi phải không?

A: Có thể là không. Tất cả phụ thuộc vào cách bạn xác định "hợp đồng";)

Nhưng, IMHO, giao diện Java là một tính năng rõ ràng hơn so với tính kinh dị của C++ "đa thừa kế".Và một trong những động lực chính đằng sau cả hai là hỗ trợ "mixins":

Tương tự, Java intefaces cũng cung cấp giải pháp loại gọn, tương đối đơn giản để hỗ trợ "callbacks".

Đề xuất cuối cùng: hãy xem xét sự khác biệt giữa "giao diện" và "lớp trừu tượng". Điều này cũng có thể cung cấp cho bạn cái nhìn sâu sắc thêm vào Java giao diện, và làm thế nào bạn có thể sử dụng chúng một cách hiệu quả trong mã của riêng bạn:

Interface vs Abstract Class (general OO)

+0

Làm thế nào để các giao diện Java nhận ra khái niệm về mixin, thấy rằng chúng không cung cấp thực hiện? –

+0

Tôi đoán bài đăng này bắt nguồn từ việc cố gắng viết các trường hợp thử nghiệm cho giao diện của tôi. Ở cấp độ cao nhất, câu hỏi của tôi có thể giống như những gì các bài kiểm tra giao diện thực sự nên kiểm tra? Chỉ trả về giá trị dựa trên các đối số được truyền vào? Có thể thay đổi đối tượng được truyền vào? Nên có bất kỳ phần nào của thử nghiệm để đảm bảo hành vi nhất định được thực hiện? – dnc253

2

Tôi nghĩ rằng "hợp đồng" và "Giao diện" có rất ít điểm chung.

Giao diện giống như cửa. Một cánh cửa có thể vượt qua con người điển hình, chứ không phải voi, hươu cao cổ hoặc xe hơi.

Hợp đồng là khi bạn có thể đảm bảo rằng thông qua cửa chỉ nữ, nam hoặc nhà phát triển phần mềm mới đến.

Vì vậy, một hợp đồng xác định HÀNH VI trong khi giao diện định nghĩa mà thông tin được truyền

+0

OK, đó là cách làm rõ.Tôi đoán câu hỏi của tôi cho điều đó sẽ là, làm thế nào để thực thi hành vi? Điều đó chỉ có thể xảy ra khi thử nghiệm các triển khai cụ thể? Hoặc bạn có thể thực thi giao diện "hành vi"? – dnc253

0

Vì vậy, một hợp đồng là phương pháp chữ ký + bất kỳ tài liệu liên quan đến chức năng/lớp. Một takeaway từ này là một giao diện không có nghĩa là điều tương tự như từ khóa java interface. Giao diện là bất kỳ thứ gì cho phép bạn tương tác với một hệ thống khác. Vì vậy, để vấn đề làm thế nào để bạn thực hiện các hợp đồng của một hàm tuyên bố như vậy:

/** Throws IllegalArgumentException if s is null.  
Converts the input <b>s</b> into an {@link Integer} */ 
    function go(String s); 

Bạn sẽ cần phải viết một thực hiện như sau:

function go(String s) 
{ 
    if(null == s) throw new IllegalArgumentException(); 
    int i = Integer.parseInt(s); 
} 

giả tạo có, nhưng điều này nên giải thích như thế nào để thực hiện một hợp đồng và tuân theo nó.

+0

Trong trường hợp đơn giản này, thật dễ dàng để kiểm tra và đảm bảo hợp đồng được đáp ứng. Trong trường hợp kiên trì, có vẻ như sẽ khó khăn hơn. Điều này cũng có nghĩa là bạn sẽ ghi lại những gì sự kiên trì cần phải xảy ra? – dnc253

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