Asakusa FrameworkをScalaで記述してみるAfwHS α版のバージョン0.003の考察。
バージョン0.002では、DMDLから生成したLineModelがScalaのケースクラスで作ったLineModelへキャストできなくて例外が発生したので、これを何とかする方法を考えてみる。
仮にどちらかが他方を継承すれば、キャストの問題は解決できそうな気がする。
AfwHSではケースクラスを一番最初に作る考えなので、DMDLで生成するモデルに手を入れるのが良さそう。(データモデルドライバーで編集することが出来るのだし)
運良く、モデルクラスは親クラスが指定されていないので、(まずは手動で)Scalaのケースクラスを親クラスに指定してみたところ、このキャストの問題は解決した。
ただし今度は逆方向の問題がある。
_.text.split("[ \t]+").foreach{ w => r1.add(WordCountModel(w, 1)) }
Scalaのケースクラスをインスタンス化してResultにaddしている。
これがAsakusaFW側のWordCountModelにキャストできないといけないという理屈になる。
特にWordCountModelは入力側にも出力側にもなる(どちらへもキャストできる必要がある)ので、手詰まり(苦笑)
王道としては、共通のインターフェースを作って、どちらのクラスもそれを実装することだろう。
しかしせっかくScalaのケースクラス機能を使って楽にクラスを作っているのに、そこからインターフェース(トレイト)を自前で用意するのは面倒くさすぎる。
インターフェースを生成する為のツールを作るのも簡単には出来ないし、それを実装させる手間が(ちょっとだけど)かかるのも嫌だ。
(ケースクラス作成→ツールでトレイト生成→元のケースクラスにトレイトを実装、という手間)
そもそもAsakusaFWとしてはDMDLを用意するのが手順の一番最初だし、これを生かす方が良さそう。
という訳で方針転換して、ケースクラスを最初に手で作るのはやめて、DMDLから生成する方向で考えてみる。
(データモデルドライバーはJavaソース生成が主目的だけど、Scalaソースを生成してもいいよねw)
使用手順としては、DMDL作成→モデルクラスおよびScalaクラス生成。