2

私はライブラリを構築していますが、可能性があるかどうか、およびここで最良のアプローチを行う方法を知りたいです: 基本的に、クラスの結果に応じて表示できるいくつかの異なるメッセージが必要です。

擬似:

public function login($username, $password) {
    //query

    if (password hash is verified)

        if (active == false)
            (some sort of MESSAGE HERE! like "User is not activate...")
            return false

        if banned
            some sort of message
            return false
    else

        message (wrong username or password)
        return false
}

And then on the login

if (login(username, password))
    successfully
    redirect
else
    display the message

これを良いアプローチで実装する方法はどうですか? 値を与えるある種の変数が必要だと思います。次に、設定されている場合にエラーメッセージを返すメソッド()がいくつかあると思います。これまでのところ正しいですか? どうすればいいですか?

4

3 に答える 3

5

一部の言語(たとえば、例外処理によるプログラムフローの構造化が十分に最適化され、一般的に受け入れられているPython)では、ログインに値を返さずに、説明的なエラーコードで関連する例外をスローすることができます。

次に、擬似コードを実行できます。

try
{
    login(user, password);
    redirect(page);
}
catch (MyLoginException ex)
{
    displayMessage();
}
catch (GenericException ex)
{
    ...
}

ただし、これは一部の言語にのみ当てはまります。これは、たとえばCまたはC ++にはお勧めできません。例外処理が非常に遅いため、unexcepted状況を処理するために予約する必要があります。PHPはほとんど同じ船に乗っているように見えます。

したがって、 2つの値(ブール値と文字列)を返したいので、論理的なアクションはcompound、ブール値と文字列フィールドを持つLoginResultオブジェクトを返すことです。

loginメソッドからLoginResultオブジェクトの新しいインスタンスを返し、そのフィールドを使用してリダイレクトを処理したり、エラーメッセージを表示したりします。

于 2012-05-12T08:02:52.780 に答える
4

グローバル変数(Cのような)

静的に型付けされた言語でプログラミングしている場合は、エラーメッセージにグローバル変数を使用する可能性があります(グローバル名前空間を汚染します)。

global $login_error_message;

function login($user, $password)
{
  if(success)
   return true;
  if(failure)
  {
    global $login_error_message;
    $login_error_message = 'Error message';
    return false;
  }
}

if(login($user, $password))
  redirect
else
{
   global $error_message
   echo $error_message;
}

メンバー変数(C ++のような)

これは論理的にはグローバル変数と同じですが、汚染の問題はありません。

class LoginClass
{
   private $error_message;

   function login($user, $password)
   {
      if(success)
         return true;
      if(failure)
      {
         $this->error_message = "Error message";
         return false;
      }
   }

   function get_error_message()
   {
      return $this->error_message;
   }
}

$loginInstance = new LoginClass();
if($loginInstance->login($user, $password))
   redirect
else
   echo $loginInstance->get_error_message();

参照による受け渡し(C / ++のような)

参照によって渡される追加のパラメーターを使用して、エラーコードを返します(これにより、関数呼び出しがさらに複雑になります)。

function login($user, $password, &$error_msg)
{
   if(success)
     return true;
   if(fail)
   {
     $error_msg = 'Error message';
     return false;
   }
}

$error_message
if(login($user, $password, $error_message))
   redirect
else
   echo $error_message;

ミックスリターンタイプ

しかし、これはphpであるため(静的に型付けされていないため)、次のことができます。

成功した場合はtrueを返し(特別な出力は必要ないと思います)、そうでない場合はエラーメッセージを返します。この関数を使用すると、次のようになります。

function login($user, $passord)
{
   if(success)
     return true;
   if(failure)
     return "Error message";
 }

$login_result = login($user, $password);
if($login_result === true)//note the ===, as == would be true on non empty strings too
  success
else
  echo $login_result;

連想配列を返す

もちろん、両方の値を含むことができる配列を返すこともできます。

function login($user, $password)
{
  if(success)
     return array("success" => true, "error_msg" => "");
  if(failure);
     return array("success" => false, "error_msg" => "Error message");
}

$login_result = login($user, $password);
if($login_result['success'])
  redirect
else
  echo $login_result['error_message'];

クラスインスタンスを返す(C / ++のような)

同様に、次のような構造を使用できます。

class LoginReturn
{
  public $success;
  public $error_message;

  LoginReturn($success, $error_mesage)
  {
     $this->success = $success;
     $this->error_message = $error_message;
  }
};

function login$user, $password)
{
   if(success)
     return new LoginReturn(true, "");
   if(failure)
     return new LoginReturn(false, "Error message");
}

$login_result = login($user, $password);
if($login_result->success)
  redirect
else
  echo $login_result->error_message;

結論

これらの例を考えると、それらの長所と短所を見ることができると思います。個人的には、Member変数バリアントを使用します。これは、クラスに配置するだけで同じエラーメッセージインフラストラクチャを使用する関数を増やすためのスペースを提供するためです。

于 2012-05-12T08:04:08.460 に答える
1

この答えは、誰の答えに対する私のコメントを説明するためだけのものなので、代わりに誰にも信用を与えないでください。ログイン専用のクラスを作成して、エラーメッセージを保持することができます。

class CLogin
{
  public $error_message;

  function login($user, $password)
  {
    if (successfull)
      return true;
    else
    {
      $this->error_message = $error_message;
      return false;
    }
  }
};

または、エラーメッセージの参照によってパラメータを渡すこともできます。

編集:

混合型の戻り値を使用しないことが非常に重要であると私は信じているので、そのような関数の落とし穴についての記事を書きました。

于 2012-05-12T09:03:14.400 に答える