Struts 2のアクションでコードを乾燥させます
-
27-10-2019 - |
質問
私は最近、Struts 2とSpring 3を含む小さなプロジェクトで作業しており、私の同僚は非常に悪いコードを書いていました。
同様の機能の2つのモジュールを実装する必要があります。どちらもJava Beanオブジェクトをリスト/追加/表示/更新/削除する必要があり、これら2つのJava Beanオブジェクトには多くのフィールドがあります。ユーザー、唯一の違いは、1つのBeanにcreated_timeにオフセットを保存する2つのフィールドがあり、もう1つはstart_timeとend_timeを保存する必要があることです。
そこで、私の同僚は、そのうちの1つを1つのStruts Action Classに実装し、コードをコピーして、小さな変更を加えた後、別のアクションクラスを設置しました。
私は彼の間違いを解決するのに苦労しています、どのようなデザインパターンや練習が私の問題を解決できるでしょうか?
追加:
私はこれらの2つのアクションクラスを同じベースクラスを拡張させようとしましたが、残念ながら、Struts 2は親クラスのセッター/ゲッターを無視しているようです。アクションクラスのセッターにインスタンス化して渡します。
繰り返しコードを減らしたいのですが、上記の2つの問題のために、私はさらに繰り返されるコードと、壊れている端にある非常に複雑なクラス構造を作成することになりました。
追加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/enternit/base?message.content = hello, 、結果は次のとおりです。
{"message" : {"content":"hello"}}
行ったら http:// localhost:8080/struts2-exp/enternit/extended?message.content = hello, 、結果は次のとおりです。
{}
コンソールには警告があります
これが、Struts 2が親クラスのセッター/ゲッターを無視すると言う理由です。
解決
- アクションをサブクラス化し、他のプロパティを追加しますか?
- 同じアクションを使用しますが、異なるビューを使用しますか?
- 3つのフィールドすべて、異なるビュー、使用されていない場合はデフォルトで1つの豆を作成しますか?
- 使用する
ModelDriven
単一のアクションに基づいてインスタンス化するモデルを決定します"method"
構成? - 等...
たくさんのオプション。 「最高」は、私たちが持っていない詳細によって異なります。
それがあなたが対処しなければならない悪いコードの拡張であるならば、あなた自身が幸運だと考えてください - これはリファクタリングに些細なことに聞こえます。実際の闘争は何ですか?
他のヒント
共通部品と2つのサブクラス(呼び出されるアクション)を備えた抽象アクションクラスを作成することをお勧めします。抽象クラスは直接呼び出すことはできません。
アプリケーションでは、サブクラスは親抽象クラスのすべてのコードを使用できます。