Hoàn toàn không có lý do để trở lại true
thành công nếu bạn không trở lại false
thất bại. Mã khách hàng nên trông như thế nào?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
Trong trường hợp này, người gọi cần một khối chặn thử dù sao, nhưng sau đó anh ta có thể viết tốt hơn:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
Vì vậy, true
giá trị trả lại là hoàn toàn không phù hợp cho người gọi. Vì vậy, chỉ cần giữ phương pháp void
.
Nói chung, có ba cách để thiết kế chế độ failre.
- Trả về đúng / sai
- Sử dụng
void
, ném (kiểm tra) ngoại lệ
- trả về một đối tượng kết quả trung gian .
Trả lại true
/false
Điều này được sử dụng trong một số API kiểu cũ, chủ yếu là kiểu c. Nhược điểm là obviuos, bạn không biết điều gì đã xảy ra. PHP làm điều này khá thường xuyên, dẫn đến mã như thế này:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
Trong bối cảnh đa luồng, điều này thậm chí còn tồi tệ hơn.
Ném (kiểm tra) ngoại lệ
Đây là một cách tốt đẹp để làm điều đó. Tại một số điểm, bạn có thể mong đợi thất bại. Java thực hiện điều này với các socket. Giả định cơ bản là một cuộc gọi sẽ thành công, nhưng mọi người đều biết rằng một số thao tác có thể thất bại. Kết nối ổ cắm là một trong số đó. Vì vậy, người gọi bị buộc phải xử lý các thất bại. Đây là một thiết kế đẹp, bởi vì nó đảm bảo người gọi thực sự xử lý được lỗi và cung cấp cho người gọi một cách thanh lịch để đối phó với thất bại.
Trả về đối tượng kết quả
Đây là một cách tốt đẹp khác để xử lý này. Nó thường được sử dụng để phân tích cú pháp hoặc đơn giản là những thứ cần được xác nhận.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
Đẹp, logic sạch cho người gọi là tốt.
Có một chút tranh luận khi nào nên sử dụng trường hợp thứ hai và khi nào nên sử dụng trường hợp thứ ba. Một số người tin rằng các ngoại lệ nên là ngoại lệ và bạn không nên thiết kế với khả năng ngoại lệ trong tâm trí, và sẽ luôn luôn sử dụng các tùy chọn thứ ba. Điều đó tốt Nhưng chúng tôi đã kiểm tra các ngoại lệ trong Java, vì vậy tôi thấy không có lý do gì để không sử dụng chúng. Tôi sử dụng các mức mở rộng đã kiểm tra khi giả định cơ bản là cuộc gọi sẽ thành công (như sử dụng ổ cắm), nhưng không thể thực hiện được và tôi sử dụng tùy chọn thứ ba khi cuộc gọi không rõ ràng nên sẽ thực hiện (như xác thực dữ liệu). Nhưng có nhiều ý kiến khác nhau về điều này.
Trong trường hợp của bạn, tôi sẽ đi với void
+ Exception
. Bạn mong đợi tệp tải lên thành công, và khi không, nó đặc biệt. Nhưng người gọi buộc phải xử lý chế độ thất bại đó và bạn có thể trả về Ngoại lệ mô tả chính xác loại lỗi nào đã xảy ra.