2012-10-20 21 views
18

Vì vậy, ổi là đơn giản nhưng hữu ích Preconditions để kiểm tra các đối số phương thức. Nhưng tôi đoán nó sẽ là hợp lý để có một lớp "Postconditions" quá. Hoặc là nó chỉ vì java cung cấp xác nhận?Tại sao Guava không có postconditions? Tôi có thể sử dụng cái gì?

Vì một lớp như thế này không tồn tại, cách thay thế "tốt nhất" (thực hành) là gì để kiểm tra điều kiện trước khi toán học trả về?

+1

sử dụng kiểm tra đơn vị hoặc câu lệnh 'assert' của Java – Cephalopod

Trả lời

12

Tôi sẽ sử dụng từ khóa Java assert trong chính phương pháp để mã hóa điều kiện sau.

Kiểm tra đơn vị hoặc Postcondition?

Kiểm tra đơn vị và postconditions phục vụ các mục đích khác nhau.

Xác nhận trong thử nghiệm đơn vị cung cấp một kiểm tra về kết quả của phương thức cho một vector nhập. Đó là một oracle xác định kết quả mong đợi cho một trường hợp cụ thể.

An asserttrong phương pháp chính nó xác minh rằng lưu giữ sau điều kiện. Nó là một oracle xác định (tài sản của) kết quả mong đợi cho tất cả các trường hợp có thể. Như một điều kiện tiên quyết như một oracle kết hợp tốt với các kỹ thuật kiểm tra tự động, trong đó nó rất dễ dàng để tạo ra đầu vào, nhưng khó để tạo ra giá trị kỳ vọng cho mỗi đầu vào.

Điều kiện hậu duệ?

Vì sao Guava có lớp Điều kiện tiên quyết, nhưng không có lớp Postcondition, đây là sự hiểu biết của tôi.

Điều kiện tiên quyết hiệu quả cung cấp một số viết tắt cho các tình huống phổ biến mà bạn muốn ném một loại ngoại lệ cụ thể (đối số bất hợp pháp, con trỏ rỗng, chỉ mục ngoài giới hạn, trạng thái bất hợp pháp) dựa trên đầu vào của phương thức hoặc trạng thái của đối tượng.

Đối với postconditions, có ít trường hợp phổ biến hơn như vậy. Do đó có ít cần phải cung cấp một cách viết tắt ném các loại ngoại lệ cụ thể. Một postcondition không giống như một HTTP 500 "Internal Server Error" - tất cả chúng ta biết một cái gì đó đã đi sai thực hiện phương pháp của chúng tôi.

(Lưu ý rằng khái niệm điều kiện tiên quyết của Guava hoàn toàn khác với điều kiện tinh khiết của design-by-contract, trong đó không có đảm bảo nếu điều kiện tiên quyết không được đáp ứng - thậm chí không có ngoại lệ hợp lý. khả năng làm cho API công khai bảo vệ hơn).

16

Điều kiện kiểm tra bài đăng sẽ không cần thiết. Cách chúng tôi kiểm tra các điều kiện sau trong java là unit testing.

Với thử nghiệm đơn vị, chúng tôi đảm bảo rằng đối với một đầu vào cho trước, chúng tôi có được kết quả dự đoán được. Với Preconditions, chúng tôi có thể xác minh rằng chúng tôi có đầu vào hợp lệ và do đó đầu ra đã được đảm bảo bởi các thử nghiệm.

+1

Thử nghiệm đơn vị phục vụ chủ yếu là thử nghiệm giao diện công khai. Vì vậy, thử nghiệm các phương pháp riêng tư chẳng hạn sẽ không được "thuận tiện". Trong trường hợp đó, tôi đoán một số hình thức hậu kỳ sẽ có ích. Có vẻ như tôi phải sử dụng java "khẳng định" bản địa. –

+1

Một câu hỏi là * nếu * bạn [nên] (http://stackoverflow.com/questions/3299405/how-should-i-test-private-methods-in-java#answer-3299443) thử nghiệm các phương thức 'riêng tư 'trong nơi đầu tiên. Một tùy chọn là thay đổi chế độ hiển thị, ví dụ: sử dụng 'được bảo vệ'. –

+0

Tôi đã có cuộc thảo luận này trước khi http://programmers.stackexchange.com/questions/153350/are-too-many-assertions-code-smell –

9

Điều kiện tiên quyết và hậu điều kiện phục vụ các mục đích khác nhau.

Điều kiện tiên quyết kiểm tra đầu vào, không nằm dưới sự kiểm soát của phương pháp; postconditions kiểm tra đầu ra, đó là. Vì vậy, chúng không có ý nghĩa bên trong chính phương thức đó, nhưng chỉ là mã bên ngoài để kiểm tra phương thức.

Tuy nhiên, nếu bạn thực sự muốn đưa những xác nhận như vậy vào mã của mình, Điều kiện tiên quyết của Guava sẽ phục vụ khá tốt cho điều đó, ngay cả khi đó không phải là mục đích của chúng.

+0

Lỗi báo cáo Điều kiện tiên quyết về điều kiện ngoại lệ cho khách hàng (người dùng phương pháp) biết khách hàng đó đã làm gì sai (đối số bất hợp pháp, con trỏ null, chỉ mục ngoài giới hạn, trạng thái bất hợp pháp). Như bạn nói, một điều kiện không thành công, ngược lại, là một dấu hiệu cho thấy có điều gì đó sai trong phương thức/máy chủ. Nhiều khả năng, điều đó sẽ yêu cầu các ngoại lệ khác nhau được ném ra, hiển thị việc sử dụng Guava.Preconditions ít hữu ích hơn trong việc kiểm tra postconditions. – avandeursen

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