上几天和
jindw讨论时,
他提到想在他的一个开源项目重用CommonTemplate(
http://www.commontemplate.org)的EL (Expression Language),
问我是否可以抽取使用,我觉得这是一个很好的想法,
为此重构了一下CommonTemplate,以使EL分离于TL (Template Language),可以单独使用。
因为原始设计就将EL单独设计的,只是为了和TL统一,有些范围未最小化控制,
重构如下:
将Expression的求值过程所依赖Context改成VariableResolver,即:
Object evaluate(Context context);
改成:
Object evaluate(VariableResolver variableResolver);
加入接口VariableResolver:
public interface VariableResolver {
Object lookupVariable(String name) throw VariableException;
}
并让Context继承于VariableResolver,保持指令可以使用原有的expression.evaluate(context)调用表达式求值,
(实际继承关系是Context -> LocalContext -> VariableStorage -> VariableResolver)
这样,单独使用EL时,就不用实现整个Context,只需实现最简单的VariableResolver就行了,
实现上面重构后,单独使用EL的体系为:
org.commontemplate.core.VariableResolver
org.commontemplate.core.Expression
org.commontemplate.cofig.ExpressionConfiguration
org.commontemplate.engine.expression.ExpressionEngine
org.commontemplate.standard.ExpressionSetting
第三方只需要重新实现org.commontemplate.core.VariableResolver,
其它都可以直接使用,如:
// 创建配置,
// 这里用的org.commontemplate.util包内置的IoC配置工具,
// 也可以编程一个个setXXX,或用其它IoC容器创建,
BeanFactory beanFactory = new PropertiesBeanFactory("commontemplate-expression.properties");
ExpressionSetting setting = (ExpressionSetting)beanFactory.createBean(ExpressionSetting.class);
VariableResolver variableResolver = ... //自行实现
// 通过配置创建
ExpressionEngine engine = new ExpressionEngine(setting);
// 解析表达式
String expr = "1 + 1"; // 待求值的表达式
Expression expression = engine.parseExpression("1 + 1");
// 运行求值
Objecct result = expression.evaluate(variableResolver);
System.out.println(expr + " = " + result);
应该重用方式已经非常简单了,
当然可以加几个工具类,把配置再封装一下,
或再提供一个用Map实现的最简单VariableResolver等,
但这些都不是必需的,
另外,是否应该将el相关的放到一个package下,我觉得没必要,
那会影响整个项目的package层级关系,
倒是可以写一个Ant脚本,抽取相关类,打包成commontemplate-el.jar
分享到:
相关推荐
4. **宏**:类似于函数,宏是可以重用的模板片段,可以接受参数并嵌套其他模板。 5. **插件系统**:通过插件机制,CommonTemplate可以扩展其功能,例如与Struts框架集成的`struts-commontemplate-plugin`。 ### ...
在Vue.js开发中,组件化是一种常见的最佳实践,它能够提高代码的可重用性和可维护性。在给定的文件中,展示了如何利用Element UI库来封装`el-table`和`el-form`组件,这两个组件在管理系统的界面中非常常见,特别是...
C++代码设计与重用
在电子设计自动化(EDA)软件Altium Designer中,重用块和片段是提高设计效率的关键特性。这些功能允许设计者存储和重复使用常见的电路模块,无论是原理图部分还是PCB布局,从而节省时间和确保设计的一致性。 **...
为了提升设计效率和可重用性,开发出了一套可重用设计方法学,这一方法学在《片上系统:可重用设计方法学(第三版)》一书中得到了详细的介绍。 首先,可重用设计方法学的核心在于提高设计的可重用性。这意味着设计...
在IT行业中,软件重用是提高开发效率、降低成本和保证软件质量的重要策略。这个压缩包包含的资源聚焦于软件重用的设计、开发和研究,旨在深入探讨如何有效地利用已有的软件元素来创建新的应用程序。 首先,"基于...
UG(现在通常称为NX)是西门子PLM软件推出的一套高端CAD/CAM/CAE集成解决方案,其中重用库是NX中的一个重要功能,它的目的是为了提高设计效率和标准化程度,通过提供一系列可重用的部件、模板和组件来加速产品设计...
在编程领域,代码重用是提高效率和保持代码可维护性的重要原则。C++作为一款强大的面向对象编程语言,提供了多种方法来实现代码重用,从而使得开发者能够更高效地构建复杂的软件系统。本教程专注于讲解如何在C++中...
关于VScode报错“终端将被任务重用,按任意键关闭”的解决方案 文章目录关于VScode报错“终端将被任务重用,按任意键关闭”的解决方案报错时候解决方案 这其实不是一种报错,有这个提示的原因是本地端口是被共享的,...
C++代码设计与重用是关于如何编写高效可重用代码的重要话题,它对于提高软件开发效率和软件质量具有重要意义。本书《C++代码设计与重用》由Martin D. Carroll和Margaret A. Ellis合著,是一本深受业界推崇的技术书籍...
《C语言接口与实现--创建可重用软件的技术》是一本深入探讨如何通过C语言构建高效、可维护、可重用软件的专业书籍。在软件工程领域,可重用性是提高开发效率、降低维护成本的关键因素。这本书的核心目标就是教授读者...
《C++代码设计与重用》是由Martin D. Carroll和Margaret A. Ellis两位作者合著的作品,本书深入探讨了如何在C++编程语言中设计和实现可重用的代码,提高开发效率。书中不仅涵盖了重用性基本概念、类设计、扩展性、...
在编程领域,代码重用性是提升开发效率和软件质量的关键因素之一。代码重用性意味着我们可以避免重复编写相同的逻辑,使得程序更加模块化,易于维护和扩展。针对Java编程语言,以下是一些提高代码重用性的核心策略:...
《C语言接口与实现:创建可重用软件的技术》是计算机编程领域的一本重要著作,由David R. Hanson撰写,张昆翻译,并由机械工业出版社引进国内。本书为C语言编程提供了深入的理论和实践指导,特别是在如何设计和实现...
- 自定义标签库可以被多个Web应用共享,提升代码重用率。 通过以上步骤,你不仅能够创建EL自定义标签,还能将其整合到实际项目中,提升开发效率和代码质量。在实践中不断探索和优化,你会发现自定义标签是Java Web...
《可重用代码管理器:提升编程效率的关键工具》 在快速发展的信息技术领域,软件开发的速度和质量成为了项目成功与否的重要衡量标准。为了提高编程效率并降低错误率,程序员们开始越来越重视代码的复用性。"可重用...