Tôi đã suy nghĩ về vấn đề này trong một thời gian và tôi sẽ tò mò muốn có ý kiến từ các nhà phát triển khác.
Tôi có xu hướng có một phong cách lập trình rất phòng thủ. Khối hoặc phương thức điển hình của tôi trông như thế này:
T foo(par1, par2, par3, ...)
{
// Check that all parameters are correct, return undefined (null)
// or throw exception if this is not the case.
// Compute and (possibly) return result.
}
Ngoài ra, trong quá trình tính toán, tôi kiểm tra tất cả các con trỏ trước khi hủy bỏ chúng. Ý tưởng của tôi là, nếu có một số lỗi và một số con trỏ NULL sẽ xuất hiện ở đâu đó, chương trình của tôi sẽ xử lý việc này một cách độc đáo và chỉ cần từ chối tiếp tục tính toán. Tất nhiên nó có thể thông báo về vấn đề với thông báo lỗi trong nhật ký hoặc một số cơ chế khác.
Nói một cách trừu tượng hơn, cách tiếp cận của tôi là
if all input is OK --> compute result
else --> do not compute result, notify problem
Các nhà phát triển khác, trong số họ, một số đồng nghiệp của tôi, sử dụng một chiến lược khác. Ví dụ, họ không kiểm tra con trỏ. Họ cho rằng một đoạn mã phải được cung cấp đầu vào chính xác và nó không chịu trách nhiệm cho những gì xảy ra nếu đầu vào sai. Ngoài ra, nếu một ngoại lệ con trỏ NULL làm hỏng chương trình, một lỗi sẽ được tìm thấy dễ dàng hơn trong quá trình thử nghiệm và có nhiều cơ hội được sửa chữa hơn.
Câu trả lời của tôi cho điều này là bình thường: nhưng nếu lỗi không được tìm thấy trong quá trình thử nghiệm và xuất hiện khi sản phẩm đã được sử dụng bởi khách hàng thì sao? Một cách ưa thích cho các lỗi để hiển thị chính nó là gì? Nó có nên là một chương trình không thực hiện một hành động nhất định, nhưng vẫn có thể tiếp tục hoạt động, hoặc một chương trình gặp sự cố và cần phải được khởi động lại?
Tóm tắt
Bạn có lời khuyên nào trong hai cách tiếp cận để xử lý dữ liệu nhập sai?
Inconsistent input --> no action + notification
hoặc là
Inconsistent input --> undefined behaviour or crash
Biên tập
Cảm ơn câu trả lời và đề xuất. Tôi là một fan hâm mộ của thiết kế theo hợp đồng quá. Nhưng ngay cả khi tôi tin tưởng người đã viết mã gọi phương thức của tôi (có thể là chính tôi), vẫn có thể có lỗi, dẫn đến nhập sai. Vì vậy, cách tiếp cận của tôi là không bao giờ giả sử một phương thức được thông qua đầu vào chính xác.
Ngoài ra, tôi sẽ sử dụng một cơ chế để nắm bắt vấn đề và thông báo về nó. Trên một hệ thống phát triển, nó sẽ mở một hộp thoại để thông báo cho người dùng. Trong một hệ thống sản xuất, nó sẽ chỉ ghi một số thông tin vào nhật ký. Tôi không nghĩ rằng kiểm tra thêm có thể dẫn đến các vấn đề về hiệu suất. Tôi không chắc chắn nếu các xác nhận là đủ, nếu chúng bị tắt trong một hệ thống sản xuất: có thể một số tình huống sẽ xảy ra trong sản xuất không xảy ra trong quá trình thử nghiệm.
Dù sao, tôi thực sự ngạc nhiên khi nhiều người theo cách tiếp cận ngược lại: họ để ứng dụng gặp sự cố "cố ý" vì họ cho rằng điều này sẽ giúp tìm lỗi dễ dàng hơn trong quá trình thử nghiệm.