問題タブ [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.
mysql - mysql、より良いプラクティス、またはサードパーティのソフトウェアでの訪問などを数えますか?
特定のページ/質問を見た訪問者の数をカウントしたいクォーラのようなWebサイトがあると仮定します...(「この質問は345回訪問されました」)
ユーザーがアクセスするたびに増加する値を格納する列を作成できることはわかっています。しかし、外部サービスを使用する場合はどうでしょうか...おそらくより堅牢で信頼性が高くなります(一意の/ページビューのフィルタリングなど)
なにか提案を?
(Google Analytics APIはどうですか?)
ありがとう!
design-patterns - AST が単なる配列の配列である場合、ビジターを使用する必要がありますか?
ASTを歩くために使用される Visitor パターンを見てきました。accept(visitor)
このパターンを使用するには、AST ノード オブジェクトにメソッドを追加します。このメソッドはvisitor.visit(self)
、ノードを「処理」して目的の結果 (AST のプリティプリント バージョンなど) を取得する呼び出しを呼び出します。
通常、メソッドを追加するにはノード自体を変更する必要があることに注意してください。しかし、AST が組み込みオブジェクトを使用している場合はどうでしょう。Ruby の Ripper ライブラリは、配列の配列として AST を返します。accept
次のようにメソッドを追加できます。
Arrayのドキュメントを見ると、現在メソッドがaccept
ないため、競合は発生しません。しかし、特に自分でライブラリを作成している場合、これは私には適切ではありません。他の人が依存している可能性のある組み込みオブジェクトを「汚染」したくありません。
ただし、これは Ruby に限ったことではなく、C# で拡張メソッドを追加して同様のことを行うことができます。
私の質問は次のとおりです。このシナリオで Visitor パターンを使用する必要がありますか、それとも、作業中のデータ型を単純に取り込んで必要な答えを返す再帰関数を作成する必要がありますか?
c++ - 訪問者またはノードでのASTトラバーサル?
Updateは、正しい方向を示したため、Ira Baxterの回答を受け入れました。コンパイル段階の実装を開始することで、実際に必要なものを最初に理解しました。ノード内をトラバースすると、不可能なアプローチになることがすぐに明らかになりました。すべてのノードにアクセスする必要はなく、一部のノードには逆の順序でアクセスする必要があります(たとえば、最初に割り当てのrhsを実行して、コンパイラーがタイプがrhs / operatorと一致するかどうかを確認できるようにします)。訪問者にトラバーサルを配置すると、これはすべて非常に簡単になります。
アプリケーションで使用されるミニ言語の処理の主要なリファクトリーを決定する前に、ASTなどで遊んでいます。レクサー/パーサーを作成しましたが、ASTを問題なく取得できます。ビジターもあり、具体的な実装として、元のソースファイルを再作成するだけのASTToOriginalを作成しました。最終的には、Vsisitorも実装し、実行時に実際のC ++コードを作成するある種のコンパイラーが登場するので、最初からすべてが正しいことを確認したいと思います。現在はすべて正常に機能していますが、トラバーサル順序はビジター自体に実装されているため、類似した/重複したコードがいくつかあります。
より多くの情報を調べるとき、いくつかの実装は、各具体的な訪問者でこれを繰り返さないために、代わりに訪問されたオブジェクト自体でトラバーサル順序を維持することを好むようです。同じように、GoFでさえこれについて簡単に話します。だから私もこのアプローチを試してみたかったのですが、すぐに行き詰まりました。説明させてください。
サンプルソースラインと対応するASTノード:
いくつかのコード:
ASTToOriginalの実装は非常に簡単です。すべての抽象Visitorメソッドは、ターミナルの名前または値のメンバーを出力するだけです。非終端記号の場合、それは依存します。条件付きの追加コードが必要なため、割り当ての印刷はデフォルトのビジタートラバーサルで問題なく機能します。
したがって、VisitorのConditionalのVisitメソッドとASTToOriginalの両方が実際に非常に似ていることがわかります。ただし、ノードにトラバーサルを配置してこれを解決しようとすると、事態が悪化するだけでなく、完全に混乱します。PreVisitメソッドとPostVisitメソッドを使用していくつかの問題を解決するアプローチを試しましたが、ノードにコードを追加するだけでした。また、閉じ括弧などをいつ追加するかを知るために、訪問者内のいくつかの状態を追跡する必要があるように見え始めました。
質問:このアプローチは私の場合には適していないのですか、それとも私は何か重要なものを見落としていますか?これらの問題に対処するための共通の設計はありますか?別の方向へのトラバーサルも必要な場合はどうなりますか?
javascript - 訪問者の JS エラーを追跡していますか?
訪問者が遭遇した JS エラーを追跡することはできますか? 明らかに独自のテストを行っていますが、訪問者が特定のブラウザ バージョンを実行していたり、特定のプラグインを使用していたりすると、JS エラーが発生することがあります。同様に、JS のエラーが見過ごされて本番環境に移行することもあります。
何らかの方法でこれらのイベントをキャプチャし、サーバー上のスクリプトをエラーの詳細とともに ajax して、問題の修正を試みることができれば、非常に便利です。
更新:
フィードバックをお寄せいただきありがとうございます。通常、投稿した後、次のことを見つけることができました:
Logging Clientside JavaScript Errors on Server
には、window.onerror に関する情報があり、JQuery と FireFox の onerror バグに関するいくつかの興味深いこともありましたが、まだ何年も修正されていません...
java - Java(またはバイトコード)ASTジェネレーターを使用できるので、結果に加えて数人の訪問者を実行できますか?
.javaソースコードファイル、または.classまたは.jarのいずれかを取得して解析し、AST(抽象構文木)を生成するツールを探しているので、それを試してみることができます。その上を走るビジターを何人か作成するつもりです。
そのようなツールはJavaに存在しますか?.NETには、Mono.Cecilと呼ばれる同様の機能があります(現在のところ、Visitorパターン自体はサポートされていないようです)。
ありがとう
c++ - constおよびnon-const訪問のコード重複を回避するC++
すべてのメンバー変数に対してvisitorメソッドを呼び出す必要があるクラスがあります。このようなもの:
void accept() const
コードを重複させずに同じコードでメソッドを取得するにはどうすればよいですか?
重複の明らかな解決策は、メソッドを追加することです。
そのメソッドはまさに私が望む意味を持っていますが、コードの重複を避けたいと思います。両方のメソッドを使用する理由は、「読み取り」ビジターが変数を読み取り、メソッドを適切に実行できるようにするためaccept
ですconst
。accept
そうすれば、non-constは訪問者の「書き込み/更新」に使用できるようになります。
c# - C#で子ビジターを使用する
私はテストコンポーネントをセットアップし、それを汎用的に維持しようとしています。一般的なVisitorクラスを使用したいのですが、子孫クラスの使用についてはよくわかりません。
例:
C#コンパイラがUSB_Read_Visitor
コードフラグメントによって実行されるメソッドを決定するために使用するルールは何ですか?
テストコンポーネントの依存関係を除外しようとしています。残念ながら、現在のVisitorクラスにはvisit
、テストコンポーネントに関連しないクラスのメソッドが含まれています。私は不可能を達成しようとしていますか?
session - GoogleAnalyticsのコンテンツドリルダウンでフォルダへのセッションを追跡する
数千ページのサイトにGAを使用しています。私は私がそれに深く入るまで簡単に聞こえる私たちのサイトで最も人気のあるコンテンツを見つけるように頼まれました。
情報を得るために、さまざまなデータベースがサイトに接続されています。1つは私たちのビジネスディレクトリにリストされているビジネスをリストし、もう1つは私たちの墓地に埋葬された人々の墓地の記録をリストします。もう1つはプロパティデータです。これらの各データベースには、何千ものレコードが含まれています。
家族の調査をしている場合は、座って墓地検索を使用し、さまざまな名前や検索レコードなどを検索できます。1回のセッションで100件のレコードを表示できますが、あなたは1人だけです。セッションでは、ビジネスディレクトリにアクセスしたり、プロパティデータを検索したりすることはできません。
別の訪問者が訪問し、セッション中にビジネスを検索して情報を見つけ、セッションを閉じることができます。他に10人が同じことをしてビジネスを検索してから離れる場合、11人(訪問者/セッション)が1人だけが使用した場所でビジネスディレクトリを使用したため、ビジネスディレクトリは墓地データベースよりも人気があります。墓地。
明らかに、これは非常に単純な例です。サイトにはコンテンツだけのページが他にもあるからです。リンクをクリックしてコンテンツを表示し、別のリンクをクリックするなど...
コンテンツドリルダウンレポートを実行すると、セッションで100ページが表示されたため、墓地フォルダーが非常に人気があることがわかります。たった一人だったので、これは誤解を招きます。
だから.....ページビューではなく、訪問者に基づいて既存のデータのコンテンツレポートを作成するにはどうすればよいですか?ほとんどのコンテンツは独自のフォルダーに分割されているため、理想的にはフォルダーごとです。
簡単そうに聞こえますが、情報が見つからないようです。
ありがとう!
c++ - ビジターインターフェースをイテレーターインターフェースに適合させる方法は?
以下を実現するための良い設計パターンまたはイディオムがあるかどうか疑問に思っています。
次のように、ビジター インターフェイスのみを提供する既存のクラスがあります。
そして、次のように使用できるインターフェイスが必要です。これは、訪問者が
visit
関数を呼び出すのと同じ順序でツリーを反復する必要があります。
問題は、 を呼び出すだけvisit
では制御不能になり、一時的にループ本体に「戻って」1 つのノードのアクションを実行できないことです。これは、実際のプログラムでは定期的に発生するはずです。それを解決する方法はありますか?
python - ast.NodeVisitorを使用してPythonASTのノードに2回アクセスしたり、トラバーサルの順序を変更したりすることはできますか?
NodeVisitorは、ASTの深さ優先を最初にトラバースし、Enter時に各ノードに1回だけアクセスします。したがって、それで何か深刻なことをするのは問題があります。デフォルトの動作を変更することは可能ですか?