FreeMarker在TemplateLoader的设计缺陷
在设计MeteorTL的TemplateLoader时,借鉴了下FreeMarker,
FreeMarker的TemplateLoader:
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; }
初读此接口很费解,这是一个留给扩展者的SPI,但却让扩展者要看完那长篇的注释才能明白那个Object是干什么的。
TemplateLoader的第一目标是要通过模板name拿到Reader,
最初的想法肯定是:
public interface TemplateLoader { public Reader getReader(String name, String encoding) throws IOException; }
但实现时,会发现Reader无法持有一些meta数据,如:用于热加载时比较是否更新用的lastModified时间等。
所以freemarker才会有上面的写法,用一个Object(大部分时候是File)传递,也就是findTemplateSource(Stringname)的返回值ObjecttemplateSource会被框架(接口调用者)通过参数回传给下面的三个函数。以至于此接口的契约依赖于框架的具体实现(即所有此接口的调用者,都应该遵守回传templateSource,而这些都是文档约束的)。
重构如下:
import java.io.IOException; public interface TemplateLoader { public TemplateSource getTemplateSource(String name) throws IOException; }
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; }
相关推荐
Lzs 2020-10-23
聚合室 2020-11-16
零 2020-09-18
Justhavefun 2020-10-22
jacktangj 2020-10-14
ChaITSimpleLove 2020-10-06
Andrea0 2020-09-18
周游列国之仕子 2020-09-15
afanti 2020-09-16
88234852 2020-09-15
YClimb 2020-09-15
风雨断肠人 2020-09-04
卖口粥湛蓝的天空 2020-09-15
stulen 2020-09-15
pythonxuexi 2020-09-06
abfdada 2020-08-26
梦的天空 2020-08-25