2010-07-14 88 views
5

Tôi thường có phân cấp cuộc gọi trong đó tất cả các phương thức đều cần các tham số giống nhau. Nếu tôi không muốn đặt chúng ở cấp độ cá thể (thành viên của lớp) thì tôi luôn hỏi tôi nếu nó có ý nghĩa để kiểm tra tính hợp lệ của chúng trong mỗi phương pháp.Kiểm tra tham số lặp lại trong các hàm

Ví dụ:

public void MethodA(object o){ 
    if(null == o){ 
     throw new ArgumentNullException("o"); 
    } 
    // Do some thing unrelated to o 

    MethodB(o); 

    // Do some thing unrelated to o 

} 

public void MethodB(object o){ 
    if(null == o){ 
     throw new ArgumentNullException("o"); 
    } 
    // Do something with o 
} 

Nếu Method A sử dụng các tham số, sau đó rõ ràng của nó, tôi phải kiểm tra tính hợp lệ ở đó và cũng trong MethdoB. Nhưng miễn là MethodA không làm gì hơn với o hơn là cho nó vào MethodB, là thực hành tốt để kiểm tra tính hợp lệ cũng trong MethodA.

Vị trí kiểm tra cũng có trong MethodA có thể là ngoại lệ ném trong phương thức mà callee đã gọi, điều đó thật tuyệt, nhưng có cần thiết không? Các cuộc gọi ngăn xếp sẽ nhà nước này cũng có. Có lẽ ý nghĩa của nó trong công cộng, nội bộ, được bảo vệ nhưng không theo phương pháp riêng tư?

Tôi đã kiểm tra null làm ví dụ, nhưng cũng xác thực chỉ mục hoặc xác thực phạm vi nằm trong câu hỏi tự, tuy nhiên tôi nghĩ có những hạn chế do sự nguy hiểm của mã dự phòng. Bạn nghĩ sao?

CẬP NHẬT

Qua câu trả lời của AakashM Tôi đã thấy rằng tôi đã để ít chính xác. MethodA không chỉ các cuộc gọi MethodB, nó cũng có những thứ khác nhưng không liên quan đến o. Tôi đã thêm một ví dụ để làm rõ điều này. Cảm ơn AakashM.

Trả lời

9

Mã của Steve McConnell Hoàn thành các cuộc đàm phán về khái niệm 'chướng ngại vật' - một bức tường phòng thủ bên ngoài dữ liệu không tin cậy và bên trong dữ liệu được tin cậy. Dữ liệu muốn nhập chướng ngại vật phải trải qua quá trình xác nhận, nhưng trong chướng ngại vật, dữ liệu được tự do di chuyển xung quanh untrammeled bằng mã xác nhận.

Nếu bạn có thể áp đặt số lượng cấu trúc và phân lớp này trong dự án của bạn, và gắn bó với nó, nó làm cho mã rào cản bên trong có ít nghi lễ và bản chất hơn. Nhưng nó chỉ mất một phương pháp để kêu gọi chướng ngại vật cho mọi thứ đi sai.

Trong ví dụ của bạn, MethodBpublic. Điều này có nghĩa là bạn không có đảm bảo tự động trong tương lai rằng MethodA sẽ là người gọi duy nhất của nó - tôi sẽ nói do đó mã xác thực của nó sẽ vẫn còn. Tuy nhiên, nếu nó là private đối với lớp học, bạn có thể đưa ra một đối số để xóa nó.

Đối với MethodA, nếu thực tế thì không có gì là nhiều hơn số gọi MethodB, không nên tồn tại. Nếu nó là một nhánh để mở rộng trong tương lai, và tại một số điểm nó sẽ làm một cái gì đó với o, sau đó mã xác nhận của nó cũng nên vẫn còn.

1

Tôi nghĩ bạn nên đảm bảo nó khi giá trị đầu vào được tạo (trách nhiệm của người gọi). Điều này làm việc nếu lớp chỉ được sử dụng bởi các máy khách nội bộ. Nếu đó là một phần của API công khai, thì bạn không thể kiểm tra chi tiết, nhưng bạn có thể muốn xác định chúng, như được đề xuất trong các câu trả lời khác.

Với mục đích thử nghiệm, bạn cũng có thể sử dụng Debug.Assert(o != null) trong cả hai phương pháp và séc sẽ bị xóa khỏi mã phát hành, nếu hiệu suất là sự cố.

+0

Trường hợp giá trị đầu vào được tạo ra - có nghĩa là điều này ở người gọi? Ví dụ tôi đã ghi nhớ trong ví dụ của tôi là, phương pháp A và B đều có thể truy cập từ bên ngoài lớp và hợp pháp để gọi một trong cả hai (MethodA thực hiện tương tự cộng một chút so với MethodB) – HCL

+0

Yep. Xem chỉnh sửa của tôi. – Mau

1

Tôi không xem xét xác minh tham số "mã dự phòng". Bạn cần phải bảo vệ tất cả các điểm vào bên ngoài. Nếu bạn có phương thức private như vậy mà bạn biết bởi dòng thời gian nhận được rằng tất cả các tham số của nó sẽ hợp lệ thì bạn có thể có một trường hợp, nhưng đối với phương thức public (và thậm chí protected) bạn thực sự không.

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