[YMIR-298] PageクラスのBaseにアクションやプロパティのStaticFinal定義を追加 Created: 2009-01-24  Updated: 2009-03-06  Resolved: 2009-03-06

Status: Closed
Project: Ymir
Component/s: ymir-extension
Affects Version/s: 1.0.0
Fix Version/s: 1.0.2

Type: Improvement Priority: Major
Reporter: jflute Assignee: skirnir
Resolution: Fixed Votes: 0
Labels: None


 Description   

【概要】
例えば、Conversation:

@In(scopeClass = ConversationScope.class, actionName = "_get")
public void setCondition(ConditionDto condition) {
    this.condition = condition;
}

というように、actionNameに「_get」と指定したりしますが、
これはタイプセーフではなく、メソッドの変更などあったさいに追従できない。

アクションやプロパティは基本的に必ずPageクラスのBaseに定義されているため、
一緒に、アクションやプロパティのStaticFinal定義を追加してしまえば、
こういったアノテーション内での指定がタイプセーフになる。

// 例えば、PageクラスのBaseに「String ACT_get = "_get"」と定義されていれば
@In(scopeClass = ConversationScope.class, actionName = ACT_get)
public void setCondition(ConditionDto condition) {
    this.condition = condition;
}

Conversationだけでなく、バリデーションなどアクションやプロパティを
アノテーション内で指定することは多いと思われ、
Ymirにとって非常に価値の高い仕様になる。

StringのStaticFinalでなく、独自のクラスの定義にしてもいいかも。

// 例えば、PageクラスのBaseに「Action ACT_get = "_get"」と定義されていれば。
// そして、@Inには「Action[] action」という属性を追加。
@In(scopeClass = ConversationScope.class, action = ACT_get)
public void setCondition(ConditionDto condition) {
    this.condition = condition;
}


 Comments   
Comment by skirnir [ 2009-03-06 ]

完了とします。

Comment by jflute [ 2009-03-06 ]

確認しましたー。ありがとうございます。
早速Exampleで使っています。
とても良いです。GoodGood。

Comment by skirnir [ 2009-03-06 ]

対処しました(r2899)。

Comment by jflute [ 2009-02-24 ]

あと、できれば、URLもあると良いです。
アノテーション内だとクラス指定(Redirect.to)が使えない場所もあるので、
URLの表現があるとそれを利用することができます。(例えば、reenterの指定など)

URL = "/member/search/input.html";
Comment by jflute [ 2009-01-27 ]

議論結果、実装することに。
但し、微調整あり。

// xxx.member.edit.InputPageクラスだとして
PKG = "member.edit"
NAME = "input"

// プロパティ
P_memberName = "memberName"
P_memberAccount = "memberAccount"
...

// アクション
A_get = "_get"
A_post_confirm = "_post_confirm"
...
Comment by skirnir [ 2009-01-26 ]

Stringのリテラルを極力タイプセーフにする感じですかね。良いと思います。何かの名前を変えた場合は定数名も変わり、その定数を参照している箇所はビルドエラーになるので、追従できていない箇所が分かりやすいと思います。

Comment by jflute [ 2009-01-26 ]

定義名ですが、もっと割り切って:

// xxx.member.edit.InputPageクラスだとして
PKG = "member.edit"
PAGE = "input"

// プロパティ
P_memberName = "memberName"
P_memberAccount = "memberAccount"
...

// アクション
A_get = "_get"
A_post_confirm = "_post_confirm"
...

って短くてもいいかもです。
やはり、バリデータを記述するとき、大量に使うので見やすい方がいいため。

Comment by jflute [ 2009-01-26 ]

> Conversationだけでなく、バリデーションなどアクションやプロパティを
> アノテーション内で指定することは多いと思われ
ちょうど、Exampleでバリデーションを実装していたのですが、
バリデーションのときこそ、この定義がないとつらいと感じました。

Comment by jflute [ 2009-01-24 ]

まとめると、以下のようなイメージ:
(定義名は仮。Ymirのポリシー次第)

// xxx.member.edit.InputPageクラスだとして
PKG = "member.edit"
PAGE = "input"

// プロパティ
PROP_memberName = "memberName"
PROP_memberAccount = "memberAccount"
...

// アクション
ACT_get = "_get"
ACT_post_confirm = "_post_confirm"
...
Comment by jflute [ 2009-01-24 ]

プロパティ名やアクション名だけでなく、「パッケージ名」や
「Pageクラスのプロパティ名」などあると良さそうです。

@Conversation(name = "edit", phase = "input", followAfter = { "list", "confirm" })
public class InputPage extends InputPageBase {

というConversation定義が

@Conversation(name = PKG, phase = PAGE, followAfter = { ListPage.PAGE, ListPage.PAGE })

のようになります。

実際にはConversationは自由度の高いものであり、
必ずしも上記のように綺麗にPage構造と一致するわけではありませんが、
上記のようにフィットすることも多いかと思いますので、
「使う使わないかはユーザの自由」ということでとりあえず定義だけでもあると
良いのではないかと考えました。

Comment by jflute [ 2009-01-24 ]

> StringのStaticFinalでなく、独自のクラスの定義にしてもいいかも。
これに関しては、Conversationの場合はString型の属性に「actionName」と
「Name」と付いていて都合が良いが、@Requiredや@Lengthなど別の
アノテーションはこの辺の都合が良くないので、独自のクラスでの
互換性を保つことを前提とすると追加はややこしそうなので忘れて下さい。

Generated at Sat Apr 20 03:42:10 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.