Câu hỏi này: Best way to return status flag and message from a method in Java tương tự như của tôi, tuy nhiên tôi sẽ làm điều đó trong PHP chứ không phải Java (có thể tạo ra sự khác biệt nhỏ ở đây).Phương thức trả về phương thức: bool, string, const ... (PHP)
Vấn đề:
Có một phương pháp có thể có hoặc là một kết quả thành công (điều này có thể thay đổi được những thành công hơn) hoặc "có vấn đề" một. Điều thứ hai có nghĩa là hoạt động thất bại, nhưng điều quan trọng là phải biết tại sao. Hãy tưởng tượng một phương pháp của một lớp Xác thực:
public function login($name, $password)
{
if (successful_authentication)
{
report success
}
else
{
report failure, explain why (e.g. wrong name/pass, user banned)
}
}
Nó sẽ là tầm thường để trở về đúng và sai cho sự thành công và thất bại, nhưng làm thế nào để báo cáo nguyên nhân của thất bại?
giải pháp có thể:
- Return đúng hay sai và viết phương pháp khác (getStatus()) để có được những vấn đề cụ thể: đây cảm thấy một chút vụng về với tôi
- Sử dụng ngoại lệ: vì nó không đặc biệt đối với người dùng bị cấm (ngoại lệ sẽ là nếu người dùng sẽ chết trong khi gõ với tư cách tác giả khác trên trang này đã chỉ ra) việc sử dụng các ngoại lệ ở đây trong những trường hợp này sẽ là sai (mặc dù phương pháp có thể ném ngoại lệ cơ sở dữ liệu nếu truy vấn không thành công)
Return thật thành công và một chuỗi trên thất bại với một mã lỗi chỉ ra vấn đề: với PHP nó có thể cách này để có khối sạch đẹp như sau:
$loginStatus = $auth->login('name', 'pass'); if ($loginStatus === true) { doSomething(); } else { if ($loginStatus == 'wrong_login_data') ... elseif ($loginStatus == 'banned') ... // or with an array full of error messages: echo $erroMessages[$loginStatus]; }
Return một tình trạng chung (nhà nước) đối tượng: rất giải pháp thanh lịch và cũng tương lai chứng minh (không có vấn đề nếu số lượng các trạng thái khác nhau hay muộn dữ liệu bổ sung nên được trả lại), có lẽ tốt nhất:
$loginStatus = $auth->login('name', 'pass') if ($loginStatus->isSuccess) ... else echo $errorMessages[$loginStatus->errorCode]; // $errorMessages as by the previous example
hoặc của hai bên trên, nhưng không phải với chuỗi đồng bằng nhưng hằng số lớp học:
$loginStatus = $auth->login('name', 'pass') if ($loginStatus->isSuccess) ... elseif ($loginStatus->errorCode == Auth::ERR_USER_BANNED) ...
Với điều này sẽ không cần thiết để giải thích các mã lỗi trong tài liệu và cũng sẽ cảm thấy "tự nhiên" hơn (ít nhất là đối với tôi).
Câu hỏi đặt ra:
bạn sẽ sử dụng gì (trong những người ở trên hoặc bất kỳ giải pháp khác)? Điều gì đã được chứng minh về lâu dài là một cách tốt?
Cảm ơn bạn trước!
Thật là một sự xấu hổ tôi đã chờ đợi quá lâu với việc chấp nhận câu trả lời :-). – Piedone