公司在搞一个项目使用shh。Action类必须实现一个自定义的接口。类名叫Action ,里面只是定义一些变量,用于定义返回结果集的字符串。
struts.xml
[code="java"]/${ forward }
/WEB-INF/page/${ forward }
[/code]
Action类
[code="java"]
public interface Action {
/**
* 后台页面返回
*/
public static final String MANAGER = "manager";
/**
* 自定义返回
*/
public static final String CUSTOM = "custom";
/**
* 后台输出返回
*/
public static final String MESSAGE = "message";
}
[/code]
在Struts的Action中使用一下代码返回结果集
[code="java"]
return MANAGER;
return CUSTOM;
[/code]
我认为,这样做不好。
1、所有的Action都得实现Action类,不利于松解偶。
2、自定义的Action只是定义了变量,没有抽象方法,不算完整的接口
3、从对象来看,Struts的Action和自定义Action类没有存在和清晰的关系
没有存在“如果你是 Action 必须 实现Action的什么什么”,里面也只有静态变量。
4、我觉得在常量类里面定义这些变量会好一些
唯一存在的好处就是,如果需求改变,需要在Action中做一些初始化的时候,使用implements Action就能很好的处理,但是目前情况来看,只用于return MANAGER;
return CUSTOM;
而已。
后来,我在Constant类中定义这些静态变量,Stuts的Action不在实现自定义Action接口。
[code="java"]
public static final String ACTION_FORWARD_MANAGER = "manager";//后台页面返回
public static final String ACTION_FORWARD_CUSTOM = "custom";//自定义返回
public static final String ACTION_FORWARD_MESSAGE = "message";//后台输出返回
[/code]
在Action中使用
[code="java"]
return Constant.ACTION_FORWARD_MANAGER;
[/code]
不知道大家怎么看待这件事情?
如果Action只是为了几个静态变量而存在的话,那是没什么意义的至少现在是这样的,所以Lz讲的还是有道理的,我想你们公司会这样做也一定有它的道理。像我公司的框架可能比你公司的还要冗余,但里面有好的也有坏。
先说interface方式。
这种空接口,又称作标志性接口([url=http://en.wikipedia.org/wiki/Marker_interface_pattern]Marker Interface[/url])模式,在Annotation出现前应用较多,比如JDK的Serializable和Cloneable等。
好处除了你所说的以外,还有明确了常量的意义——那些只对Action有意义。
到现在,大潮流倾向用Annotation代替。但是貌似争议很多。
再说常量方式
我现在比较倾向于这种纯POJO方式(以前是标志性接口的使用者)。
坏处是常量开始多了起来,还需要分类整理。
我通常会在Constant里面加个Action返回值的枚举,把你定义那三个放进去。
但这样一来代码又会变得更长,开始丑陋起来,于是左右为难... :cry:
无论如何,个人倾向常量方式。
使用接口可能更能体现面向对象吧
但是如果只是几个变量的话 还是赞同lz的方式
个人爱好吧,如果单纯的用几个变量的话,楼主那种方式是比较好的,不需要继承你所说的action
SSH本身就不是个好东西
[quote]唯一存在的好处就是,如果需求改变,需要在Action中做一些初始化的时候,使用implements Action就能很好的处理,但是目前情况来看,只用于return MANAGER; [/quote]
我倒是觉得这种做法的最大好处是,如果有一天你想知道系统中有哪些你自己的定义Action,用IDE或者Javadoc的列出子类功能就能直接列出来。lz最好干脆直接跟提出这个要求的人交流一下,他觉得这样做有什么好处。
至于楼主说的4个不好
1. 继承一个不会被直接引用的接口对解耦不会有太大的影响。而如果有其他地方直接引用了这个接口,那说明这个接口是有某些实际作用的,你根本就不能把它去掉,你在这里想也是白想。
2和3都是你自己的审美观。没人规定接口必须要有方法。自定义的类名跟框架中某个类重名也很常见,包名不同即可。就算实在看不下去,改类名就行了,不用因此把整个类拿掉。
4. 既然已经有一个公共接口了,把常量直接定义在这个公共接口上很正常,这正是为了方便解耦。
action还是写个基类比较好