Yöntem dönüş durumu: bool, dize, const ...

0 Cevap php

Bu soru: http://stackoverflow.com/questions/356248/best-way-to-return-status-flag-and-message-from-a-method-in-java ancak ben PHP bunu yapardı, benimkine benzer, değil Java (burada ufak bir fark olabilir).

The problem:

There's a method that can have either a successful outcome (this may change to be more successful ones) or a "problematic" one. The latter means the operation failed, but it is also important to know why. Imagine a method of an Authentication class:

public function login($name, $password)
{
    if (successful_authentication)
    {
        report success
    }
    else
    {
        report failure, explain why (e.g. wrong name/pass, user banned)
    }
}

Bu gerçek ve başarı ve başarısızlık için return false Önemsiz olurdu, ama nasıl başarısızlığın nedenini rapor?

Possible solutions:

  • Doğru veya yanlış dönmek ve sorunla almak için başka bir yöntem (getStatus ()) yazmak: Bu bana biraz garip geliyor
  • Istisnalar kullanın: Bu yasak olması için bir kullanıcı için olağanüstü değil çünkü bu durumda burada istisnaların kullanımı (düz yanlış olur (bu sitede başka bir yazar olarak yazmaya işaret ederken kullanıcı ölecek eğer bir istisna olurdu) ancak Bir sorgu başarısız olursa yöntemi) bir veritabanı istisna olabilir
  • Sorunu gösteren bir hata kodu ile başarı ve başarısızlık üzerinde bir dize doğru dönün: PHP ile aşağıdaki gibi güzel temiz blokları için bu şekilde mümkündür:

    $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];
    }
    
  • Çok şık bir çözüm ve de geleceğe (hiçbir sorun durumların sayısı değişir veya daha sonra ek veri iade edilmelidir varsa), belki iyi biri: Bir genel durumu (state) nesne Dönüş

    $loginStatus = $auth->login('name', 'pass')
    if ($loginStatus->isSuccess)
    ...
    else
        echo $errorMessages[$loginStatus->errorCode]; // $errorMessages as by the previous example
    
  • Yukarıdaki iki ya da değil, düz dize ama sınıf sabitleri ile:

    $loginStatus = $auth->login('name', 'pass')
    if ($loginStatus->isSuccess)
    ...
    elseif ($loginStatus->errorCode == Auth::ERR_USER_BANNED)
    ...
    

    Bu ile bu belgelerde hata kodları açıklamak gereksiz olacağını ve daha "doğal" de (en azından benim için) hissederiz.

The question:

Eğer (yukarıdaki olanlar ya da herhangi bir başka çözelti) ne kullanırsınız? Ne iyi bir yol olması için uzun vadede kanıtlanmıştır?

Şimdiden teşekkürler!

0 Cevap