演化架构与紧急设计: 积累惯用模式
2010-01-20 00:00:00 来源:WEB开发网所有这些类中都包含以上两个方法中的一个或两个!我发现了一个惯用模式。显然,Struts 中的很多类需要覆盖和定制处理参数的行为,所有这些类各自负责定制。现在的问题是:如何使之变得更好?
改进代码,第 1 部分
在 UIBean 的 evaluateParams() 方法中,可以看到很多不同的结构性重复,我的一个同事称之为 “相同的空格,不同的值”。换句话说,结构相同,但是代入不同的类或变量名。这代表着一种代码味道,因为应用程序中前后出现实际上可以复制-粘贴的代码,这些代码差别很小。
修复结构性重复的一种常见的技巧是使用元编程将重复的结构封装到一个地方。清单 2 显示一个新的方法,以及 evaluateParams() 方法中经过改进的前一部分,这里使用反射提供所需的不同的值:
清单 2. 通过元编程消除结构性重复
protected void handleDefaultParameters(final String paramName) {
try {
Field f = UIBean.class.getField(paramName);
if (f.get(this) != null)
addParameter(paramName, findString(paramName));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
public void evaluateParams() {
addParameter("templateDir", getTemplateDir());
addParameter("theme", getTheme());
String[] defaultParameters = new String[] {"label", "labelPosition", "requiredPosition",
"tabindex", "onclick", "ondoubleclick", "onmousedown", "onmouseup", "onmouseover",
"onmousemove", "onmouseout", "onfocus", "onblur", "onkeypress", "onkeydown",
"onkeyup", "onselect", "onchange", "accesskey", "cssClass", "cssStyle", "title"};
for (String s : defaultParameters)
handleDefaultParameters(s);
更多精彩
赞助商链接