Tuần trước, chúng tôi đã tranh cãi gay gắt về việc xử lý null trong lớp dịch vụ của ứng dụng. Câu hỏi là trong bối cảnh .NET, nhưng nó sẽ giống nhau trong Java và nhiều công nghệ khác.
Câu hỏi đặt ra là: bạn có nên luôn kiểm tra null và làm cho mã của bạn hoạt động không có vấn đề gì, hoặc để một bong bóng ngoại lệ xuất hiện khi nhận được null bất ngờ?
Ở một bên, việc kiểm tra null nơi bạn không mong đợi nó (nghĩa là không có giao diện người dùng để xử lý nó), theo tôi, giống như việc viết một khối thử với bắt trống. Bạn chỉ đang che giấu một lỗi. Lỗi có thể là một cái gì đó đã thay đổi trong mã và null hiện là giá trị mong đợi hoặc có một số lỗi khác và ID sai được truyền cho phương thức.
Mặt khác, kiểm tra null có thể là một thói quen tốt nói chung. Hơn nữa, nếu có kiểm tra, ứng dụng có thể tiếp tục hoạt động, chỉ với một phần nhỏ chức năng không có bất kỳ ảnh hưởng nào. Sau đó, khách hàng có thể báo cáo một lỗi nhỏ như "không thể xóa bình luận" thay vì lỗi nghiêm trọng hơn nhiều như "không thể mở trang X".
Bạn thực hành theo cách nào và lập luận của bạn để chống lại cách tiếp cận nào?
Cập nhật:
Tôi muốn thêm một số chi tiết về trường hợp cụ thể của chúng tôi. Chúng tôi đã lấy một số đối tượng từ cơ sở dữ liệu và thực hiện một số xử lý trên chúng (giả sử, xây dựng một bộ sưu tập). Nhà phát triển đã viết mã không lường trước được rằng đối tượng có thể là null nên anh ta không bao gồm bất kỳ kiểm tra nào và khi trang được tải thì có lỗi và toàn bộ trang không tải.
Rõ ràng, trong trường hợp này nên có một kiểm tra. Sau đó, chúng tôi đã tranh luận về việc liệu mọi đối tượng được xử lý có nên được kiểm tra hay không, ngay cả khi nó không bị thiếu và liệu xử lý cuối cùng có nên bị hủy bỏ một cách im lặng hay không.
Lợi ích giả định là trang sẽ tiếp tục hoạt động. Hãy nghĩ về một kết quả tìm kiếm trên Stack Exchange trong các nhóm khác nhau (người dùng, nhận xét, câu hỏi). Phương pháp có thể kiểm tra null và hủy bỏ quá trình xử lý của người dùng (do lỗi là null) nhưng trả về phần "bình luận" và "câu hỏi". Trang sẽ tiếp tục hoạt động ngoại trừ phần "người dùng" sẽ bị thiếu (đó là một lỗi). Chúng ta có nên thất bại sớm và phá vỡ toàn bộ trang hoặc tiếp tục làm việc và chờ ai đó nhận thấy rằng phần "người dùng" bị thiếu?
assert(foo != null, "foo is web control within the repeater, there's no reason to expect it to be null, etc, etc...");