2

我正在创建一个模板引擎基准程序。最初,该程序旨在通过返回渲染结果(作为字符串)来测试模板引擎。然而,一些模板作者提出了一个担忧,即模板引擎不应该返回一个字符串作为结果,而是应该接受一个输出流或写入器实例作为参数并将渲染结果合并到它们中。他们声称该案例代表了正在使用的模板引擎的真实环境。

ASAIK,这个说法不是百分百正确的。Play!Framework(至少 1.x)要求模板引擎返回一个字符串,然后将它们放入输出流中。而且我认为以这种方式组织它是合理的。想想如果任何逻辑错误导致你的模板渲染过程失败,如果你的模板引擎直接输出到响应中,那么错误就变得不可恢复了。在 Play 中,您有很好的机会将响应定向到优雅的系统错误页面,而不是让浏览器运行一半混乱的数据。

另一方面,直接渲染成输出对性能和资源消耗有明显的好处。我很好奇哪一个应该是模板引擎设计师的更好方法。

4

2 回答 2

1

写入 a Writer,因为这是最小的公分母。为方便起见,您的算法可能更喜欢将其包装在 aPrintWriter中,这样您就可以自由地接受 a FileWriterOutputStreamWriterStringWriter.

写入字符串似乎是个坏主意,因为在现实世界的使用中,您不太可能需要保留整个字符串以进行后期处理,而是让您能够以小的逻辑片段写入或发送文档 - 因此您的内存消耗图案会更逼真。

请记住,如果您接受 Writer,则可以使用 StringWriter 来获取 String。如果您使用字符串,即使 Writer(和流 API)就足够了,您也被迫永远分配该内存。

于 2013-01-25T09:02:36.880 回答
1

在我看来,由于返回一个字符串可能会导致您出现各种性能问题(从需要尽快返回响应时的​​输出延迟到有人编写 HUGE 模板时的内存问题),因此您绝对应该使用流方法。

我也不同意不可恢复的错误点。例如,您可以向模板引擎添加一个配置选项以“缓冲”正在进行的模板(通过使用缓冲的输出流到文件/内存,并且在完成之前不向“真实”输出流写入任何内容)。在这种模式下,您可以实现完全相同的错误逻辑。当然,默认情况下应该关闭此模式 - 以提高性能。

于 2013-01-25T09:03:16.033 回答