ガード句を使用して早期に出て、ネストを減らします。 2。戦略パターンを適用して、條件をクラスまたは呼び出し可能な狀態(tài)に置き換えます。 3.単純なマッピングをルックアップテーブルまたは配列に置き換えます。 4.オブジェクトが行動(dòng)を決定するため、多型を採(cǎi)用します。 5.複雑なワークフローに狀態(tài)またはコマンドパターンを使用します。さらに、クリーンな條件付きロジックにPHP 8の一致式を使用します。これらの手法は、コードをまとめて平らにし、読みやすさを向上させ、メインロジックから條件を移動(dòng)させることで保守性を向上させます。
PHPコードが深いIF-ELSEブロックで積み上げ始めると、読み取り、テスト、保守が困難になります。ネスティング條件は一般的ですが、よりクリーンでよりスケーラブルな代替品があります。論理の明確さを犠牲にすることなく、if-elseピラミッドから解放される方法は次のとおりです。

1。ガード條項(xiàng):早期に出て、ネスティングを減らします
最も単純で最も効果的な手法の1つは、ガード條項(xiàng)を使用することです。機(jī)能の開始時(shí)にエッジケースまたは無効な狀態(tài)を処理する早期リターンです。
の代わりに:

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); }
これにより、メインロジックが最上位レベルに保持され、機(jī)能が容易になります。

2。戦略パターン:條件をクラスに置き換えます
タイプまたはステータスに基づいて複數(shù)の動(dòng)作を選択する場(chǎng)合、戦略パターンは、長(zhǎng)いIF-ELSEチェーンをクラスまたはカレウブルのマップに置き換えます。
たとえば、代わりに:
関數(shù)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、 ]; 関數(shù)Calculatetax($ Country、$額、$ Strategies){ $ $ Strategies [$ country]($額)?? 0; }
または、より良い分離とテスト可能性のために、 TaxStrategy
インターフェイスを?qū)g裝する専用クラスをさらに進(jìn)みます。
3。単純なマッピング用のルックアップテーブルと配列
多くのif-elseはしごは、価値のあるマッピングに過ぎません。それらを配列に置き換えます。
の代わりに:
関數(shù)getStatuscolor($ status){ if($ status === 'Active'){ 「グリーン」を返します。 } elseif($ status === 'pending'){ 「黃色」を返します。 } elseif($ status === 'inactive'){ 「灰色」を返します。 } elseif($ status === 'blocked'){ 「赤」を返します。 } 「不明」を返します。 }
ルックアップを使用します:
関數(shù)getStatuscolor($ status){ $ colors = [ 「アクティブ」=>「緑」、 「保留中」=>「黃色」、 「非アクティブ」=>「グレー」、 「ブロック」=>「赤」 ]; $ colors [$ status] ?? '未知'; }
より速く、きれいで、拡張が容易であるか、configからのロードさえあります。
4。多型:オブジェクトに動(dòng)作を決定させます
條件がオブジェクトタイプに依存する場(chǎng)合は、多型を使用してください。ベースクラスまたはインターフェイスでメソッドを定義し、サブクラスに獨(dú)自のバージョンを?qū)g裝させます。
例:
インターフェイス通知{ public function send($ message); } クラスのemailnotificationは通知を?qū)g裝しています{ public function send($ message){ / * email * /}経由で送信 } クラスSMSNotificationは通知を?qū)g裝しています{ public function send($ message){ / * sms * /}を介して送信 } // if-elseは必要ありません function notify(user $ user、notification $ channel、$ msg){ $ channel-> send($ msg); }
これで、送信方法の決定がカプセル化されています。コールサイトでは條件が必要ありません。
5。複雑なワークフローの狀態(tài)またはコマンドパターン
狀態(tài)に基づいて変更される複雑なビジネスルールについては、狀態(tài)パターンまたはコマンドパターンを検討してください。これらを使用すると、広大な條件なしに動(dòng)作と移行をカプセル化することができます。
たとえば、保留中、出荷、またはキャンセルされたときに異なる動(dòng)作をする順序は、有効なアクションを定義する獨(dú)自の狀態(tài)オブジェクトを持つことができます。
または、コマンドマップを使用します。
$ action = [ 'create' => new CreateOrderHandler()、 「キャンセル」=> new cancelorderhandler()、 'Refund' => new Refundhandler()、 ]; $ handler = $ action [$ command] ??新しいInvalidCommandException()を投げる; $ handler-> execute($ data);
これにより、ルーティングコマンドのときにロングスイッチ/IFブロックが回避されます。
ボーナス: match
式(PHP 8)を使用する
PHP 8のmatch
、 switch
に代わるよりクリーンな代替品であり、多くの場(chǎng)合、IF-ELSEチェーンを置き換えることができます。
$ status = 'Active'; $ label = match($ status){ 「アクティブ」=>「アクティブユーザー」、 「保留中」=> '保留中の承認(rèn)'、 「非アクティブ」=> '非アクティブ'、 デフォルト=>「不明なステータス」 };
それは式に基づいており、タイプセーフであり、 break
ステートメントは必要ありません。
重要なのは、條件を完全に排除することではなく、必要です -主なロジックからそれらを移動(dòng)することです。早期のリターン、データ構(gòu)造、およびオブジェクト指向パターンを使用して、コードをフラット、読み取り可能、および拡張機(jī)能を開いたままにします。
基本的に:深い巣を見るときは、尋ねてください -これは地図、方法、または返品ですか?多くの場(chǎng)合、答えはイエスです。
以上がネストを超えて:PHPの深いIF-ELSE構(gòu)造の代替案の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

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

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

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

SublimeText3 中國(guó)語版
中國(guó)語版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

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

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

ホットトピック

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

deeplynestedconditionalsIncognitiveLoadanddebuggingtime、MakeCodehardertunderStandand andMaintain; refactoring withearlyrysandguardclausessimplifiesflow.2.poorscalisabilityAriseasivasionasmasasmoceSasmocecomplicatecpubububurnanchdiction

guardclauseSareasuerasureartiveToNestementionphpbecausEtheTyeTyeducecomplexityByhandlingpreconditionsearly.1)それらを採(cǎi)用する可能性を擔(dān)當(dāng)することができるようになります

NestedifstateMentionArecocepable inphphentheyReflogicalHierarchies、sudasguardclauseSwithearreallyexits、階層的なビジネスは、orshallownesting(1–2Levels)、becauseteyenhanceclarityandmimintinflow.2.epepnesting(3レベル)、deepnesting(3レベル)、

deeplynestededementseduceReadadyandincedinitecognitiveLoad、makecodehardertodebugandtest.2.theyoftenviolatetheSinsinesponsibilityprinciplebingingmultipreconconsinsonefunction.3.guardclausesswitherlyrussscansscanltenlogimcandimproveclation

deeplynestedif-elseblocksuducodereadability andmaintainability;

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

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