数週間前、私は Globo Player のソリューションに取り組みました。そこでは、実行中にソフトウェアの特定の動作をアクティブ化および非アクティブ化する必要がありました。このタイプのニーズは、一般的に if-else や switch などの連鎖条件を使用して解決されますが、このアプローチは常に理想的であるとは限りません。
この記事では、この課題を完全に満たし、さまざまなプログラミング シナリオに適用できるソリューションを紹介します。
どの戦略を使用すればよいでしょうか?
あなたが未知の目的地に到着したところだと想像してください。空港を出るとき、ホテルに行くにはいくつかの選択肢があります。最も安価な方法は自転車をレンタルすることですが、これには時間がかかります。バスを利用すると少し高くなりますが、より早く安全に到着します。最後に、レンタカーを借りるのが最も早いオプションですが、最も高価でもあります。
この状況で最も重要な点は、選択した戦略に関係なく、最終的な目的は同じである、つまりホテルに到着するということを理解することです。
このアナロジーはソフトウェア開発にも適用できます。異なるプロセスが同じ目的を達成しようとするシナリオに対処する場合、戦略設計パターンを使用すると役立ちます。
戦略なしでプログラムを作成すると...
当座、普通、またはプレミアムなど、顧客の口座タイプに基づいて手数料を計算できる銀行システムを開発する必要があると想像してください。これらの計算は実行時に実行する必要があり、コード フローを適切な計算に正しく導く実装が必要です。
原則として、一般的なアプローチは、連鎖した条件文の単純な構造を使用して、問題を迅速かつ機能的に解決することです。
class Banco { calcularTaxa(tipoConta, valor) { if (tipoConta === "corrente") { return valor * 0.02; // 2% de taxa } else if (tipoConta === "poupanca") { return valor * 0.01; // 1% de taxa } else if (tipoConta === "premium") { return valor * 0.005; // 0,5% de taxa } else { throw new Error("Tipo de conta não suportado."); } } } const banco = new Banco(); const taxa = banco.calcularTaxa("corrente", 1000); // Exemplo: R00 console.log(`A taxa para sua conta é: R$${taxa}`);
このソリューションは単純なシナリオではうまく機能しますが、銀行が将来さらに 5 つの口座タイプを追加する必要がある場合はどうなりますか?
calcularTaxa(tipoConta, valor) { if (tipoConta === "corrente") { return valor * 0.02; // 2% de taxa } else if (tipoConta === "poupanca") { return valor * 0.01; // 1% de taxa } else if (tipoConta === "premium") { return valor * 0.005; // 0,5% de taxa } else if (tipoConta === "estudante") { return valor * 0.001; // 0,1% de taxa } else if (tipoConta === "empresarial") { return valor * 0.03; // 3% de taxa } else if (tipoConta === "internacional") { return valor * 0.04 + 10; // 4% + taxa fixa de R } else if (tipoConta === "digital") { return valor * 0.008; // 0,8% de taxa } else if (tipoConta === "exclusiva") { return valor * 0.002; // 0,2% de taxa } else { throw new Error("Tipo de conta inválido!"); } }
ここで、コードに重大な制限が現れ始めます。このアプローチの問題を調べてみましょう:
1.スケーラビリティが低い
新しいアカウント タイプを追加する必要があるたびに、calculateRate メソッドを変更する必要があります。これにより、条件文の数が継続的に増加し、コードがより複雑になり、管理が難しくなります。
2.高い依存性
レート計算ロジックは、calculateRate メソッドに完全に結合されています。ある種類のアカウントに変更を加えると、他の種類のアカウントに誤って影響を与える可能性があり、バグが発生するリスクが高まります。
3.コードの繰り返し
金額 * 手数料などの同様のスニペットは、アカウントの種類ごとに複製されます。これはコードの再利用を減らし、DRY (同じことを繰り返さない) 原則に違反します。
次のステップでは、戦略パターンがこれらの問題をどのように解決し、よりクリーンでスケーラブルなモジュール化されたコードを促進できるかを見ていきます。
戦略は一度に一つ!
上記の問題を回避するために、ソフトウェアでは各アカウント タイプを独立したエンティティとして扱います。これは、アカウントの種類ごとに特定の料金計算があり、将来のその他の関連する動作が発生する可能性があるためです。
すべての操作を解決する CalculateRate メソッドを含む Bank クラスを作成する代わりに、口座の種類ごとにクラスを作成しましょう。
class Banco { calcularTaxa(tipoConta, valor) { if (tipoConta === "corrente") { return valor * 0.02; // 2% de taxa } else if (tipoConta === "poupanca") { return valor * 0.01; // 1% de taxa } else if (tipoConta === "premium") { return valor * 0.005; // 0,5% de taxa } else { throw new Error("Tipo de conta não suportado."); } } } const banco = new Banco(); const taxa = banco.calcularTaxa("corrente", 1000); // Exemplo: R00 console.log(`A taxa para sua conta é: R$${taxa}`);
これにより、各計算操作がアカウント タイプの特定の範囲内に維持されることが保証されます。これで、各タイプのアカウントに焦点を当てた分離された動作が得られました。
しかし、目的のアカウント選択はどこにあるのでしょうか?
calcularTaxa(tipoConta, valor) { if (tipoConta === "corrente") { return valor * 0.02; // 2% de taxa } else if (tipoConta === "poupanca") { return valor * 0.01; // 1% de taxa } else if (tipoConta === "premium") { return valor * 0.005; // 0,5% de taxa } else if (tipoConta === "estudante") { return valor * 0.001; // 0,1% de taxa } else if (tipoConta === "empresarial") { return valor * 0.03; // 3% de taxa } else if (tipoConta === "internacional") { return valor * 0.04 + 10; // 4% + taxa fixa de R } else if (tipoConta === "digital") { return valor * 0.008; // 0,8% de taxa } else if (tipoConta === "exclusiva") { return valor * 0.002; // 0,2% de taxa } else { throw new Error("Tipo de conta inválido!"); } }
連鎖した意思決定構造 (if-else) を作成する代わりに、Bank クラスのコンストラクターでアカウント、ストラテジーを渡すことを選択したことに注意してください。これにより、setConta メソッドは実行時に銀行をインスタンス化するときに目的の口座タイプを選択できるようになります。レートの計算は this.conta.calcularTaxa(valor) を通じて実行されます。
class ContaCorrente { calcularTaxa(valor) { return valor * 0.02; // 2% de taxa } } class ContaPoupanca { calcularTaxa(valor) { return valor * 0.01; // 1% de taxa } } class ContaPremium { calcularTaxa(valor) { return valor * 0.005; // 0,5% de taxa } }
このモデルを使用すると、戦略パターンを簡単な方法で適用でき、より柔軟でスケーラブルで結合度の低い実装が保証されます。
すべてにおいて戦略を使用できますか?
ストラテジー パターンは、実行コードをさまざまな条件やタイプに直接結合することなく、実行時の操作の動作を変更する必要がある場合の強力なソリューションです。このパターンは、操作の動作がコンテキストに応じて変化する可能性があり、代替手段が互いに独立しているシナリオに最適です。
戦略パターンを使用する場合
- バリアント動作: 特定の条件 (銀行の例では異なる口座タイプなど) に応じてシステムの動作を動的に変更する必要がある場合。
- 複雑な条件文を避ける: 決定ロジックが複数の if-else や switch などの多くのフロー制御構造に基づいている場合、コードの保守が困難になります。
- メンテナンスと拡張の容易さ: 既存のコードを変更せずに新しい動作を追加したい場合は、新しい戦略クラスを作成するだけです。
- 動作の分離: 特定の動作をさまざまなクラスで分離し、コードをよりモジュール化して柔軟にしたい場合。
Strategy を使用することで、システムのより良いメンテナンスと拡張を促進するだけでなく、コードがよりクリーンでモジュール化され、柔軟になることを保証します。
以上が戦略パターンを使用してオーバーコンディショニングを回避するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

マトリックスの映画効果をあなたのページにもたらしましょう!これは、有名な映画「The Matrix」に基づいたクールなJQueryプラグインです。プラグインは、映画の古典的な緑色のキャラクター効果をシミュレートし、画像を選択するだけで、プラグインはそれを数値文字で満たされたマトリックススタイルの画像に変換します。来て、それを試してみてください、それはとても面白いです! それがどのように機能するか プラグインは画像をキャンバスにロードし、ピクセルと色の値を読み取ります。 data = ctx.getimagedata(x、y、settings.greasize、settings.greasize).data プラグインは、写真の長方形の領域を巧みに読み取り、jQueryを使用して各領域の平均色を計算します。次に、使用します

この記事では、jQueryライブラリを使用してシンプルな画像カルーセルを作成するように導きます。 jQuery上に構築されたBXSLiderライブラリを使用し、カルーセルをセットアップするために多くの構成オプションを提供します。 今日、絵のカルーセルはウェブサイトで必須の機能になっています - 1つの写真は千の言葉よりも優れています! 画像カルーセルを使用することを決定した後、次の質問はそれを作成する方法です。まず、高品質の高解像度の写真を収集する必要があります。 次に、HTMLとJavaScriptコードを使用して画像カルーセルを作成する必要があります。ウェブ上には、さまざまな方法でカルーセルを作成するのに役立つ多くのライブラリがあります。オープンソースBXSLiderライブラリを使用します。 BXSLiderライブラリはレスポンシブデザインをサポートしているため、このライブラリで構築されたカルーセルは任意のものに適合させることができます

データセットは、APIモデルとさまざまなビジネスプロセスの構築に非常に不可欠です。これが、CSVのインポートとエクスポートが頻繁に必要な機能である理由です。このチュートリアルでは、Angular内でCSVファイルをダウンロードおよびインポートする方法を学びます


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

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

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

WebStorm Mac版
便利なJavaScript開発ツール

ホットトピック



