Tôi thường gặp phải vấn đề này, đặc biệt là trong Java, ngay cả khi tôi nghĩ đó là vấn đề OOP chung. Đó là: đưa ra một ngoại lệ cho thấy một vấn đề thiết kế.
Giả sử rằng tôi có một lớp có một String name
trường và một String surname
trường.
Sau đó, nó sử dụng các trường đó để soạn tên đầy đủ của một người để hiển thị nó trên một loại tài liệu, giả sử một hóa đơn.
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
Bây giờ tôi muốn tăng cường hành vi của lớp mình bằng cách đưa ra một lỗi nếu displayCompleteNameOnInvoice
được gọi trước khi tên được gán. Có vẻ là một ý tưởng tốt, phải không?
Tôi có thể thêm một mã tăng ngoại lệ vào getCompleteName
phương thức. Nhưng theo cách này, tôi đang vi phạm hợp đồng 'ngầm' với người dùng lớp; nói chung, các getters không được phép ném ngoại lệ nếu giá trị của chúng không được đặt. Ok, đây không phải là một getter tiêu chuẩn vì nó không trả về một trường đơn lẻ, nhưng theo quan điểm của người dùng, sự khác biệt có thể quá tinh tế để nghĩ về nó.
Hoặc tôi có thể ném ngoại lệ từ bên trong displayCompleteNameOnInvoice
. Nhưng để làm như vậy tôi nên kiểm tra trực tiếp name
hoặc surname
các trường và làm như vậy tôi sẽ vi phạm sự trừu tượng được đại diện bởi getCompleteName
. Phương pháp này có trách nhiệm kiểm tra và tạo tên đầy đủ. Nó thậm chí có thể quyết định, dựa trên quyết định về dữ liệu khác, trong một số trường hợp, nó là đủ surname
.
Vì vậy, khả năng duy nhất dường như thay đổi ngữ nghĩa của phương thức getCompleteName
thành composeCompleteName
, điều đó cho thấy một hành vi 'chủ động' hơn và, với nó, khả năng đưa ra một ngoại lệ.
Đây có phải là giải pháp thiết kế tốt hơn? Tôi luôn tìm kiếm sự cân bằng tốt nhất giữa sự đơn giản và chính xác. Có một tài liệu tham khảo thiết kế cho vấn đề này?
displayCompleteNameOnInvoice
chỉ có thể ném một ngoại lệ nếu getCompleteName
trả về null
, phải không?