[Seasar-dev:192] [S2Container] アクセサメソッドをコンテナ側で自動生成できないか
KOMORI Yusuke
y-komori
2005年 12月 3日 (土) 23:33:53 JST
こんばんは、形だけのS2JMSコミッタになってしまっている(すみません・・・)
小森@SMGです。
S2Containerでちょっと考えていることがあって、皆さんの意見を伺いたく、
投稿しました。
■主題:setter、getterをコンテナ側で自動生成できないか
最近、実案件でS2JSFを使うことが多くなっているのですが、setter、getter
を記述するコストが馬鹿にならないと感じてきています。
・はっきりいって、コードレビューをしていてもsetter、getterが鬱陶しい(特
にS2JSFのアクションクラスはsetter、getterが大半を占める)
・フィールドによって setter だけ、getterだけ、両方作成の3パターンがある
ので、とても間違いやすい
・S2JSFを使った開発で、単純ミスが多いのはアクションクラスの setter、
getterの作り忘れによって、コンポーネントが正しくインジェクションされな
いこと
■解決案
以下のような感じで、フィールドにアノテーションを付加すると、コンテナ
がインスタンス化するときに自動的にアクセサメソッドを追加してくれるよ
うなことを考えています。
@Accessor(accessorType = AccessorType.READ)
HogeDto hogeDto_;
例えば、
accessorType が READ なら getter を生成
accessorType が WRITE なら setter を生成
accessorType が READWRITE なら setter、getter を生成
実際に setter、getter を呼び出すのはコンテナ側であり、リフレクション
を使って動的に解決するため、コンパイル時に setter、getterが存在しなく
ても多くの場合は困らないのでは?
技術的には、ComponentDefImpl でコンポーネントをインスタンス化するとき
に、S2AOP と同じ要領で本来のクラスのサブクラスをつくり、Javassist で
setter、getterをオンザフライで作ることを考えています。
■問題点
1. 純粋なPOJOではなくなる
ある意味、S2Containerに依存してしまいますが、現実的にはたとえば
S2JSFのアクションクラスなどは、他のフレームワークで使い回せると
は思えません。
ある程度割り切って効率重視でも良いのではないかとも思います。
また、他フレームワークでの再利用が予想されるビジネスロジックは、
従来通りアクセサを手動でつくるなどの使い分けをしても良いと思いま
す。
2. フィールドが private ではつかえない
サブクラスでアクセサメソッドを作る仕組上、現実的にはprotectedな
フィールドにしなければならないという制限がつきます
# うろ覚えですが、たしかApacheのbeehiveでも同じようなことをやっ
ていたと思います
3. S2AOP との競合が心配
S2AOPでは、サブクラスを作成してAOPを実現しているため、それとの競
合が心配(大丈夫なような気もしますが)
アスペクトも適用すると、元のクラスを2段階で継承することになりそ
うです
S2AOPに本機能を組み込んで(アスペクト適用と同時にアクセサの生成も
行う)1段階の継承で済ませる方法もありますが、S2AOPの本来の役割と
は異なるので分けた方が良いかと考えています。
(Javassistの千葉先生から、「それはアスペクトではない」と怒られそ
うですし)
今日ちょっと試してみて、技術的には実現可能な気もしていますが、
いかがでしょうか?
----------------------------------------------
小森 裕介 / Yusuke Komori
E-Mail:y-komori @ nifty.ne.jp
URL:http://www.littleforest.jp/
seasar-dev メーリングリストの案内