翻訳者から:
私は私のために新しい戦略パターンを研究するつもりでしたが、javascriptでのその実装の賢明なロシア語の記述を見つけませんでした。 wikiの記事はその複雑さを脅かしており、この例の可視性には多くの要望が残されています。 だからこそ、この記事の翻訳を取り上げ、同時にこのパターンが何であるかを理解しました。
ネタバレと灰色のテキストが私のコメントです。次に、JavaScriptでSTRATEGYを使用する方法と、それを実際のライブラリで使用して小さな部分に分割する方法の例を見ていきます。
戦略パターンが大好きです。 可能な限りそれを使用しようとします。 基本的に、
委任を使用して、アルゴリズムを使用するクラスからアルゴリズムを分離します。
このアプローチにはいくつかの利点があります。
第一に、使用するアルゴリズムのバージョンを選択するための複雑な条件構造を回避します。
第二に、
接続性を弱め、それにより顧客の複雑さを軽減し、クラス
集約を支持してサブクラスの拒否を促進します。
第三に、
モジュール性とテスト容易性が向上します。
STRATEGYの実装では、通常2人の参加者が使用されます。
- 戦略は、アルゴリズムをカプセル化するオブジェクトです。
- クライアント (またはコンテキスト )-任意のプラグアンドプレイプラグアンドプレイ戦略を使用できるオブジェクト。
以下:
戦略 -パターン自体。
戦略は、アルゴリズムの個別の実装です。次に、Javascriptで
STRATEGYを使用する方法の例と、それを実際のライブラリで使用して小さな部分に分割する方法の例を見ていきます。
機能としての戦略
組み込みの
FUNCTIONクラスは
、アルゴリズムを
カプセル化する優れた方法を提供します。 そしてこれは、機能を
戦略として使用できることを意味します。 関数をクライアントに渡して、クライアントがそれを使用することを確認してください。
これを例で説明します。
Greeterクラスを作成するとします。 彼の仕事は人々に挨拶することです。 また、
Greeterがさまざまな方法で挨拶できるようにしたいと考えています。 つまり、
アルゴリズムのいくつかの異なる実装が必要
です 。 これを行うために、さまざまな挨拶戦略を作成します。
以下、 アルゴリズムは挨拶です。
このコードにエラーがあります( bashtannikに感謝します )。 コンソールへの出力はすでに戦略アルゴリズムでレイアウトされており、 greetメソッドは何も返さない関数を返すため、最後の3行を置き換える必要があります。上記の例では、
Greeterクライアントと3つの異なる
戦略を作成しました。 明らかに、
Greeterは
アルゴリズムの使用方法を知っていますが、その
内部に何があるのかわかりません。
ただし、複雑なアルゴリズムの場合、多くの場合、機能だけでは十分ではありません。 この場合、OOPスタイルの
STRATEGYを使用することをお勧めします。
クラスとしての戦略
クラスは、特にアルゴリズムが上記の例で考案されたものよりも複雑な場合、
戦略にもなります。 クラスを使用すると、各
戦略のインターフェイスを定義できます。
これを例として考えてください。
このコードは例の前にあることが暗示されています。 var Greeter = function(strategy) { this.strategy = strategy; };
executeメソッドを使用して
Strategyをオブジェクト(またはクラス)として定義しました。 クライアントは、このクラスに対応する任意の
戦略を使用できます。
GreetingStrategyをチェックしてください。 最も興味深いのは、
executeメソッドのオーバーライドです。 このクラスの他のメソッドに依存します。 現在、このクラスを継承するオブジェクトは、メイン
アルゴリズムを変更せずに
sayHiや
sayByeなどの個々のメソッドを変更でき
ます 。 このパターンは
テンプレートメソッドと呼ばれ、
STRATEGYと完全に組み合わされます。
方法を見てみましょう。
executeStrategyを定義することにより、
GreetingStrategyは
アルゴリズムのファミリーを作成し
ます 。 上記のスニペットでは、いくつかの種類を作成することでこれを利用しました。
サブクラスを使用しなくても、
Greeterには
ポリモーフィズムがあります。 必要なアルゴリズムを呼び出すために別の種類の
Greeterに切り替える必要はありません。 今、彼らはすべての新しい
グリーターにいます。
var greeters = [ new Greeter(new BoredGreetingStrategy()), new Greeter(new PoliteGreetingStrategy()), new Greeter(new FriendlyGreetingStrategy()), ]; greeters.forEach(function(greeter) {
実際のコードでの戦略
STRATEGIESを使用する私のお気に入りの例の1つは、
Passport.jsライブラリです。
Passport.jsは、node.jsで認証を管理する簡単な方法を提供します。 多数のプロバイダー(Facebook、Twitter、Googleなど)をサポートし、各プロバイダーは個別の戦略として提示されます。
このライブラリは、npmパッケージとそのすべての戦略として利用できます。 プログラマーは、この特定の場合にインストールするnpmパッケージを自由に決定できます。 これがどのように機能するかを示すコードの抜粋です。
Passport.jsライブラリ自体には、いくつかの単純な認証メカニズムのみが含まれています。 それらと
Context以外には何もありません。 このアーキテクチャにより、サードパーティのプログラマは、プロジェクトを煩雑にすることなく、独自の認証メカニズムを簡単に実装できます。
道徳
Strategy Patternは、コードのモジュール性と検証可能性を向上させる方法を提供します。 しかし、これは、それがどこであってもなくても使用する必要があることを意味するものではありません。 また、
不純物を使用して、実行時にオブジェクトに機能を追加すると便利です。 そして時には、古き良き
アヒルのタイピングのスタイルにおける単純なポリモーフィズムで十分です。
何らかの方法で、最初に
STRATEGYを使用すると、アーキテクチャの大きなオーバーヘッドを回避しながら、コードをスケーリングできます。 これはPassport.jsで見ることができます。Passport.jsでは、このパターンを使用することで、他のプログラマーからの新しい戦略を簡単に追加できます。