论坛首页 Java企业应用论坛

CT重构-充实模板域模型

浏览 2041 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-24  
在CommonTemplate(http://www.commontemplate.org)的模板域模型中, 包含两个解析树结构:

一、指令树:
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的组成部分比较完整,待进一步思考确定。
   发表时间:2008-01-25  
第一次看到此表示层引擎,感觉是很不错的开源工具,不知道使用性如何,关注一下
0 请登录后投票
   发表时间:2008-01-25  
看了楼主项目页面的包结构设计说明,受益匪浅,楼主在这方面真是研究颇深。
建议core里面的东西最好是接口或抽象类,具体实现的东西归类分包。没有深入了解,不知道你打算放入core里面的东西都是什么类型。
0 请登录后投票
   发表时间: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) 来判断,
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics