我使用Struts 1.2.4继承了这个巨大的遗留Java Web应用程序。我有一个关于行动的具体问题。大多数页面只有一个Action,而且processExecute()方法是可怕的怪物(非常长并且基于请求参数的嵌套if语句很多)。
鉴于Actions是命令模式的一个实现,我正在考虑将这些Actions拆分为每个用户手势一个Action。这将是一个很大的重构,我想知道:
答案 0 :(得分:9)
我处理这个问题的方法是:
肯定会有更多 - 抱歉,我的时间不多了......
答案 1 :(得分:5)
我建议不要使用动作类进行继承。一开始听起来是个好主意,但我想迟早你会意识到你的事情比实际使代码库强大得多。 Struts有足够的基本动作,如果你正在创建新的动作,你可能在Web层中得到了不应该存在的代码。
这只是我个人的经历。
答案 2 :(得分:2)
Original Hierarchy: New Hierarchy:
Action Action
| |
| BaseA
(old)ClassA |
+--------+----------+
| | |
ClassB (new)ClassA ClassC
答案 3 :(得分:2)
此时,您已经重构了巨大的烦人方法。 现在您实际上可以开始创建特定的操作。
您可以将新重构的类用作基类,并使用这些重构的小方法将每个特定操作实现为子类。
完成此操作后,您应该对类之间共享的逻辑有一个很好的了解,并且可以根据需要提取或推送这些方法。
这并不好玩,但是如果您将在代码库上工作一段时间,它将为您节省时间和麻烦。
答案 4 :(得分:1)
难题但是早期Web应用程序开发的典型问题。
首先,您需要首先考虑哪种逻辑构成业务行为,哪种逻辑构成“流程”(即用户看到的内容),以及哪种逻辑获取他所看到的内容。
您不必沿着工厂和接口的路线走下去;追溯实现远没那么有用......但是将业务逻辑和数据检索逻辑整合到某种代理中......并留下struts动作来确定基于该逻辑成功/失败的页面流。
从那里你只需要几个星期就把它磨出来
答案 5 :(得分:1)
一个长方法永远不会好,除非碰巧是单个switch语句,其中case很短(令牌解析或类似的东西)。
您至少可以将long方法重构为具有描述性名称的较小方法。
如果可能的话,你可以通过检查表单来识别它应该做什么来启动你的方法,然后你可以通过各种选项来实现。虽然没有嵌套ifs,但这些代码往往使代码不可读。只是
enum Operation {
ADD, DELETE;
}
...
Operation operation = determineOperation(form);
if (operation == Operation.DELETE) {
doDelete(form);
} else if (operation == Operation.ADD) {
doAdd(form);
}
如果你可以走得那么远,那么你的逻辑很干净,你可以做任何想要的重构。
困难的部分是让你的逻辑清晰,你可以逐步完成。不要选择一个模式,直到你明白你的问题是什么。
答案 6 :(得分:1)
如果您计划重构代码,则应首先确保为现有代码编写测试,以便在开始重构后确定没有更改其功能。