-1

次の形式のスイッチがあります。

switch ($action) {
case 'saveTemp':
break;
case 'save':
break
}

次のようにブレークの条件を設定できるようにしたい:

switch ($action) {
case 'saveTemp':
    if ($skipbreak) {
        break;
    }
case 'save':
break
}

簡単に言えば、$skipbreak == trueコードを saveTemp ケースから save ケースに移行させたい場合です。

出来ますか?

ありがとう。

4

3 に答える 3

2

おそらく、あなたは私があなたに言うことをしないでしょう。少なくともしばらくの間はそうではありませんが、後であなたのこの質問を(たまたま)再訪したときに、私の答えが正しかったことに気付くでしょう。

switch ブロック内に if ブロックを入れ子にしないでください。 switch ブロック内に switch ブロックを入れ子にすることさえできません。どちらもコードの匂いであり、コードが SRP (単一責任の原則) に違反していることを示しています。これは、コードのこの特定の部分が一度にあまりにも多くの異なることを担当していることを意味します。

コード階層の 1 つまたは複数のレベルに移動し、特定のタスクを特定の関数に削除できる場所を見つけます。関数のグループをクラス内にカプセル化する必要があることに気付いたかもしれません。突然、入れ子になった制御ブロックが必要なくなったことに気付きます。

PHPLOC または同様のメトリック ツールを使用すると、提案どおりにコードをリファクタリングすると、コードの循環的複雑度が低下し、おそらくパフォーマンスも向上することがわかります。

于 2013-03-12T21:09:31.160 に答える
1

はい、それは可能であり、あなたはそれをやっただけです。ただし、それをしたいというのは本当に意味がありません。そうそう、ニックブが言ったように、スキップロジックを次のように否定する必要があります:

if(!$skipBreak)
    break;

ステートメントif-elseの代わりにブロックを使用することを検討する必要があります。スイッチステートメントで If-else if-else を使用する場合とその逆をswitch参照してください。

于 2013-03-12T20:53:04.640 に答える
0

次のように、switch ケース内に switch ケースをネストすることもできます。

$action = 'saveTemp'; // Example using saveTemp
$skipbreak = TRUE;    // Example using TRUE

switch ($action) {
    case 'saveTemp':
    switch ($skipbreak) {
        case TRUE:
        echo 'this is True';
        break;
        case FALSE:
        echo 'this is FALSE';
        break;
    }
    break;
    case 'save':
    echo 'this is save';
    break;
}
于 2013-03-12T21:00:45.180 に答える