Cubbyのアクションクラスにはバリデーションルールの定義時やアノテーションに文字列が登場します。文字列で指定しているのでリファクタリングする時に修正漏れなどがおきそうでちょっと怖いです。そこで、それらの文字列を定数にしてしまえば、少しだけリファクタリングしやすくなりそうです。また、IDE上での参照元・参照先への移動や使われているかどうかのチェックも簡単になります。
例えば、次のようなアクションクラスがあるとします。
@Path("hoge")
public class HogeAction extends AbstractAction {
@Binding(bindingType = BindingType.NONE)
protected ValidationRules processApplyValidation =
new DefaultValidationRules() {
@Override
public void initialize() {
add("token", new TokenValidator());
add("name", new TokenValidator());
add("comment", new TokenValidator());
}
};
@RequestParameter
public HogeParameterDto hogeParameterDto;
@Path("process")
@Accept(POST)
@OnSubmit("apply")
@Form("hogeParameterDto")
@Validation(rules = "processApplyValidation", errorPage = "/hoge/edit.html")
public ActionResult processApply() {
return new Forward("/hoge/edit.html");
}
}
これを次のようにします。
import static org.example.test.entity.names.Names.*;
@Path("hoge")
public class HogeAction extends AbstractAction {
private static final String processApplyValidationName
= "processApplyValidation";
@Binding(bindingType = BindingType.NONE)
protected ValidationRules processApplyValidation =
new DefaultValidationRules() {
@Override
public void initialize() {
add(TOKEN, new TokenValidator());
add(post().name().toString(), new TokenValidator());
add(post().comment().toString(), new TokenValidator());
}
};
private static final String hogeParameterDtoName = "hogeParameterDto";
@RequestParameter
public HogeParameterDto hogeParameterDto;
@Path("process")
@Accept(POST)
@OnSubmit("apply")
@Form(hogeParameterDtoName)
@Validation(rules = processApplyValidationName, errorPage = "/hoge/edit.html")
public ActionResult processApply() {
return new Forward("/hoge/edit.html");
}
}
変更した箇所を説明します。
説明
S2JDBC-GenのNamesクラス内のstatic関数をStatic Import
import static org.example.test.entity.names.Names.*;
S2JDBC-Gen 2.4.40で導入されたNamesクラス内のstatic関数をStatic Importします。バリデーションルールのinitialize()内で使います。
バリデーションルールの変数名を定数定義
private static final String processApplyValidationName = "processApplyValidation";
バリデーションルールprocessApplyValidationの変数名を表す定数です。アクションメソッドの @Validation にはここで指定した定数を使うようにすることでリファクタリングしやすくします。
バリデーションルール: TokenValidatorに使用するパラメータの定数化と使用
add(TOKEN, new TokenValidator());
Cubbyで標準提供されている2重サブミットを検証するTokenValidatorで仕様するパラメータ名を指定します。TOKEN は AbstractAction で次のように定義しておきます。
protected static final String TOKEN = "token";
この例では、パラメータ名に "token" を使用しています。
バリデーションルール: リクエストパラメータに定数を使用
add(post().name().toString(), new TokenValidator()); add(post().comment().toString(), new TokenValidator());
本来NamesクラスからStatic Importした静的関数はS2JDBCでjoinやwhereで指定するのに使うのに便利な関数ですが、ここではその文字列表現を流用してパラメータの指定に使用します。例ではテーブルpostが持つ属性名nameとcommentの文字列表現を流用しています。
リクエストパラメータ名とテーブルの属性名は一緒なことが多いと思うので、多くの場合で流用できると思います。これでS2JBDC同様バリデーションの項目名もリファクタリングしやすくなります。
リクエストパラメータのバインド先の変数名を定数定義
private static final String hogeParameterDtoName = "hogeParameterDto";
バリデーションルールの変数名同様、リクエストパラメータのバインド先hogeParameterDtoの変数名を表す定数です。アクションメソッドの @Form にはここで指定した定数を使うようにすることでリファクタリングしやすくします。
@Form で定数を使用する
...
@Form(hogeParameterDtoName)
...
public ActionResult processApply() {
...
}
先に定義した リクエストパラメータのバインド先hogeParameterDtoの変数名 をアクションメソッドに対するアノテーション @Form に指定します。
@Validation で定数を使用する
...
@Validation(rules = processApplyValidationName, errorPage = "/hoge/edit.html")
...
public ActionResult processApply() {
...
}
先に定義した バリデーションルールprocessApplyValidationの変数名 をアクションメソッドに対するアノテーション @Validation に指定します。
以上です。
やろうと思えば、@Path や @OnSubmit などでも定数を使えますがそこは定数にしていません。@OnSubmitはHTMLファイルの中身と対応するので定数化してもリファクタリングのしやすさには影響しないですが、@PathはHTMLファイル名の変更や移動の時に使えるので定数化しても良いかもしれないですね。
コメント:0
トラックバック:0
- このエントリーのトラックバックURL
- http://jfut.integ.jp/2010/01/11/cubby-actionclass-with-static-field/trackback/
- Listed below are links to weblogs that reference
- Cubbyのアクションクラスで定数を利用してリファクタリングしやすくする from ふたつの川うるおう日記






