-5

ご列席の皆様。

Closure Templates に関する Google のドキュメントを読んでいました。

そこにはそれほど多くのコードはありませんが、私が理解するのに苦労していることを表しています (特に Java で)。私は行ごとに行きます:

// Bundle the Soy files for your project into a SoyFileSet.
SoyFileSet sfs = new SoyFileSet.Builder().add(new File("simple.soy")).build();

私はこれを取得します。複数のテンプレート ファイルを収集するためのオブジェクト。罰金。しかし、なぜ.Builder()ですか?だけではないのはなぜnew SoyFileSet().add(...).build()ですか?

// Compile the template into a SoyTofu object.
// SoyTofu's newRenderer method returns an object that can render any template in file set.
SoyTofu tofu = sfs.compileToJavaObj();

罰金。しかし、なぜ私はこれが欲しいのですか?ファイルを集めた後、私はのようなものを期待していましたsfs.render(Map<> data). これを Java オブジェクトにコンパイルする必要があるのはなぜですか?

そして最後に...

// Call the template with no data.
System.out.println(tofu.newRenderer("examples.simple.helloWorld").render());

なるほど、メソッドを呼び出すためだけに中間オブジェクトを作成する必要があるのはなぜですか? sfsオブジェクトが.render()メソッドを持つことができなかったのはなぜですか? Rendererオブジェクトが必要な理由

Java はイライラします。単純な方法で物事が行われないのはなぜですか?

4

2 に答える 2

6
  1. SoyFilesetはおそらく不変オブジェクトなので、 aBuilderを使用して 1 つのステップでビルドします。ところで、あなたの「なぜ」の反例は、 で終わるのであまり意味がありませんbuild。あなたの場合、いいえbuildは必要ありません。

  2. SoyTofuは、作成に時間とスペースがかかる重量級のファクトリ オブジェクトです。何度も再利用してレンダラーを作成したい。そのため、別の手順で作成してから保持します。

  3. newRendererレンダリングはかなりの内部状態を含む複雑なプロセスであるため、 が必要です。オブジェクトのRendererインスタンス変数は、プログラム フローがそのメソッドを蛇行するときにその状態が保持される場所です。また、レンダリングがどのように行われたかを確認したり、レンダリングの前に追加の情報/構成を提供したりするために、おそらくレンダラーでいくつかのライフサイクル/状態メソッドを取得するでしょう。

これは、事前に構築された、重く、不変で、スレッドセーフで、長寿命のファクトリ オブジェクトと、不変の状態を共有する軽量で非スレッド セーフで、変更可能で、使い捨てのオブジェクトとの間で作業を分割する、古典的なパターンの例です。単一のスレッドで 1 つのタスクを実行するためのファクトリであり、その後破棄されます。

結論として、これらはすべて、よく設計された業界強度の API の兆候です。Java は必ずしもそのように見えるわけではありませんが、単純なアプローチを採用すると、パフォーマンスが低下するか、メモリが不足することさえあります。

于 2012-07-12T11:51:33.280 に答える
6

および同様の名前のメソッドはBuilderファクトリ デザイン パターンの一部として使用されます。これは、何らかの理由でオブジェクトの作成を集中化する必要がある場合に役立ちます。たとえば、ファクトリは効率上の理由からオブジェクトのプールを内部的に保持しており、毎回新しいインスタンスを返さない場合があります。Factory

于 2012-07-12T11:57:28.647 に答える