知识卡片
模板视图避免scriptlet的关键:条件逻辑该在辅助对象里判断好
内容
模板视图把动态内容标记直接嵌入静态HTML页面,让页面本身继续保持”能被非程序员用所见即所得工具编辑”的特性;避免它退化成一堆scriptlet的关键做法,是给每个页面配一个常规的辅助对象承载全部真实的程序逻辑,页面里只调用这个对象、不写逻辑本身——作者认为往网页里塞大量scriptlet是他近年见过最糟糕的代码,因为页面结构天生丧失了面向对象/过程式编程该有的模块化能力,还容易混淆企业应用不同层次的职责,让领域逻辑散落在各个服务器页面之间反复复制。最棘手的场景是条件显示:如果直接在页面里写类似<IF condition="$pricedrop>0.1">这样的条件标签,本质上是把模板变成了一种编程语言,重新引入了scriptlet的全部问题。更好的做法是把判断逻辑挪进辅助对象——辅助对象直接根据条件返回”该显示的内容”或者一个空字符串,页面只管把辅助对象返回的东西原样放进去,完全不用理解这个条件本身是什么;如果确实需要在页面层面做某种标记级别的条件判断(比如高亮显示销量好的产品),也应该基于辅助对象暴露出来的一个单一布尔属性来做(比如判断”是否该高亮”这一个布尔标志),而不是让页面自己拼凑更复杂的判断表达式——一旦页面里出现比”读一个布尔值”更复杂的表达式,就等于往页面里添加了逻辑,这是应该尽量避免的信号。可迁移启发:任何”配置驱动”或”模板驱动”的系统里,判断该不该在模板层暴露一个条件分支的试金石是——这个分支需要的判断依据能不能被简化成一个提前算好的布尔值;如果答案是否定的,说明这段判断逻辑本该留在代码层,而不是下放进模板。
参考来源
- 位置:《企业应用架构模式》第二部分"模式"之"第14章 Web表现模式"之"14.4.1 运行机制"(源文件:_epub-src/OEBPS/Text/000166.html)
- 结论依据:原文说明"如果你正在有条件地显示某些文本,一个选择是把条件放在辅助对象中……在上面两段代码中,重要的一点是,条件是在辅助对象的单个布尔属性基础上建立的。在网页中放置一些较复杂的表达式实际上就是给网页本身添加逻辑",直接支撑本卡结论。
- 原始内容:如果需要完全使用编程语言,你也许会使用scriptlet,但你应该知道,我并不看好这种编写方式……在网页中放置一些较复杂的表达式实际上就是给网页本身添加逻辑。