Tôi là một fan hâm mộ lớn của việc viết các xác nhận, hợp đồng hoặc bất kỳ loại séc nào có sẵn bằng ngôn ngữ tôi đang sử dụng. Một điều làm phiền tôi một chút là tôi không chắc thực tiễn chung là gì để xử lý các kiểm tra trùng lặp.
Ví dụ tình huống: Trước tiên tôi viết hàm sau
void DoSomething( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
//code using obj
}
Sau đó vài giờ tôi viết một hàm khác gọi hàm đầu tiên. Vì mọi thứ vẫn còn mới trong bộ nhớ, tôi quyết định không sao chép hợp đồng, vì tôi biết rằng DoSomething
sẽ kiểm tra một đối tượng null:
void DoSomethingElse( object obj )
{
//no Requires here: DoSomething will do that already
DoSomething( obj );
//code using obj
}
Vấn đề rõ ràng: DoSomethingElse
bây giờ phụ thuộc vào DoSomething
việc xác minh rằng obj không phải là null. Vì vậy, nên DoSomething
bao giờ quyết định không kiểm tra nữa, hoặc nếu tôi quyết định sử dụng chức năng khác thì obj có thể không được kiểm tra nữa. Điều này dẫn tôi đến việc viết triển khai này sau tất cả:
void DoSomethingElse( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
DoSomething( obj );
//code using obj
}
Luôn luôn an toàn, không phải lo lắng, ngoại trừ rằng nếu tình huống phát triển cùng một đối tượng có thể được kiểm tra một số lần và đó là một hình thức sao chép và tất cả chúng ta đều biết rằng điều đó không tốt lắm.
Thực tiễn phổ biến nhất cho tình huống như thế này là gì?
ArgumentBullException
? Đó là một cái mới :)