Hợp đồng loại (lớp, giao diện, enum) là, tốt, hợp đồng loại này hứa hẹn tuân thủ.Trạng thái:
- thông số được chấp nhận cho hàm tạo và/hoặc phương pháp thuộc loại này là gì;
- những gì bạn nên và/hoặc không nên mong đợi loại này sẽ làm. Ví dụ, nó có thể nói rằng bạn sẽ mong đợi lớp này là thread-safe hoặc không thread-safe;
- những bất biến được loại này hỗ trợ là gì. Ví dụ, gõ phương thức
addData(float)
của lớp MathAverage
tính giá trị trung bình của đầu vào của nó có thể cho biết rằng mỗi khi bạn gọi tới số add(float)
, bạn sẽ phải gọi tới số MathAverage.getAverage()
để trả lại giá trị trung bình chính xác của đầu vào hiện tại.
- nói chung, loại của bạn có thể chỉ định bất kỳ ràng buộc nào cho tất cả các loại phụ của nó. Ví dụ: có thể nói "không có phương pháp nào trong loại này phải mất hơn 1 giây để thực thi".
Hợp đồng được chỉ định ở dạng tự do trong javadoc loại. Có một số công cụ/thực hành để thực thi các hợp đồng, nhưng chúng bị hạn chế, chính xác bởi vì hợp đồng có thể tùy ý, hoặc thậm chí, tự mâu thuẫn, trong trường hợp lỗi lập trình viên.
Vì phân loại phụ (phân lớp) có thể mở rộng/sửa đổi hành vi của các phương thức siêu kiểu theo cách tùy ý, nó có thể vi phạm một số phần của hợp đồng siêu loại. Ví dụ về điều này sẽ mở rộng HashMap
, chấp nhận các giá trị và khóa null
, với một số triển khai ngăn cấm các giá trị null
trong cuộc gọi đến các phương thức của nó.
khía cạnh quan trọng khác về hợp đồng loại là kiểu phụ có thể có mạnh hợp đồng (bao gồm tập hợp con của các ràng buộc trong hợp đồng loại), nhưng không thể có yếu hợp đồng (bao gồm superset của những hạn chế trong hợp đồng loại của). Ví dụ: nếu phương thức 'doX (n)' của loại của bạn hứa hẹn lấy thời gian O(n)
(tuyến tính), 'doX (n)' trong loại phụ có thể mất O(1)
(không đổi), nhưng không thể mất thời gian O(n^2)
.
Nguồn
2011-12-16 16:29:16
Xem ** thiết kế theo hợp đồng ** [trên Wikipedia] (https://en.wikipedia.org/wiki/Design_by_contract) và [trên c2.com] (http://wiki.c2.com/?DesignByContract). –