Khi tôi có nhiều dữ liệu cần được xác thực, tôi có nên tạo một lớp mới cho mục đích xác thực duy nhất hay tôi nên gắn bó với xác thực trong phương thức?
Ví dụ cụ thể của tôi dự tính một giải đấu và một lớp sự kiện / thể loại: Tournament
và Event
, mô hình một giải đấu thể thao và mỗi giải đấu có một hoặc nhiều thể loại.
Có tất cả mọi thứ để xác nhận trong các lớp này: người chơi nên trống, nên là duy nhất, số lượng trận đấu mà mỗi người chơi nên chơi, số lượng người chơi mỗi trận đấu, trận đấu được xác định trước và một vvetera thực sự lớn bao gồm nhiều hơn nữa quy tắc phức tạp.
Ngoài ra còn có một số phần tôi cần xác thực toàn bộ, như cách các lớp tích hợp với nhau. Ví dụ: xác thực đơn nhất của một Player
có thể chỉ tốt, nhưng nếu một sự kiện có cùng một người chơi hai lần, đó là lỗi xác thực.
Vậy làm thế nào về điều này?: Tôi quên hoàn toàn mọi kiểm tra trước khi sử dụng setters của các lớp mô hình và các phương thức tương tự để thêm dữ liệu và thay vào đó tôi để các lớp xác nhận xử lý việc đó.
Vì vậy, chúng ta sẽ có một cái gì đó giống như EventValidator
với Event
tư cách là một thành viên và một validate()
phương thức xác nhận toàn bộ đối tượng, cộng với các phương thức số ít để xác thực các quy tắc của tất cả các thành viên.
Sau đó, trước khi khởi tạo một đối tượng hợp lệ, tôi sẽ thực hiện xác nhận để ngăn chặn các giá trị bất hợp pháp.
Thiết kế của tôi có đúng không? Tôi có nên làm một cái gì đó khác nhau?
Ngoài ra, tôi có nên sử dụng các phương thức xác nhận trả về boolean không? Hoặc chỉ cần ném một ngoại lệ nếu xác nhận thất bại? Đối với tôi, dường như tùy chọn tốt nhất sẽ là các phương thức trả về boolean và ném ngoại lệ khi đối tượng được khởi tạo, ví dụ:
public Event() {
EventValidator eventValidator = new EventValidator(this);
if (!eventValidator.validate()) {
// show error messages with methods defined in the validator
throw new Exception(); // what type of exception would be best? should I create custom ones?
}
}