問題タブ [visitor-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
222 参照

php - 訪問者を 2 つの紹介ページに分けて、訪問者ごとの登録量を比較するにはどうすればよいですか?

オンライン ゲームをプレイできるようにするには、ユーザーの登録が必要なサイトを作成しています。ログインしない場合は、紹介ページしか表示されません。

ユーザーがサイトにログインすると、この情報が Cookie に保存されるため、次回の訪問時には login.php に直接送信されます。ユーザーが Cookie にこの情報を持っていない場合、intro.php に送信されます。

もちろん、できるだけ多くのユーザーに登録してもらいたいです (または、この場合は、できるだけ高い割合で)。これを行うには、ユーザーの 50% を intro1.php に、残りの 50% を intro2.php に分けたいと考えています。次に、registration.php リンクをクリックしたユーザーの量/割合と、サイトから離れてクリックしたユーザー数を比較したいと思います。

intro1.php から registration.php に移動する訪問者の正確な割合と、intro2.php から registration.php に移動する訪問者の正確な割合の統計が必要です。このようにして、intro1.php と intro2.php の成功率を比較し、紹介ページを改善できます。どうすればこれを達成できますか?

0 投票する
5 に答える
4727 参照

java - Java オブジェクト グラフ ビジター ライブラリ

優れた Java オブジェクト グラフ ビジター ライブラリを知っていますか?

オブジェクトとそのサブコンポーネントにアクセスし、いくつかの条件が一致したときにいくつかのアクションを実行したいと考えています。

使用例:

  • 巨大なドメイン オブジェクト グラフで、各 ID をnull
  • 巨大なドメイン オブジェクト グラフでは、それぞれSetTreeSet 同じ要素を含むインスタンスに置き換えます。

オブジェクト グラフをトラバースするのは難しいため、カスタム コードではなくライブラリが必要です。コレクション、配列、プロキシなどを処理する必要があります...これを実現するために XStream の一部を再利用することを考えましたが、それほど簡単ではないようです。Xstream ビジターは、オブジェクトの自己変更よりもオブジェクト変換を重視しています。

0 投票する
5 に答える
232 参照

java - Javaの仮想メソッドに関する質問

簡単に言えば、次のコードで「sub」を出力する必要があります。

そして私はprint(要素e)を変更したくありません。だから何も好きではない

私がやりたいのは

それを実際のサブクラスに自動的にキャストし、システムにprint(SubElement e)を強制的に入力させます。これはどういうわけか可能ですか?

0 投票する
1 に答える
1130 参照

c# - 訪問者パターンは、ドメイン列挙型をクラスにリファクタリングするための最良の方法ですか?

列挙型 (ドメイン層に含まれる) をポリモーフィック クラスにリファクタリングする場合、リファクタリングするすべての switch および if ステートメントが他の層 (これは、ドメイン層内でこれらの層を参照することになる可能性があるためです。

(上記の例では、「相互参照」の問題も発生する可能性があります)

ビジター パターン ( http://en.wikipedia.org/wiki/Visitor_pattern ) がこの問題の有効な解決策であることがわかりました。ドメイン レイヤーでは MyRefactoredEnum.IVisitor インターフェースのみを定義し、他のすべてのレイヤーは独自の訪問者を実装します。

唯一の問題: MyRefactoredEnum.IVisitor インターフェイスを変更する場合 (たとえば、別の MyRefactoredEnum のサブクラスを追加したため)、ドメイン モデルを参照するすべてのプロジェクトとソリューションを変更して再コンパイルする必要があります。リフレクション ( http://surguy.net/articles/visitor-with-reflection.xml ) を使用して問題を解決できますが、遅くなる可能性があります...

列挙型をリファクタリングするためのより良いパターンはありますか?

PS: 私のひどい英語でごめんなさい :)

0 投票する
2 に答える
552 参照

php - 集約オブジェクトへのビジターパターンの実装

スカラーメンバーを持ち、同時にメンバー(コレクション)を集約するいくつかのオブジェクトにビジターパターンを適用するのに苦労しています。

これらは私が持っているオブジェクトです:

ご覧のとおり、構造も再帰的になりますが、それは後で気になります。;-)

私の質問は、ビジターパターンを実装するための最良の方法は何ですか。これにより、オブジェクトとその訪問可能な子(コレクション)のみを訪問できます。

私はこのようなインターフェースを作成しようと思いました:

次に、ArtistとWorkOfArtの両方に次のような抽象クラスを拡張させます。

最終的には、次のようなXMLファイルを書き出す具体的なVisitorを作成することが目標です。

アドバイスしてください:私はここで正しい方向に進んでいますか?getVisitableChildren()インターフェースが少し風変わりな感じがするからです。おそらく、ビジターパターンを完全に捨てて、別のアプローチを取るべきでしょうか?

ありがとう。

0 投票する
1 に答える
672 参照

c++ - ビジターパターンは、C ++でパラメータータイプを区別するための最速の方法ですか?

ビジターパターンは、C ++でメソッドパラメータータイプの識別(事実上、メンバーのクラスではなく、パラメーターに対する単一のディスパッチ)を実現するための最速の方法ですか?まだ知られていないサブタイプの要素で呼び出したい正確なメソッドを知っている可能性があるため、のように追加の仮想メソッド呼び出しを常に行うことV::visit(A *)A::accept(V &v) { v.visit(this); }望ましくありません。

次の機能と同等のものが欲しいのですが、O(1)コストが必要です。これはstd::type_info、constexpr / switchableにできないため、dynamic_cast <>またはtypeid()ラダーでは不可能なAFAIKです。

ここでの私のオプションは何ですか?アドバイスありがとうございます!

編集:異なるメソッドタイプに複数の署名が必要ないように、フィールドを介して結果をフィードするようにサンプルコードを変更しました。ありがとう、モーリス!

最終決定: Visitor Patternの必須のダブルディスパッチコストが気に入らないことに加えて、オーバーロードのインターフェイスの肥大化を避けたかったのfoo()ですが、これを行うための既知のクリーンなパターンはないと思います。私は結局、まっすぐな静的オーバーロードを実行して、それを1日と呼びました。とにかく、関数内にオーバーロードをカプセル化したいのは、せいぜい疑わしい目標でしょう。応答してくれてありがとう、モーリス。

0 投票する
2 に答える
2831 参照

c++ - shared_ptrおよびboost::static_visitorからboost::variantを作成するためのC++テンプレートメタプログラミング

個人的な演習として、shared_ptrを使用してビジターパターンを実装したいと思います。私はRobertMartinの非巡回ビジターペーパーに精通していますが、仮想accept()の煩わしい性質と、{X}クラスごとに{X}Visitorクラスを作成する必要があるのは不快です。{X} :: accept()と{X} Visitorを必要とせずにすべてのロジックをローカルにカプセル化するので、boost::static_visitorクラスが好きです。

私が探しているのは、以下で説明するテンプレート関数関数ripを作成する方法のヒントです(私が言ったように、これは演習として行っています)。私はそれが次の形式でなければならないと思います:

同様のことを行うチュートリアルへのヒントやポインタをいただければ幸いです。ありがとう。

0 投票する
4 に答える
2402 参照

design-patterns - Visitor デザイン パターンを使用する正当な理由はありますか?

似たような質問が既にあると言う前に、はい、知っています、読んだことがあります。しかし、そこでの質問はいつに焦点を当てているので、私はその理由に興味があります。

私は物事がどのように機能するかを理解しています。古典的な動物、犬、猫の例は常に魅力的です。

問題はこのコードです

私にはとても不自然に思えます。なんで?

つまり、そうです、この方法で犬と猫のモデルを区別しませ(英語でその単語を初めて使用します)。実際の実装は Sound クラスの下に隠されていますが、それは単にコードを重くする方法ではないからです。 ? このようなことを行うにはポリモーフィズムで十分ではありませんか?

私にとっての違いは、ポリモーフィズムでは各クラスを編集する必要があることです (ただし、モデルは同じままですよね?)。一方、ビジター デザイン パターンでは 1 つのクラスを編集するだけで済みます。

0 投票する
4 に答える
5768 参照

oop - コンポーネント ベースのゲーム エンジン設計におけるイベント処理

この質問またはそのバリエーションがたくさん出回っていると思うので、私が言っていることが重複していて、答えが他の場所にある場合は、お知らせください.

私はゲーム エンジンの設計を研究しており、コンポーネント ベースのエンティティ モデルに出会いました。有望に聞こえますが、私はまだその実装に取り​​組んでいます。

エンジンがいくつかの「サブシステム」で構成され、レンダリング、サウンド、ヘルス、AI などの側面を管理するシステムを検討しています。各サブシステムには、ヘルスのヘルス コンポーネントのようなコンポーネント タイプが関連付けられています。サブシステム。NPC、ドア、何らかの視覚効果、プレイヤーなどの「エンティティ」は、1 つまたは複数のコンポーネントで構成されており、それらを組み合わせることでエンティティにその機能を提供します。

情報伝達の 4 つの主なチャネルを特定しました。コンポーネントは現在のエンティティ内のすべてのコンポーネントにブロードキャストでき、コンポーネントはそのサブシステムにブロードキャストでき、サブシステムはそのコンポーネントにブロードキャストでき、サブシステムは他のサブシステムにブロードキャストできます。

たとえば、ユーザーがキャラクターを動かしたい場合は、キーを押します。このキーの押下は、入力サブシステムによって取得され、イベントがブロードキャストされ、プレーヤー サブシステムによって取得されます。次に、プレーヤー サブシステムは、このイベントをすべてのプレーヤー コンポーネント (およびそれらのコンポーネントが構成するエンティティ) に送信します。これらのプレーヤー コンポーネントは、独自のエンティティの位置コンポーネントと通信して先に進み、移動します。

キーを押すためのこれらすべては少し複雑に思えますが、私は確かにこのアーキテクチャの改善にオープンです。とにかく、私の主な質問はまだ続きます。

イベント自体については、訪問者パターンのようにイベントがどこで振る舞うかを考えました。私が望んでいることの重要性は、イベントがサポートしていないコンポーネントに遭遇した場合 (移動イベントは AI や健康とは直接関係がないため)、そのコンポーネントを無視することです。イベントが後を追っているコンポーネントを見つけられなくても、それは問題ではありません。

訪問者パターンはほぼ機能します。ただし、コンポーネントのすべてのタイプ (つまり、visitHealthComponent、visitPositionComponent など) に関係がない場合でも、仮想関数が必要になります。これらの関数を空のままにしておくこともできます (そのため、これらのコンポーネントに遭遇した場合は無視されます) が、コンポーネントを追加するたびに別の関数を追加する必要があります。

私の希望は、必ずしも他の場所に何かを追加することなくコンポーネントを追加し、他のものを台無しにすることなくイベントを追加できることでした.

だから、私の2つの質問:

  1. 効率や柔軟性などの点で、私の設計で可能な改善点はありますか?
  2. イベントを処理する最適な方法は何でしょうか?
0 投票する
1 に答える
95 参照

c++ - コンポーネントにビジターが必要ですか?

C++ (SDL を使用) で小さくてシンプルな GUI を作成しようとしています。柔軟なソリューションを実現するために、複合パターンを試しています。

Component オブジェクトを含む Widget クラスがあります。たとえば、 PaintingComponent があります。ボックスを描画する場合は、PaintingComponent を継承する PaintingBoxComponent を使用します。

理想的な Widget クラスは次のようになります。

私の質問は簡単です。必要なときにこのコンポーネントを有効にする最善の方法は何ですか?

最初に Widget クラスの「表示」機能を使用しました。しかし、次の 2 つの問題があります。

1°) ウィジェットの特定のコンポーネントを PaintingComponent として宣言する必要があるため、ウィジェットの「コンポーネント」の純粋なポリモーフィズムが失われています。ウィジェットを表示する必要があるのは論理的であるため、これに対処できます。

2°) さらに厄介なことに、メイン プログラムと PaintComponent の間で情報を渡す必要があります。SDL_Surface* スクリーンを PaintingComponent に渡し、描画した画像を描画するか、描画した画像を受け取る必要があるオブジェクトへの参照をコンポーネントに与えます (このオブジェクトは画像を描画します)スクリーン)。どちらの場合も、Widget はデータを処理する必要があり、SDL_Surface* が何であるかを知る必要があります。疎結合を失いつつありますが、それは望ましくありません。

そこで、「ビジター」パターンを使おうと考えたのですが、慣れないので実装する前にアドバイスをいただきたいです。

この場合、どのように柔軟で確実なソリューションを進めますか? 前もって感謝します !