目次
2。戦略パターン:条件をクラスに置き換えます
3。単純なマッピング用のルックアップテーブルと配列
4。多型:オブジェクトに動作を決定させます
5。複雑なワークフローの状態またはコマンドパターン
ボーナス: match式(PHP 8)を使用する
ホームページ バックエンド開発 PHPチュートリアル ネストを超えて:PHPの深いIF-ELSE構造の代替案

ネストを超えて:PHPの深いIF-ELSE構造の代替案

Aug 01, 2025 am 07:41 AM
PHP Nested if Statement

ガード句を使用して早期に出て、ネストを減らします。 2。戦略パターンを適用して、条件をクラスまたは呼び出し可能な状態に置き換えます。 3.単純なマッピングをルックアップテーブルまたは配列に置き換えます。 4.オブジェクトが行動を決定するため、多型を採用します。 5.複雑なワークフローに状態またはコマンドパターンを使用します。さらに、クリーンな条件付きロジックにPHP 8の一致式を使用します。これらの手法は、コードをまとめて平らにし、読みやすさを向上させ、メインロジックから条件を移動させることで保守性を向上させます。

ネストを超えて:PHPの深いIF-ELSE構造の代替案案案案

PHPコードが深いIF-ELSEブロックで積み上げ始めると、読み取り、テスト、保守が困難になります。ネスティング条件は一般的ですが、よりクリーンでよりスケーラブルな代替品があります。論理の明確さを犠牲にすることなく、if-elseピラミッドから解放される方法は次のとおりです。

ネストを超えて:PHPの深いIF-ELSE構造の代替案案案案

1。ガード条項:早期に出て、ネスティングを減らします

最も単純で最も効果的な手法の1つは、ガード条項を使用することです。機能の開始時にエッジケースまたは無効な状態を処理する早期リターンです。

の代わりに:

ネストを超えて:PHPの深いIF-ELSE構造の代替案案案案
 function processuser($ user){
    if($ user!== null){
        if($ user-> isactive()){
            if($ user-> haspermission()){
                //ここにメインロジック
                return $ this-> sendwelcomemail($ user);
            }
        }
    }
    falseを返します。
}

早期出口のリファクタリング:

 function processuser($ user){
    if($ user === null)falseを返します。
    if(!$ user-> isactive())return false;
    if(!$ user-> haspermission())return false;

    return $ this-> sendwelcomemail($ user);
}

これにより、メインロジックが最上位レベルに保持され、機能が容易になります。

ネストを超えて:PHPの深いIF-ELSE構造の代替案案案案

2。戦略パターン:条件をクラスに置き換えます

タイプまたはステータスに基づいて複数の動作を選択する場合、戦略パターンは、長いIF-ELSEチェーンをクラスまたはカレウブルのマップに置き換えます。

たとえば、代わりに:

関数calculatetax($ country、$額){
    if($ country === 'us'){
        返品$額 * 0.07;
    } elseif($ country === 'de'){
        返品$額 * 0.19;
    } elseif($ country === 'jp'){
        $額 * 0.10を返します。
    }
    0を返します。
}

戦略マップを使用します:

 $ Taxstrategies = [
    「私たち」=> fn($額)=> $金額 * 0.07、
    'de' => fn($額)=> $額 * 0.19、
    'jp' => fn($額)=> $額 * 0.10、
];

関数Calculatetax($ Country、$額、$ Strategies){
    $ $ Strategies [$ country]($額)?? 0;
}

または、より良い分離とテスト可能性のために、 TaxStrategyインターフェイスを実装する専用クラスをさらに進みます。


3。単純なマッピング用のルックアップテーブルと配列

多くのif-elseはしごは、価値のあるマッピングに過ぎません。それらを配列に置き換えます。

の代わりに:

関数getStatuscolor($ status){
    if($ status === 'Active'){
        「グリーン」を返します。
    } elseif($ status === 'pending'){
        「黄色」を返します。
    } elseif($ status === 'inactive'){
        「灰色」を返します。
    } elseif($ status === 'blocked'){
        「赤」を返します。
    }
    「不明」を返します。
}

ルックアップを使用します:

関数getStatuscolor($ status){
    $ colors = [
        「アクティブ」=>「緑」、
        「保留中」=>「黄色」、
        「非アクティブ」=>「グレー」、
        「ブロック」=>「赤」
    ];

    $ colors [$ status] ?? '未知';
}

より速く、きれいで、拡張が容易であるか、configからのロードさえあります。


4。多型:オブジェクトに動作を決定させます

条件がオブジェクトタイプに依存する場合は、多型を使用してください。ベースクラスまたはインターフェイスでメソッドを定義し、サブクラスに独自のバージョンを実装させます。

例:

インターフェイス通知{
    public function send($ message);
}

クラスのemailnotificationは通知を実装しています{
    public function send($ message){ / * email * /}経由で送信
}

クラスSMSNotificationは通知を実装しています{
    public function send($ message){ / * sms * /}を介して送信
}

// if-elseは必要ありません
function notify(user $ user、notification $ channel、$ msg){
    $ channel-> send($ msg);
}

これで、送信方法の決定がカプセル化されています。コールサイトでは条件が必要ありません。


5。複雑なワークフローの状態またはコマンドパターン

状態に基づいて変更される複雑なビジネスルールについては、状態パターンまたはコマンドパターンを検討してください。これらを使用すると、広大な条件なしに動作と移行をカプセル化することができます。

たとえば、保留中、出荷、またはキャンセルされたときに異なる動作をする順序は、有効なアクションを定義する独自の状態オブジェクトを持つことができます。

または、コマンドマップを使用します。

 $ action = [
    'create' => new CreateOrderHandler()、
    「キャンセル」=> new cancelorderhandler()、
    'Refund' => new Refundhandler()、
];

$ handler = $ action [$ command] ??新しいInvalidCommandException()を投げる;
$ handler-> execute($ data);

これにより、ルーティングコマンドのときにロングスイッチ/IFブロックが回避されます。


ボーナス: match式(PHP 8)を使用する

PHP 8のmatchswitchに代わるよりクリーンな代替品であり、多くの場合、IF-ELSEチェーンを置き換えることができます。

 $ status = 'Active';

$ label = match($ status){
    「アクティブ」=>「アクティブユーザー」、
    「保留中」=> '保留中の承認'、
    「非アクティブ」=> '非アクティブ'、
    デフォルト=>「不明なステータス」
};

それは式に基づいており、タイプセーフであり、 breakステートメントは必要ありません。


重要なのは、条件を完全に排除することではなく、必要です -主なロジックからそれらを移動することです。早期のリターン、データ構造、およびオブジェクト指向パターンを使用して、コードをフラット、読み取り可能、および拡張機能を開いたままにします。

基本的に:深い巣を見るときは、尋ねてください -これは地図、方法、または返品ですか?多くの場合、答えはイエスです。

以上がネストを超えて:PHPの深いIF-ELSE構造の代替案の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

コントロールフローのアーキテクチャ:PHPでネストされたIFを使用(および回避する)時期 コントロールフローのアーキテクチャ:PHPでネストされたIFを使用(および回避する)時期 Jul 31, 2025 pm 12:42 PM

nestedifstatementsArecocecepable inphpは、heydeylogicalhierararchies、sudasguardclauseswith clearreallyexits、階層的ビューズのlog、orshallownesting(1–2levels)、becauseeteyenhanceclarityandmaintinflow.2.epednesting(3レベル)、deepnesting(3レベル)、

矢印コードからクリーンコードまで:ネストされたifsを簡素化するための戦略 矢印コードからクリーンコードまで:ネストされたifsを簡素化するための戦略 Jul 30, 2025 am 05:40 AM

ネストされたIFステートメントの複雑さを排除するには、Guard句を使用して事前に戻り、条件付き式をマージし、ブランチを多型またはポリシーパターンに置き換え、ルックアップテーブルマッピング値を使用する必要があります。 1.ガード句を使用して、事前に境界条件を処理して終了します。 2。論理操作を使用して、関連する条件を満たします。 3.多型またはポリシーパターンを使用して、複雑な型ブランチを置き換えます。 4.辞書およびその他のデータ構造を使用して、単純な条件付きマッピングを置き換えます。最終的にコードをフラットで線形にし、読みやすさと保守性を向上させます。

DOOMのピラミッドを飼いならす:PHPでの声明の場合はネストされたリファクタリング DOOMのピラミッドを飼いならす:PHPでの声明の場合はネストされたリファクタリング Aug 01, 2025 am 12:33 AM

PHPでのネストされた声明によってネストされた「死のピラミッド」問題を解決するには、次の5つの再構成方法を採用する必要があります。1。条件チェックを平らにして、深い巣を避けるために早期リターン(GuardClauses)を使用する必要があります。 2.読みやすさと再利用性を向上させるために、明確な名前を持つ複雑な条件をプライベートメソッドに抽出します。 3.複雑なプロセスに検証オブジェクトまたはミドルウェアモードを使用して、構成可能で拡張可能な検証ロジックを実現します。 4.ネストされた三元表現を避けるために、単純なシナリオでのみ、三元または空のマージオペレーターを使用します。 5。例外を使用して、エラー文字列の返品を置き換え、集中的な方法でエラーを処理し、コアロジックを純粋に保ちます。究極の目標は、コードをより安全でテストしやすく、迅速な障害、論理的分離、適切な設計パターンを通じて維持しやすくすることです。

隠されたコスト:深くネストされたPHP条件のパフォーマンスへの影響 隠されたコスト:深くネストされたPHP条件のパフォーマンスへの影響 Jul 30, 2025 am 05:37 AM

deeplynestedconditionalsIncognitiveLoadanddebuggingtime、MakeCodehardertunderStandand andMaintain; refactoring withearlyrysandguardclausessimplifiesflow.2.poorscalisabilityAriseasivasionasmasasmoceSasmocecomplicatecpubububurnanchdiction

ネストされたIFS対試合式:現代のPHP対決 ネストされたIFS対試合式:現代のPHP対決 Aug 05, 2025 pm 02:47 PM

値から価値のマッピングの場合、その構文がより簡潔で、タイプセーフ、パフォーマンスが高くなるため、一致を最初に使用する必要があります。 2。複雑な論理、多変量条件または副作用が関係する場合、声明を使用する必要がある場合はネストされます。 3.一致は、厳密な比較を通じてタイプの強制を回避し、コードの予測可能性を向上させます。 4.高性能シナリオでは、一致がジャンプテーブルを内部的に最適化するために使用され、実行効率は長鎖の場合よりも優れています。 5.最終提案:単純なマッチングにマッチを使用し、複雑な制御フローを使用する場合は使用し、シナリオに基づいて適切なツールを選択して、コードの読みやすさとメンテナンスを実現します。

ネストされたIF-ELSE構造を使用した効果的なエラー処理と検証 ネストされたIF-ELSE構造を使用した効果的なエラー処理と検証 Jul 31, 2025 am 11:59 AM

deeplynestedif-elseblocksuducodereadability andmaintainability;

PHPガード条項:ネストされた場合の優れた代替手段 PHPガード条項:ネストされた場合の優れた代替手段 Jul 31, 2025 pm 12:45 PM

guardclauseSaReasuerasueralternativeToNestemention inphpbecausEtheTeyceComplexity byhandlingpreconditionsearly.1)それらを採用することを繰り返し担当する可能性を促進します

コードの臭いとしてネストされたIFS:過度に複雑なロジックを識別して修正する コードの臭いとしてネストされたIFS:過度に複雑なロジックを識別して修正する Aug 01, 2025 am 07:46 AM

deeplynestededementseduceReadadyandincedinitecognitiveLoad、makecodehardertodebugandtest.2.theyoftenviolatetheSinsinesponsibilityprinciplebingingmultipreconconsinsonefunction.3.guardclausesswitherlyrussscansscanltenlogimcandimproveclation

See all articles