我最近一直在处理一个涉及Struts 2和Spring 3的小项目,我的同事写了很多BAD代码:
我们必须实现两个类似功能的模块:两者都需要列出/添加/显示/更新/删除Java Bean对象,而这两个Java Bean对象有许多共同的字段,它们都有id / content / image_url / created_time / user,唯一的区别是一个bean有2个字段用于存储created_time中的偏移量,另一个用于存储start_time和end_time。
所以我的同事决定在一个struts Action类中实现其中一个并复制代码并进行一些小改动,然后他就有了另一个Action类。
我正在努力解决他的错误,设计模式或实践可以解决我的问题?
ADD:
我试图让这两个Action类扩展相同的基类,不幸的是,Struts 2似乎忽略了父类的setter / getter,而且你不能使用泛型类型,因为Struts 2也不会知道哪个类实例化并赋予Action类中的setter。
我想减少重复的代码,但是由于上面提到的那两个问题,我最终制作了更多重复的代码和太复杂的类结构,这些都处于被破坏的边缘。
ADD 2:
我使用stuts2-json-plugin测试了以下代码(因为它更容易观察JSON格式的数据):
struts.xml中:
<package name="inherit" namespace="/inherit" extends="json-default">
<action name="base" method="doStuff" class="com.carllee.exp.BaseAction">
<result type="json">
<param name="excludeNullProperties">true</param>
</result>
</action>
<action name="extended" method="doStuff" class="com.carllee.exp.ExtendedAction">
<result type="json">
<param name="excludeNullProperties">true</param>
</result>
</action>
</package>
Java代码
package com.carllee.exp;
import com.carllee.exp.bean.Message;
import com.opensymphony.xwork2.ActionSupport;
public class BaseAction extends ActionSupport {
private Message message; // and getter/setter
private String text; // and getter/setter
public String doStuff() {
return SUCCESS;
}
}
儿童班:
package com.carllee.exp;
public class ExtendedAction extends BaseAction {
}
如果我运行此测试并转到http://localhost:8080/struts2-exp/inherit/base?message.content=hello,结果将是:
{"message" : {"content":"hello"}}
如果我转到http://localhost:8080/struts2-exp/inherit/extended?message.content=hello,结果将是:
{}
并且控制台中会出现警告
这就是为什么我说Struts 2忽略了父类中的setter / getters。
答案 0 :(得分:1)
ModelDriven
并根据单个操作的"method"
配置决定实例化哪个模型?很多选择。哪个“最好”取决于我们没有的细节。
如果这是您必须处理的BAD代码的扩展,请认为自己很幸运 - 这对于重构来说听起来微不足道。什么是实际的斗争?
答案 1 :(得分:0)
我建议使用公共部分和两个子类(将被调用的动作)创建一个抽象动作类。无法直接调用抽象类。
在您的应用程序中,子类可以使用父抽象类中的所有代码。