iteye_17041
iteye_17041
2013-03-21 10:18

一个框架的讨论

公司在搞一个项目使用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]
不知道大家怎么看待这件事情?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

7条回答

  • zx527291227 zx527291227 8年前

    如果Action只是为了几个静态变量而存在的话,那是没什么意义的至少现在是这样的,所以Lz讲的还是有道理的,我想你们公司会这样做也一定有它的道理。像我公司的框架可能比你公司的还要冗余,但里面有好的也有坏。

    点赞 评论 复制链接分享
  • at1943 at1943 8年前

    action还是写个基类比较好

    点赞 评论 复制链接分享
  • iteye_1858 iteye_1858 8年前

    [quote]唯一存在的好处就是,如果需求改变,需要在Action中做一些初始化的时候,使用implements Action就能很好的处理,但是目前情况来看,只用于return MANAGER; [/quote]

    我倒是觉得这种做法的最大好处是,如果有一天你想知道系统中有哪些你自己的定义Action,用IDE或者Javadoc的列出子类功能就能直接列出来。lz最好干脆直接跟提出这个要求的人交流一下,他觉得这样做有什么好处。

    至于楼主说的4个不好
    1. 继承一个不会被直接引用的接口对解耦不会有太大的影响。而如果有其他地方直接引用了这个接口,那说明这个接口是有某些实际作用的,你根本就不能把它去掉,你在这里想也是白想。
    2和3都是你自己的审美观。没人规定接口必须要有方法。自定义的类名跟框架中某个类重名也很常见,包名不同即可。就算实在看不下去,改类名就行了,不用因此把整个类拿掉。
    4. 既然已经有一个公共接口了,把常量直接定义在这个公共接口上很正常,这正是为了方便解耦。

    点赞 评论 复制链接分享
  • zhaohanjiangit zhaohanjiangit 8年前

    SSH本身就不是个好东西

    点赞 评论 复制链接分享
  • chenshengzun721 chenshengzun721 8年前

    个人爱好吧,如果单纯的用几个变量的话,楼主那种方式是比较好的,不需要继承你所说的action

    点赞 评论 复制链接分享
  • tianma630 tianma630 8年前

    使用接口可能更能体现面向对象吧

    但是如果只是几个变量的话 还是赞同lz的方式

    点赞 评论 复制链接分享
  • j_clxy clxy大叔 8年前
    • 先说interface方式。

      这种空接口,又称作标志性接口([url=http://en.wikipedia.org/wiki/Marker_interface_pattern]Marker Interface[/url])模式,在Annotation出现前应用较多,比如JDK的Serializable和Cloneable等。
      好处除了你所说的以外,还有明确了常量的意义——那些只对Action有意义。
      到现在,大潮流倾向用Annotation代替。但是貌似争议很多。

    • 再说常量方式

      我现在比较倾向于这种纯POJO方式(以前是标志性接口的使用者)。
      坏处是常量开始多了起来,还需要分类整理。
      我通常会在Constant里面加个Action返回值的枚举,把你定义那三个放进去。
      但这样一来代码又会变得更长,开始丑陋起来,于是左右为难... :cry:

    无论如何,个人倾向常量方式。

    点赞 评论 复制链接分享

相关推荐