[Wicket-ja-user 344] Re: Converterに関して質問です。

アーカイブの一覧に戻る

Tsutomu Yano t_yano****@me*****
2009年 6月 27日 (土) 02:23:25 JST


矢野です。

ちょっと確認なんですが、話の流れからすると、それはTextFieldではなくてLabelのような気がしたんですよね。
もしこれがTextField<Boolean>の話だとすると、その項目はユーザが入力可能で、しかもIConverterによって
変換可能な値しか入力できないかなり特殊なTextFieldということになりますよねえ。

提供された例からすると、ユーザはブラウザ上でどんな文字でも入力できるわけですが、結局IConverterが
変換できるのは「はい」「いいえ」の2種類の文字列だけで、それ以外の文字列はすべて検証段階で変換エラーで
はじかれてしまう。

入力が複数個に限定されるのなら、DropDownChoiceとか使うと思うので、こういうシーンになったことがないんです
よね。。。


で考えてみるに、次のようなケースでしょうか。


あり得る例としては、ModelObjectがTimestampとかjava.sql.Dateとかで、ユーザは20090625みたいな文字列を入力する
ケースです。

この場合は、私は独自のSqlDateConverterといったIConverter実装を用意して、さらに、getConverter()を
オーバーライドしたTextFieldサブクラスとしてSqlDateTextFieldなんかを作ります。

一度作ってしまえば、あとはどんなシーンでも、日時を入力するシーンではIConverterを意識することなく、


add(new SqlDateField(.....));


で済むからです。毎回匿名サブクラスにするのもめんどくさいですし。カプセル化大事。



で、なんかの理由でTextFieldのModelObjectがBooleanだとして、そのような入力項目がアプリケーションの中で2回以上登場
するのなら、たぶんBooleanTextFieldとかいうコンポーネントを作ると思います。BooleanTextFieldはgetConverter()を
オーバーライドし、「はい」「いいえ」をBoolean.TRUE, Boolean.FALSEに変換するYesNoConverterを返すように作ると
思います。



ちなみにこれがLabelの話ならば、BooleanなModelObjectを「はい」「いいえ」に変換する、AbstractReadOnlyModelの
サブクラスを作って、Labelにこのモデルを渡すと思います。



ただ、「正しい方法」を求められているならば、「そんなものはない」という解答になります。
毎回匿名サブクラスを作ってgetConverterをオーバーライドするのがいいと思うなら、そうしてもいいわけで。

私はWicketではコンポーネントなりモデルなりの独自実装をどんどん作って再利用するのがいいと思うので、
BooleanTextFieldとかSqlDateTextFieldとかを作りますが、それが「正解」だということはできないですねえ。
私はそれが楽だと思います、としか。。。


参考になれば。



On 2009/06/26, at 15:23, 古川 烈 wrote:

> 古川です、
> Converterの取り扱いについて悩んでおります。
>
> あるデータ型について、アプリケーション全体でコンバータを差し替えたい時は、Applicationクラスにて
>
>     @Override
>     protected IConverterLocator newConverterLocator() {
>
>         /* Wicket標準のコンバータ実装を生成する */
>         ConverterLocator locator = new ConverterLocator();
>
>         /* Boolean.classのコンバータを独自コンバータで上書き */
>         locator.set( Boolean.class, new YesNoConverter() );
>
>         /* ロケータを返す */
>         return locator;
>     }
>
> で出来ることはわかるのですが、
> 例えばある TextField<Boolean> thisFieldで Boolean型の値にしたがって
>
>     true    ->    はい
>     false    ->    いいえ
>
> と入出力を切り替えたいとします。
>
> このとき、コンバータを切り替えたいのは、
>
>     TextField<Boolean> thisField
>
> だけであって、アプリケーション全体のBoolean型についてコンバータを切り替えたいわけではないとします。
> この時、この入力フィールドだけコンバータを変える場合、
>
>     TextField<Boolean> thisField = new TextField<Boolean> ( "ほげほげ" )  {
>
>         @Override
>         public IConverter getConverter( Class<?> type )  {
>
>             if ( Boolean.class == type )  {
>                 return new YesNoConverter();
>             }
>
>             return getConverter( type );
>         }
>     }
>
> とするのが正しいのでしょうか?
>
> 他にも同じタイプの入出力のフィールドがあり、使いまわししたい場合は、
> TextFieldクラスを継承した YesNoField でも作って↑の実装を内部に記述して対応する。
> というのが正しい方法なのでしょうか?
>
> それとも Boolean型を内包するYesNoクラスでも作って、データの取り扱いをYesNo型に変えた後に、
> ConverterLocator に コンバータを追加でしょうか?
> ( 大げさすぎる気がしますが。。。 )
>
> データ型はBooleanなんだけど、画面での表示は様々に変えたいという要件は結構あると思うのですが。
> 例えば
>
>     男:女
>     既婚:未婚
>     左:右
>
> 等々。
>
> Boolean型に限らず、似たような状況はあると思うのですが、皆様はどうやって対応されていますか?
> どなたかアドバイスをご教示頂きたく。
>
> 以上、よろしくお願い申し上げます。
>
> Hotmail が進化した!セキュリティーもばっちり! 安全ではやいメールをいますぐチェック。 _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール: t_yano****@me*****
---------------------------------------------------




Wicket-ja-user メーリングリストの案内
アーカイブの一覧に戻る