Tôi đã muốn tìm một câu trả lời chắc chắn cho câu hỏi có hay không kiểm tra thời gian chạy để xác thực đầu vào cho các mục đích đảm bảo khách hàng đã bị mắc kẹt trong thỏa thuận thiết kế của họ theo hợp đồng. Ví dụ, hãy xem xét một hàm tạo lớp đơn giản:
class Foo
{
public:
Foo( BarHandle bar )
{
FooHandle handle = GetFooHandle( bar );
if( handle == NULL ) {
throw std::exception( "invalid FooHandle" );
}
}
};
Tôi sẽ tranh luận trong trường hợp này rằng người dùng không nên cố gắng xây dựng Foo
mà không có giá trị BarHandle
. Có vẻ không đúng khi xác minh rằng bar
nó hợp lệ bên trong hàm tạo của Foo
nó. Nếu tôi chỉ đơn giản là tài liệu Foo
của hàm tạo đó yêu cầu một giá trị hợp lệ BarHandle
, thì điều đó có đủ không? Đây có phải là một cách thích hợp để thực thi điều kiện tiên quyết của tôi trong thiết kế bằng hợp đồng?
Cho đến nay, mọi thứ tôi đọc đều có ý kiến trái chiều về điều này. Có vẻ như 50% mọi người sẽ nói để xác minh bar
là hợp lệ, 50% còn lại sẽ nói rằng tôi không nên làm điều đó, ví dụ như xem xét trường hợp người dùng xác minh BarHandle
là đúng, nhưng kiểm tra lần thứ hai (và không cần thiết) cũng đang được thực hiện bên trong nhà Foo
xây dựng của.