FreeMarker在TemplateLoader的设计缺陷

在设计MeteorTL的TemplateLoader时,借鉴了下FreeMarker,
FreeMarker的TemplateLoader:
[code]
public interface TemplateLoader {

public Object findTemplateSource(String name) throws IOException;

public long getLastModified(Object templateSource);

public Reader getReader(Object templateSource, String encoding) throws IOException;

public void closeTemplateSource(Object templateSource) throws IOException;

}
[/code]
初读此接口很费解,这是一个留给扩展者的SPI,但却让扩展者要看完那长篇的注释才能明白那个Object是干什么的。

TemplateLoader的第一目标是要通过模板name拿到Reader,
最初的想法肯定是:
[code]
public interface TemplateLoader {

public Reader getReader(String name, String encoding) throws IOException;

}
[/code]
但实现时,会发现Reader无法持有一些meta数据,如:用于热加载时比较是否更新用的lastModified时间等。

所以freemarker才会有上面的写法,用一个Object(大部分时候是File)传递,也就是 findTemplateSource(String name) 的返回值 Object templateSource 会被框架(接口调用者)通过参数回传给下面的三个函数。以至于此接口的契约依赖于框架的具体实现(即所有此接口的调用者,都应该遵守回传templateSource,而这些都是文档约束的)。

重构如下:
[code]
import java.io.IOException;

public interface TemplateLoader {

public TemplateSource getTemplateSource(String name) throws IOException;

}
[/code]

[code]
import java.io.IOException;
import java.io.Reader;

public interface TemplateSource {

public static final long UNKOWN_TIME = -1;

public long getLastModifiedTime();

public Reader getReader(String encoding) throws IOException;

public void close() throws IOException;

}

[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值