0

次のような文字列を解析しています:

\read(customer) hello world


~> \method(arg, arg, ...)

requestLeaf オブジェクトである1からn 個の引数を永続化する複合データ構造に変換します。この引数はrequestLeaf オブジェクト(プレーン テキストの場合は、上記のように返される必要があります ("hello world")) または別のrequestComposite オブジェクト(再びプレーンテキストになるまで(読み取り->顧客など)何らかの計算が行われている場合。

requestComposite Object
(
  [requests:protected] => Array
      (
          [0] => commandRequest Object
              (
                  [methodName:protected] => read
                  [arguments:protected] => Array
                      (
                        [0] => commandRequest Object
                          (
                            [methodName:protected] => text
                            [arguments:protected] => customer
                          )
                      )
              )
          [1] => commandRequest Object
              (
                  [methodName:protected] => text
                  [arguments:protected] =>  hello world
              )
      )
)

私が達成したいのは、コンポジット全体をループして、ある種のドキュメントをレンダリングすることです。

最初のコンポジットの引数またはリーフは、ドキュメントに出力するためのルートまたはレベル 0 を表しています。 これにはライブラリを使用したいと考えています。このライブラリは、テキスト、画像などの印刷を処理できますが、何も評価できません!

すべて> レベル 0は、別のライブラリで計算する必要があります。
このライブラリは、メンバー値を読み取り、計算などを行い、最終的な値 (文字列のみ) をルートに返して出力することができます。
他のすべては、たとえば \img() または \text() を介して明示的に出力されます

あるかもしれません

\read(x)

メンバー値 X をルックアップするためのトークン
。値は暗黙的に出力されます (別の \text() にラップせずに)!

次のように、指定されたメンバー リストを介して引数をループする \list() トークンがある場合があります。

\list(\read(x)))

X は別の Y である可能性があります

\list(\read(\read(y))).

つまり、構造がどこまで深くなるかわからないということです。

私は、特にデザイン パターンと OO にかなり慣れていません。レンダリング/出力ライブラリと計算ライブラリがハンドラーチェーンを構築している「実行」のための責任
パターン のチェーンをいじっています。 しかし、CoR が本当に私のニーズを満たしているかどうかについては、少し興味があります。

このような問題をどのように解決しますか?

編集:今のところ私のアプローチ

  1. コンポジットを反復します。出力ライブラリ計算ライブラリ を含むMediatorオブジェクトを
    渡します。

  2. 現在のリーフがテキストの場合
    、現在がルートであるかどうかをチェックする
    NO の場合、計算ライブラリにアクセスして実際の値を評価し、関係する人に渡します (例: \read()、\varput()、...)
    YES の場合、それを印刷するための出力ライブラリ

私の頭に浮かぶのは、自動ルート印刷を実現するには、両方のライブラリにすべての requestMethod を実装する必要があるということです。つまり、出力の
\read() はテキストをドキュメントに出力
し、計算ライブラリの \read() はメンバー値を検索する必要があります。

ここで物事を過度に複雑にしていますか?

4

1 に答える 1