浏览 2041 次
锁定老帖子 主题:CT重构-充实模板域模型
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-24
http://www.commontemplate.org)的模板域模型中, 包含两个解析树结构:
在CommonTemplate(一、指令树: Directive (指令, 接口) Text (文本块,内置) Comment (注释块,内置) LineDirective (行指令,可扩展) BlockDirective (块指令, 接口) StartBlockDirective (起始块指令,可扩展) MiddleBlockDirective (中间块指令,可扩展) EndDirective (结束指令,标识) 二、表达式树: Expression (表达式, 接口) Constant (常量,内置) Variable (变量,内置) Operator (操作符, 接口) UnaryOperator (一元操作符,可扩展) BinaryOperator (二元操作符,可扩展) Parenthesis (括号,标识) 接口:归类接口 内置:编译器内置实现。 可扩展:用户可扩展实现。 标识:不出现在编译结果树中。 已暴露在core包中的有: 指令树中的: Directive,BlockDirective 表达式树中的: Expression,Operator,UnaryOperator,BinaryOperator 现准备将: 指令树中的: Text, Comment 表达式树中的: Constant, Variable 也移到core包, 因为这些是指令树或表达式树的基本元素,放到core可以使模板域模型更充实, 如:用户若需要判断指令是不是文本,就可以用 if (directive instanceof Text) 而EndDirective和Parenthesis,作为标识,编译后就已抛弃,放在core包没有意义。 StartBlockDirective和MiddleBlockDirective的区分是虚拟的,在指令树中都以同样的BlockDirective保存,所以也不应该放在core包. LineDirective似乎也应放到core包,作为BlockDirective的补集,这样会使Directive的组成部分比较完整,待进一步思考确定。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-01-25
第一次看到此表示层引擎,感觉是很不错的开源工具,不知道使用性如何,关注一下
|
|
返回顶楼 | |
发表时间:2008-01-25
看了楼主项目页面的包结构设计说明,受益匪浅,楼主在这方面真是研究颇深。
建议core里面的东西最好是接口或抽象类,具体实现的东西归类分包。没有深入了解,不知道你打算放入core里面的东西都是什么类型。 |
|
返回顶楼 | |
发表时间:2008-01-26
这次重构是因为元数据引起的, 有些功能需要明确知道指令的类型, 如: $filter指令,它需要知道哪些是文本, 哪些是动态内容输, 因为它只过滤动态内容.
方案一: 加一个getType()返回类型, 然后用静态字段分类. public abstract class Directive { public static int TEXT = 1; public static int COMMENT = 2; public static int LINE_DIRECTIVE = 3; public static int BLOCK_DIRECTIVE = 4; public abstract int getType(); } 这样可以通过 if (directive.getType() == Directive.TEXT) 来判断, 但有点bad smell. 方案二: 就是主帖中说的暴露更多子类型. 这样可以通过 if (directive instanceof Text) 来判断, |
|
返回顶楼 | |