ネストされたIFを最新のPHPの戦略パターンに置き換える
NestedのIF PHPのステートメントを置き換えるには、ポリシーパターンを使用する必要があります。1。ポリシーインターフェイスを定義します。 2。特定のポリシークラスを作成します。 3.コンテキストクラスを使用してポリシーを管理します。 4.タイプの選択と実行を通じて、対応するポリシーを選択して実行し、それにより、コードの保守性、テスト可能性、スケーラビリティを改善し、最終的に明確で分離されたデザインを達成します。
PHPコードがパイプラインを開始すると、特にタイプ、ステータス、またはユーザーの役割に基づいて決定を下している場合、深くネストされたif
またはelseif
ステートメントでパイプラインを開始すると、コードが読み取り、テスト、維持が難しくなっていることを明確にします。これをきれいにする強力な方法の1つは、それらのネストされた条件を戦略パターンに置き換えることです。

現代のPHPでこれをどのように、そしてなぜ行うのかを歩きましょう。
ネストされたIFを置き換えるのはなぜですか?
声明がしばしば次のように見えるif
ネストされています:

関数CalculateShipping($ order){ if($ order-> type === 'Standard'){ if($ order-> weight <= 5){ 5.00を返します。 } elseif($ order-> weight <= 10){ 10.00を返します。 } それ以外 { 15.00を返します。 } } elseif($ order-> type === 'express'){ if($ order-> weight <= 5){ 15.00を返します。 } elseif($ order-> weight <= 10){ 25.00を返します。 } それ以外 { 返品40.00; } } // ...その他の条件 }
これは乱雑になります。オープン/クローズド原理(OCP)に違反し、テストが困難で、新しい配送タイプを追加することが雑用になります。
戦略パターンは、各アルゴリズム(または動作)を独自のクラスにカプセル化することで役立ち、それらを簡単に交換できるようにします。

戦略パターンとは何ですか?
戦略パターンは、アルゴリズムのファミリーを定義し、それぞれをカプセル化し、それらを交換可能にします。コンテキスト(たとえば、出荷計算機など)は、内部の詳細を知らずに戦略を使用します。
PHPでは、これには次のことが含まれます。
- 戦略インターフェイス
- 複数のコンクリート戦略クラス
- 選択した戦略を使用するコンテキスト
戦略パターンでリファクタリングします
1。戦略インターフェイスを定義します
インターフェイスShippingstrategy { パブリック関数計算(フロート$ weight):float; }
2。具体的な戦略を作成します
クラスの標準シッピングを実装したShippingstrategy { パブリック関数計算(float $ weight):float { $ weight <= 5を返しますか? 5.00:($ weight <= 10?10.00:15.00); } } クラスエクスプレスシッピングはShippingstrategyを実装しています{ パブリック関数計算(float $ weight):float { $ weight <= 5を返しますか? 15.00:($ weight <= 10?25.00:40.00); } }
さらに進んで、重みのロジックを別々の戦略に分解するか、構成を使用することもできますが、これにより簡単になります。
3.コンテキストまたはリゾルバを使用します
クラスShippingCalculator { プライベート配列$戦略。 パブリック関数__construct(){ $ this-> strategies = [ 'Standard' => new StandardShipping()、 'Express' => new ExpressShipping()、 ]; } パブリック関数計算(String $ Type、Float $ weight):float { if(!sisset($ this-> strategies [$ type])){ 新しいInvalidargumentException( "不明な配送タイプ:$ type"); } return $ this-> strategies [$ type] - > calculate($ weight); } }
4。きれいに使用します
$ calculator = new ShippingCalculator(); $ cost = $ calculator-> calculate( 'express'、7); // 25.00を返します
s if
もうネストされていません。きれいで読みやすい通話。
現代のPHPの利点
PHP 8で戦略パターンを使用すると、いくつかの利点があります。
- タイプの安全性:インターフェイスと厳格なタイピングを使用すると、早期にエラーをキャッチします。
- テスト可能性:各戦略は単独でテストできます。
- 拡張性:新しい配送方法を追加しますか?新しいクラスを作成して登録するだけです。
- 読みやすさ:
if/else
の10レベルを通過することはもうありません。 - DIとの統合:依存関係噴射コンテナ(LaravelまたはSymfonyなど)を介して戦略を注入できます。
たとえば、Laravelでは、サービスプロバイダーに戦略をバインドする場合があります。
$ this-> app-> bind(shippingstrategy :: class。 '_express'、fn()=> new ExpressShipping());
または、構成駆動型の登録を備えた戦略工場を使用します。
いつ使用するか
あなたが見るとき、戦略パターンを考慮してください:
- タイプまたはモードに基づく複数の条件
- 繰り返し
switch
またはif-elseif
ブロック - 分岐のためにテストするのが難しいコード
- 変更または拡張する可能性のあるビジネスルール
2つの単純なブランチではやり過ぎですが、3つのバリエーションがあるか、成長を期待すると輝いています。
最終的な考え
ネストされた声明を戦略パターンに置き換えるif
、次のコードにつながります。
- より維持可能
- テストが簡単です
- より簡単に拡張します
現代のPHPでは、名前空間、オートローディング、強力なOOPサポートを備えているため、このパターンは自然にアーキテクチャに適合します。
それを使用するためにフレームワークは必要ありません。少し先見の明と、きれいなデザインへのコミットメントだけです。
基本的に、 if
チェーンがあなたを横にスクロールさせている場合、それは戦略の時です。
以上がネストされたIFを最新のPHPの戦略パターンに置き換えるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

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

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

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

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

deeplynestedconditionalsIncognitiveLoadanddebuggingtime、MakeCodehardertunderStandand andMaintain; refactoring withearlyrysandguardclausessimplifiesflow.2.poorscalisabilityAriseasivasionasmasasmoceSasmocecomplicatecpubububurnanchdiction

deeplynestededementseduceReadadyandincedinitecognitiveLoad、makecodehardertodebugandtest.2.theyoftenviolatetheSinsinesponsibilityprinciplebingingmultipreconconsinsonefunction.3.guardclausesswitherlyrussscansscanltenlogimcandimproveclation

deeplynestedif-elseblocksuducodereadability andmaintainability;

usearlylylylylylylyrytoflattennestededifstructures andimprovereadability byhandlingedgecasesfirst.2.extractcomplexconditionsintodedesivebooleanvariablestomakelogicself-documenting.3.Replacerole-orortype BasedConditionalStrigutiptablestablestablestables
