1

私は AS3 で作業していますが、これは一般的な質問である可能性があると思います。

XML ファイルを使用して、Strategy パターンを実装する特定のクラスのオブジェクトのパラメーターを定義しています。多種多様なオブジェクトがあり、これは、これらのオブジェクトをカスタマイズするためのデザイナー フレンドリーなソリューションとして機能します。私は XML ファイルでしか文字列を定義できないので、誰かがその文字列を取得して適切な戦略を実装するためのきちんとした方法を提案できますか?

私は最初に2つの考えを持っていました。まず、オブジェクトのコンストラクターに文字列を渡し、正しい戦略を適用するオブジェクト内に Switch Case を設定します。

次に、コントローラーのクラスの外にスイッチを配置し、正しい戦略をオブジェクトのコンストラクターに渡します。

オブジェクトクラス自体は私の特定の実装の影響を受けないため、2番目はよりクリーンなバージョンのようです。しかし、どちらもまったく正しくないと感じています。

追加の提案をいただければ幸いです。

4

2 に答える 2

3

入力文字列に基づいて適切なクラスを選択するには、ある種の Factory デザイン パターンが必要です。その優れたアプリケーションがレジストリです。適用可能なクラスは、特定の入力文字列に適しているとして、シングルトンのレジストリ クラスに自分自身を「登録」します。ファクトリ自体は、文字列から登録されたクラスへのルックアップになります。要求されている入力文字列に対してクラスが登録されていない場合、いくつかのフォールバックが存在する必要があります。それは例外であるか、または特定の実装が適用されない場合に使用される「デフォルト」の実装があります。後者は、優れたフェイルソフト オプションです。 、しかし、常に当てはまるわけではありません。

レジストリに関する避けられない問題は、関心のあるすべてのクラスを見つけて、それらが自分自身を登録していることを確認する方法です (これは特にプラグイン クラスにとって興味深いものです)。これに対する最善の解決策は、手元にある特定の言語にかなり依存しており、残念ながら、この点に関して AS3 が何を提供するかはわかりません (または、そのような動的な拡張性に興味があるかどうか)。

レジストリに関するもう 1 つの興味深い問題は、「競合」です。特定の入力文字列に対して、適用可能なクラスが複数あると主張するとどうなりますか。「最後に勝利を主張する」は最も単純ですが、単純すぎることがよくあります。特定の「優先度」または「優先度」を持つ複数の入力文字列に対して各クラスを登録するか、そうでなければ (分散されていないシステムではあまり興味深いものではありませんが、分散システムには重要です...) すべての間で「負荷分散」を行うことができます。該当する「サーバー」 (ラウンドロビンまたはより洗練された方法)。

これらのソリューションは最初のソリューションよりも 2 番目のソリューションに似ていることに気付くでしょうが、主な違いは、脆弱で堅固なハードコードされたスイッチ (OOP bete noire;-) の代わりに、文字列からクラスへの柔軟なマッピングに依存していることです。 (または、クラス構築メソッド、デリゲート、&c、実装言語の詳細に依存します。たとえば、Java では StrategyConstructing インターフェースがあり、各戦略クラスは、レジストリにサインアップするときにその戦略を実装する独自の補助クラスを登録します) .

于 2009-08-25T05:00:23.760 に答える
0

はい、アレックスは正しい方法を指摘しました...

実装の詳細については、同様の問題を扱っているこの投稿をご覧になることをお勧めします...私の回答には、開始するための実装例が含まれています...

これはより堅牢であるため、文字列<->インスタンスマッピングを行う必要があると思います...戦略は、適用するオブジェクトの観点からステートレスである必要があり、そのオブジェクトからすべての入力を受け取ります...そのようにすることができます任意の実行ポイントでオブジェクトと戦略の状態を同期することは明らかではないため、実行時に戦略を切り替えます...

挨拶

back2dos

于 2009-08-25T10:08:44.137 に答える