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

c# - C# で参照している Mono.Cecil の次の構成要素は何ですか?

誰かがこれらが何を指しているのか説明してくれますか?

例を挙げて説明できれば理想的です。

でビジターパターンを書こうとしていMono.Cecilます。

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

ruby - Rubyのビジターパターン、または単にブロックを使用しますか?

ねえ、私はここでビジターパターンをいつ/どのように使用するかに関するいくつかの投稿とそのいくつかの記事/章を読みました、そしてあなたがASTを横断していてそれが高度に構造化されていてそしてあなたがカプセル化したいならそれは理にかなっていますロジックを別の「ビジター」オブジェクトなどに変換します。しかし、Rubyでは、ブロックを使用してほぼ同じことを実行できるため、やり過ぎのように見えます。

Nokogiriを使用してxmlをpretty_printしたいと思います。著者は、ビジターパターンを使用することを推奨しました。これには、FormatVisitorなどを作成する必要があるため、「node.accept(FormatVisitor.new)」とだけ言うことができます。

問題は、FormatVisitorのすべてのもののカスタマイズを開始したい場合はどうなるかです(たとえば、ノードのタブ付け方法、属性の並べ替え方法、属性の間隔などを指定できます)。

  • あるとき、ノードにネストレベルごとに1つのタブを設定し、属性を任意の順序にする必要があります
  • 次回は、ノードに2つのスペースを設定し、属性をアルファベット順に設定します。
  • 次回は、スペースが3つ、1行に属性が2つあるものが必要です。

私にはいくつかの選択肢があります:

  • コンストラクターでオプションハッシュを作成します(FormatVisitor.new({:tabs => 2})
  • ビジターを作成した後に値を設定します
  • 新しい実装ごとにFormatVisitorをサブクラス化します
  • または、訪問者ではなく、ブロックを使用します

FormatVisitorを作成して値を設定し、それをnode.acceptメソッドに渡す代わりに、次のようにします。

p>

これは、ビジターパターンが次のように見えると私が感じるものとは対照的です。

p>

ビジターパターンが間違っているかもしれませんが、ルビーで読んだことからすると、やり過ぎのようです。どう思いますか?どちらの方法でも問題ありません。皆さんがそれについてどう感じているのか疑問に思っています。

どうもありがとう、ランス

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

java - Eclipse JDT ASTVisitor - フィールドがメソッドで読み取られているか書き込まれているかを確認する方法は?

私はEclipse ASTVisitorを書いています。フィールドがメソッドで読み取られているか書き込まれているかを確認する方法は?

提供されたアイデアは、「Assignment ノードを表示する必要があります。LHS 式のフィールドが書き込まれ、RHS 式のフィールドが読み取られる」というものでした。

割り当てにアクセスして、どちらも Expression である LHS と RHS を取得した後、Expression にフィールドが含まれているかどうかを確認するにはどうすればよいですか?

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

c# - C# のビジター パターンでポリモーフィズム (ない) が壊れている (オーバーライドではなく新しい)

次のコードがあります。

Accept(Visitor v) 呼び出し時にメソッドが選択される 理由はありますか new Node().Accept(new VisitorSpecial())

更新: OK、悪いことに、オーバーライドの代わりにビジターで「new」を使用していることに気付きました。これで、「new breaks polymorphism」の理由がわかりました。これは私の質問を完全にばかげています。助けてくれてありがとう。

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

.net - VB.NET からの厳密な制限

こんにちは、訪問メソッドを装飾することなく、訪問者パターンを同様に実装する方法を模索しています。私は VB.NET で Option Strict Off を使用できることを知りましたが、いくつかの副作用があります。基本クラスの Shape から継承する一連の Shape クラスがあります。Accept の形状を表す次のクラスがあるとします。

これは、Option Explicit がオフになっている場合に機能します。ただし、別の方法で AcceptShape メソッドを呼び出すプログラムはコンパイルされますが、実行時例外が発生します。これをコンパイル時のエラーにするにはどうすればよいでしょうか?

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

java - テーブル行のデータ構造を処理するための最適なパターンは何ですか?

事実

テーブルと属性のリスト(簡略化)で構成される次のデータ構造があります。

今、このデータ構造でさまざまなアクションを実行したいと考えています:

  • XML表記で出力する
  • テキスト形式で印刷する
  • SQL 挿入ステートメントを作成する
  • SQL 更新ステートメントを作成する
  • SQL結果セットから初期化する

初挑戦

私の最初の試みは、これらすべての機能を 内に配置することでしAttributeたが、その後、Attributeは非常に異なる責任で過負荷になりました。

代わりにビジター パターンが非常にうまく機能するように思えますが、逆に言えば、この単純な構造にはやり過ぎのように見えます。

質問

これを解決する最もエレガントな方法は何ですか?

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

c++ - 訪問者パターンのノードに状態を保存する方法は?

私は、ビジター パターンを使用してツリー上に多数のパスを実装するアーキテクチャを持っています (発生した場合の AST)。パスの 1 つで、いくつかのデータをノード ( ) に関連付ける必要があり、そのnodeX下のあるポイントから、 への参照からデータを取得しますnodeX。ビジター/パスの実装をツリーノードにプッシュしない方法でこれを行いたいです。

それを機能させるためのきちんとした方法はありますか?

アイデア:

  • void*各ノードで(醜い、タイプセーフではない)
  • hash_map<Node,Data>(私が望むほどきれいではありません、そして誰がそれを所有していますか?)
0 投票する
1 に答える
481 参照

java - Java と C++ でのダブル ディスパッチとビジター パターンの違い

二重発送と来客パターンの違いはありますか?

私は Java と C++ を使用していますが、この 2 つに違いがあるのではないかと考えています。

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

f# - F# での式の最適な表現

私は、LINQ 式 (基本的には LINQ-to-SQL の変更されたサブセット) から SQL を生成するライブラリに取り組んでいます。私は判別共用体を使用して SQL 式をモデル化していますが、いくつかの (認識されている?) 制限に遭遇しました。次のようなことをしたい(最後の行に注意してください):

私は次のことができます:

...最後の 2 行を次のように変更します。

しかし、これには次の 2 つの問題があるようです。

  1. SqlOrderByExpression は SqlExpression ではありません。これにより、ビジター パターンの使用が難しくなります (ここに問題があるのではないでしょうか?)。つまり、Select 式をトラバースするときに、各式を Visit(expr:SqlExpression) に渡す order by 式のリストを反復処理することはできません。

  2. SqlOrderByExpression は単なるタプルの型エイリアスであるため、型情報は保持されません。それは読みやすさIMOを傷つけます。

これをモデル化するより良い方法はありますか?継承ルートを試してみましたが、DU の方が作業がはるかに簡単だと思います (前述の難しさを除けば)。

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

java - Visitor パターンを使用したツリー変換

(免責事項: これらの例は、コンパイラを構築するという文脈で与えられていますが、この質問はすべてビジター パターンに関するものであり、コンパイラ理論の知識は必要ありません。)コンパイラの理論を独学で学んでいますが (いや、これは宿題ではありません)、彼がビジター パターンを使用して AST を IR ツリーに変換する方法を理解するのに苦労しています。(注: Python でこれを行っているので、Python も学習できます。これが、次の例が Java ではない理由です。) 私が理解しているように、Visitor パターンの visit メソッドと accept メソッドは設計により void 型になっています。だから私が何かを持っているなら

次に、次のようなビジターメソッドを記述できるようにしたいと思います

これにより、2 つの子式が IR に変換され、プラス式を表す BINOP にリンクされます。もちろん、追加情報を返すようにすべての受け入れ関数を変更しない限り、これは不可能です。また、何も返さない印刷ビジターが必要な場合があるため、これも面倒です。それでも、このテキストでは、ビジターが正しい方法であると主張しています。Java では、Python の柔軟性がなくても実行できることを意味します。信じられないほどハックではない解決策は考えられません-意図した設計について誰かが私に教えてくれますか?