0

複数のチェックがある場合に単一の変数を設定する最良の方法は何ですか? これを行うには、効率的で、正確で、冗長性がなく、読みやすい方法が必要ですか?

Switch ステートメントは非常に冗長であるため、めったに使用しません。多くの場合、1 回のチェックで 3 ~ 4 行を要しますが、単純な 1 ~ 2 行のチェックで済ませることができます。

Switch ステートメントは if/elseif/else ブロックに比べて読みやすいということを読んでいたところですが、配置によって読みやすくなっていることがわかります。

冗長なコードを記述するのではなく、単一の変数宣言を使用できるため、三項ステートメントを使用することを楽しんでいますが、switch ステートメントは過度に冗長であり、そのコード (行消費) のオーバーヘッドがあるように見えます。

列挙型でハッキング

class eUserType
{
    const Normal = 0;
    const Admin = 1;
    const Moderator = 2;
}

もしそうでなければ

if ($userType == eUserType::Normal)
    $info = "Normal User";
elseif($userType == eUserType::Admin)
    $info = "Admin User";
elseif($userType == eUserType::Moderator)
    $info = "Moderator User";
else
    $info = false;

スイッチ

switch($userType)
{
    case eUserType::Normal:
        $info = "Normal User";
        break;
    case eUserType::Admin:
        $info = "Admin User";
        break;
    case eUserType::Moderator:
        $info = "Moderator User";
        break;
    default:
        $info = false;
}

三元

私はこれまでにこのような 3 進数を書いたことがなく、独自の空白を使用しました。正確で効率的ですが、「$userType == eUserType::」と非常に冗長であることがわかりました。さらに、私の場合 (PHPStorm) と同様に、ほとんどの IDE はコードの自動インデントをうまく処理できないと思います。

$info = $userType == eUserType::Normal ? 
            "Normal User" : 
        $userType == eUserType::Admin ? 
            "Admin User" : 
        $userType == eUserType::Moderator ? 
            "Moderator User" : false; 

これを $info を返す関数/メソッドにラップする必要があると思いますが、関数の中にあるものは気にしませんか?

まだ見たことのない、このようなことを行うための素晴らしい方法があるかどうか疑問に思っています。

最終的に私が探していると思うのは、Ternary の単一変数設定と switch ステートメントの単一変数チェックのハイブリッドです。(存在するかどうかは疑わしいですが、尋ねてみませんか?)

編集: リフレクションを使用してこのコードを動的にする方法が確実にあることは知っていますが、 $info に設定されているデータは、作業している複雑なオブジェクトではなく、単純なサンプルデータとして使用しました。再利用の可能性を考えて、これらのチェックを User Class に入れることになると思います。

4

3 に答える 3

1

配列を使用するのはどうですか?

$labels = array(
  eUserType::Normal => "Normal User",
  ...
);

return isset($labels[$userType]) ? $labels[$userType] : false;

ええ、リフレクションでも可能です (私はこの方法には行きませんが、この方法で文字列をローカライズすることはできません):

$class = new ReflectionClass('eUserType');
$key   = array_search($userType, $class->getConstants());

return ($key !== false) ? sprintf('%s User', $key) : false;
于 2013-10-22T01:16:50.413 に答える
0

これは主に主観的なものだと思いますが... 三項を使用しないでください:

「三項式を「積み重ねる」ことは避けることをお勧めします。単一のステートメント内で複数の三項演算子を使用する場合の PHP の動作は自明ではありません:」 - http://php.net/manual/en/language.operators.comparison .php

それ以外の場合は、非常に多数の選択肢がない限り、if ステートメントの方がはるかに一般的で、switch: よりもなじみがあるため、常に読みやすいことがわかりました。新しいスイッチを追加することは、新しい if/else ブロックを追加するよりも迅速です。

switch のパフォーマンス引数は次のとおりです。「switch ステートメントでは、条件は 1 回だけ評価され、結果は各 case ステートメントと比較されます。elseif ステートメントでは、条件が再度評価されます。条件が単純な比較よりも複雑な場合および/またはタイトループにある場合、切り替えがより高速になる可能性があります。」- http://php.net/manual/en/control-structures.switch.php

あなたの例は「単純な比較」です。

私の最後のコメントは、switch はエラーが発生しやすく、誤って誤用するとデバッグが面倒になる可能性があるということです。continue または break を使用している場合、またはより正確には、意図的に continue または break を使用していない場合、間違いを犯しやすく、複雑なロジックで迷子になります。

したがって、私のお金では、ワンライナーの三項、if/else は万能の頼りになるツールです。ただし、非常に大規模または動的な条件がある場合、またはロジックでスイッチのみが提供できる動作が必要な場合を除きます。

于 2013-10-22T01:37:14.730 に答える