Một phần trong chương trình của tôi lấy dữ liệu từ nhiều bảng và cột trong cơ sở dữ liệu của tôi để xử lý. Một số cột có thể là null
, nhưng trong bối cảnh xử lý hiện tại có lỗi.
Điều này "về mặt lý thuyết" sẽ không xảy ra, vì vậy nếu nó chỉ ra dữ liệu xấu hoặc lỗi trong mã. Các lỗi có mức độ nghiêm trọng khác nhau, tùy thuộc vào lĩnh vực nào null
; tức là đối với một số trường, quá trình xử lý phải được dừng lại và ai đó đã thông báo, đối với những trường khác, việc xử lý sẽ được phép tiếp tục và chỉ cần thông báo cho ai đó.
Có bất kỳ nguyên tắc kiến trúc hoặc thiết kế tốt để xử lý các mục hiếm nhưng có thể null
?
Các giải pháp nên có thể thực hiện với Java nhưng tôi đã không sử dụng thẻ vì tôi nghĩ vấn đề này hơi khó hiểu về ngôn ngữ.
Một số suy nghĩ mà tôi đã có bản thân mình:
Sử dụng KHÔNG NULL
Dễ nhất là sử dụng ràng buộc KHÔNG NULL trong cơ sở dữ liệu.
Nhưng điều gì sẽ xảy ra nếu việc chèn dữ liệu ban đầu quan trọng hơn là bước xử lý sau này? Vì vậy, trong trường hợp chèn sẽ đặt một null
bảng vào (vì lỗi hoặc thậm chí là một số lý do hợp lệ), tôi sẽ không muốn chèn không thành công. Giả sử rằng nhiều phần khác của chương trình phụ thuộc vào dữ liệu được chèn, nhưng không phụ thuộc vào cột cụ thể này. Vì vậy, tôi muốn mạo hiểm lỗi trong bước xử lý hiện tại thay vì bước chèn. Đó là lý do tại sao tôi không muốn sử dụng ràng buộc KHÔNG NULL.
Hoàn toàn phụ thuộc vào NullPulumException
Tôi chỉ có thể sử dụng dữ liệu như thể tôi mong đợi nó luôn ở đó (và đó thực sự là trường hợp) và bắt các NPE kết quả ở mức thích hợp (ví dụ: quá trình xử lý mục nhập hiện tại dừng nhưng không phải toàn bộ tiến trình xử lý ). Đây là nguyên tắc "thất bại nhanh" và tôi thường thích nó. Nếu đó là một lỗi ít nhất tôi nhận được một NPE đã đăng nhập.
Nhưng sau đó tôi mất khả năng phân biệt giữa các loại dữ liệu bị thiếu. Ví dụ, đối với một số dữ liệu bị thiếu, tôi có thể loại bỏ nó, nhưng đối với những người khác, quá trình xử lý nên được dừng lại và thông báo cho quản trị viên.
Kiểm tra null
trước mỗi lần truy cập và ném ngoại lệ tùy chỉnh
Các ngoại lệ tùy chỉnh sẽ cho phép tôi quyết định hành động chính xác dựa trên ngoại lệ, vì vậy đây có vẻ là cách để đi.
Nhưng nếu tôi quên kiểm tra nó ở đâu đó thì sao? Ngoài ra, sau đó tôi làm lộn xộn mã của mình bằng các kiểm tra null không bao giờ hoặc hiếm khi được mong đợi (và do đó chắc chắn không phải là một phần của luồng logic kinh doanh).
Nếu tôi chọn đi theo con đường này, mô hình nào phù hợp nhất cho cách tiếp cận?
Bất kỳ suy nghĩ và ý kiến về cách tiếp cận của tôi đều được hoan nghênh. Ngoài ra các giải pháp tốt hơn dưới bất kỳ hình thức nào (mẫu, nguyên tắc, kiến trúc tốt hơn về mã hoặc mô hình của tôi, v.v.).
Biên tập:
Có một ràng buộc khác, đó là tôi đang sử dụng ORM để thực hiện ánh xạ từ DB sang đối tượng kiên trì, do đó, kiểm tra null ở mức đó sẽ không hoạt động (vì các đối tượng tương tự được sử dụng trong các phần mà null không gây hại gì) . Tôi đã thêm điều này bởi vì các câu trả lời được cung cấp cho đến nay cả hai đều đề cập đến tùy chọn này.