問題タブ [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 投票する
2 に答える
584 参照

c# - C#でObjective-Cカテゴリをエミュレートする簡単な方法はありますか?

今まで経験したことのない奇妙な設計状況があります... Objective-C を使用していた場合は、カテゴリで解決しますが、C# 2.0 を使用する必要があります。

まず、いくつかの背景。このクラス ライブラリには 2 つの抽象化レイヤーがあります。最下層は、コンテンツをスキャンするコンポーネントのプラグイン アーキテクチャを実装します (申し訳ありませんが、それ以上具体的にはできません)。各プラグインは独自の方法でスキャンを行いますが、受け入れるコンテンツの種類によってプラグインが異なる場合もあります。この議論とは関係のないさまざまな理由から、プラグイン インターフェイスを介して Generics を公開したくありませんでした。そのため、コンテンツ タイプごとに IScanner インターフェイスと派生インターフェイスを作成しました。

最上層は、さまざまな部分を含む複合コンテンツ形式を受け入れる便利なラッパーです。スキャナーが異なれば、関心のあるコンテンツ タイプに応じて、コンポジットのさまざまな部分が必要になります。したがって、必要な関連部分を探して、コンポジット コンテンツを解析する IScanner 派生インターフェイスごとに固有のロジックを用意する必要があります。

これを解決する 1 つの方法は、単純に別のメソッドを IScanner に追加して、各プラグインに実装することです。ただし、2 層設計の要点は、プラグイン自体が複合フォーマットについて知る必要がないようにすることです。これを解決するための強引な方法は、上位層に型テストとダウンキャストを配置することですが、将来的に新しいコンテンツ タイプのサポートが追加されるため、これらは慎重に維持する必要があります。実際には Visitor は 1 つしかないため、Visitor パターンもこの状況では扱いにくいですが、さまざまな Visitable タイプの数は時間の経過とともに増加するだけです (つまり、これらは Visitor が適している反対の条件です)。さらに、IScanner のシングル ディスパッチをハイジャックしたいだけなのに、ダブル ディスパッチはやり過ぎのように感じます。

Objective-C を使用している場合は、IScanner から派生した各インターフェイスでカテゴリを定義し、そこに parseContent メソッドを追加します。カテゴリは上位層で定義されるため、プラグインを変更する必要はなく、同時に型テストの必要もありません。残念ながら、C# 拡張メソッドは基本的に静的であるため機能しません (つまり、呼び出しサイトで使用される参照のコンパイル時の型に関連付けられており、Obj-C カテゴリのような動的ディスパッチにフックされていません)。言うまでもなく、C# 2.0 を使用する必要があるため、拡張メソッドを使用することさえできません。:-P

この問題を C# で解決するためのクリーンでシンプルな方法はありますか。


編集:現在の設計の構造を明確にするのに役立ついくつかの擬似コード:


編集: 明確にするために、私はこのデザインについてすでに多くのことを考えてきました。私には多くの理由がありますが、そのほとんどを共有することはできません。興味深いのですが、元の質問をかわしているため、まだ回答を受け入れていません。

実際、Obj-C では、この問題をシンプルかつエレガントに解決できました。問題は、C# で同じ手法を使用できるかということです。代替案を探すのは構いませんが、公平を期すために、それは私が尋ねた質問ではありません。:)

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

c# - C#のジェネリックスでビジターパターンを使用する

以下がビジターパターンの許容可能な使用法であるかどうかを知りたいです。Accept()またはVisit()呼び出しから戻るのは少し不快に感じます-これはこのパターンの適切な使用法ですか?そうでない場合は、なぜですか?

注:長いコードサンプルについてお詫びします。訪問者は常に少し関与しているように見えるので、私が行っていることを理解するために必要なようです...

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

design-patterns - 訪問者パターンで子を列挙する責任があるのはなぜですか?

私が見つけたコードに基づいて、訪問者は訪問したオブジェクトの構造を知り、必要な子を呼び出す必要があるようです。これは、訪問したクラスが変更された場合でも、訪問者が作業を継続したい場合に少し不格好に思えます。

本当の質問は次のとおりだと思います:訪問者のコードではなく、訪問したコードによって列挙が行われるパターンですか?

0 投票する
3 に答える
214 参照

visitor-pattern - 訪問者パターンで「場所」情報をどのように渡す必要がありますか?

このような訪問者がいるとしましょう

AChild と BChild はまったく同じ型にすることができますが、訪問コードはそれらを区別する必要があります (AChild では BChild とは異なる動作をする必要があります)。これを行う最善の方法は何ですか?

  • 訪問者に状態を設定し、次の呼び出しでそれを確認します
  • 各子に異なる訪問者を渡す
  • 他の?

すみません、最初は逆にしました (現在Acceptは でしたVisit)。Wikipedia に示されているパターンと一致するようになりました。

すべての訪問方法は次のようになります。

0 投票する
3 に答える
332 参照

count - Web アプリケーションで信頼性の高い堅牢なページ ビュー カウンターを作成する方法は?

Web ページの訪問数をカウントしたいのですが、このページは、スタック オーバーフローの質問ページ ビューと同様に、モデルの要素を表しています。

信頼性が高く(1回の訪問、1回のページビュー、繰り返しなし)、堅牢(新しいテーブル属性「visits_count」だけでなく、パフォーマンスを考慮)でこれを行う方法

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

asp.net - ビジターカウンターの実装

私は初心者で、C# 2005 で ASP .Net 2.0 を使用して Web サイトを開発しています。私のウェブサイトへの訪問者の数。Global.asax を使用して、この機能を追加するための基本情報を収集しました。system.web セクションの下に行 "" を追加して、Web.config を変更しました。

訪問者数を保持するためにテーブルを使用しています。しかし、タスクを完了する方法がわかりません。デフォルトの Global.asax ファイルには、Application_Start、Application_End、Application_Error、Session_Start、および Session_End というさまざまなセクションが含まれていました。Application_Start セクションでカウンターの現在の値を抽出し、グローバル変数に格納しようとしました。Session_Start のカウンターをインクリメントし、変更された値を Application_End のテーブルに書き込みます。

パブリック サブルーチン/関数を使用しようとしました。しかし、これらのサブルーチンはどこに配置すればよいのでしょうか? Global.asax 自体にサブルーチンを追加しようとしました。しかし、Global.asax に Data.SqlClient への参照を追加できず、機能を実装するには SqlConnection、SqlCommand、SqlDataReader などへの参照が必要なため、エラーが発生しています。サブルーチンごとに Class ファイルを追加する必要がありますか? 私を案内してください。

また、ウェブサイトに追跡機能を実装し、ウェブサイト訪問者の IP アドレス、使用したブラウザ、訪問日時、画面解像度などを保存したいと考えています。どうすればいいですか?

提案を待っています。

ラリット・クマール・バリク

0 投票する
3 に答える
829 参照

c# - 訪問者パターン、キャストの必要性を排除

訪問者パターンについて質問があります。現在、2 つのアセンブリがあります。私の最初のアセンブリには、いくつかのインターフェイスが含まれています。

そして私の2番目のアセンブリ

私がしたいのは、ContainerVisitor クラスでキャストする必要を避けることです。Container を直接参照したいと思います。インターフェイス INodeVisitor インターフェイスを Container を使用するように変更できません。何か案は?キャストするだけでいいですか?

乾杯

ローハン

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

java - 一般的に再帰的な自己型の値のJavaフィールド型?

基本クラスが再帰的な自己型を定義するクラス階層があるとします。

A の任意のサブクラスを保持できるフィールドを使用して、別のクラス (T はオブジェクトの存続期間にわたって変化する可能性があるため、T ではジェネリックであってはなりません) を宣言するにはどうすればよいですか?

以下は機能しません。

-- 質問の終わり --

多くの StackOverflow メンバーが、特定の難しい質問に「そもそもなぜそんなことをしているのですか?」とアプローチする傾向があることに気付きました。以下は、このパターンの使用を正当化するものです。Java 標準ライブラリでは、Enum クラスの定義で再帰的な自己型も使用されていることに注意してくださいEnum<E extends Enum<E>>。この質問は、「 type のフィールドを定義する方法」と同様に尋ねることができますEnum<?>

正当化の例:

サブクラスで:

並列クラス階層にバインド:

Bifyer インターフェイスの実装によって管理される B インスタンスの生成:

このインターフェイスの実装は、B に対して BSub1 または BSub2 を返す場合があります。これは基本的に、Bifyer がビジターである Visitor パターンのアプリケーションですが、標準の Visitor とは異なり、accept メソッドは void ではなく値を返します。これにより、さまざまな Bifyer 実装を指定して、Bify メソッドの代替動作と戻り値の型 (たとえば、B のサブクラスごとに 1 つ) を提供できるモジュラー フレームワークが提供されます。