Seedo Scala Framework のHPを立ち上げました。
現在は、Scala からデータベースへアクセスするためのフレームワークだけですが、オープンソースのWeb フレームワークとして発展します。
データベースアクセスの仕様は、http://www.seedo.co.jp/scaladocs/ にあります。
ソースコードは公開する予定でおりますが、以下の理由でしばらくお待ちください。
API
Javaのオリジナルはもう3年いろいろなシステムで問題なく動作し活躍しております。
今回、バージョン1.0 でリリースしましたが、Java のオリジナルコードを Scala で書き換えたレベルなので ScalaらしいAPIではないです。
「Scalaらしいこと」ということが難しいところです。
単純に書き換えたレベルなので、ScalaとJavaでリソースや処理効率の違いがまだ認識できておりません。
処理効率だけ考えるとScalaから呼び出して使えるJavaライブリとする方法もあります。
同じ処理をする2つの実装があるので比較して評価します。
Scalaで書き換えてみて感じることは、文法がかなり違うので書き換えるのは大変でしたが、書き換えたコードサイズはJavaより少なくなり、見通しがすっきりすることです。
頭がまだJavaレベルでScalaレベルにはないのでもう少し検証することにします。
Scalaらしさという点では、
たとえば、関数の返り値を null で返す仕様が Javaなので当たり前のように使っています。
Db クラスにもオリジナルには null を返す関数が2つありました。
データベースの製品名称をString型で返す getDatabaseProductName 関数と、
SELECT文を実行して最初の1行目だけをBeanで返す executeQueryOne [T] (beanClass: Class[T]) : Option[T] 関数です。
getDatabaseProductName 関数は、JDBCドライバから製品名称が取得できないときに null を返していましたが、空文字の ”” を返すように変更しました。おそらく、JDBCドライバを提供しているベンダーで製品名称を返さないものはないと思うので実害はないかと思います。
もうひとつの executeQueryOne 関数は、Scalaに移植するときに 最初にexecuteQueryOne [T] (beanClass: Class[T]) : [T] 関数 と定義していて return null と記述することができなくなりました。
そのため、Bean値が初期化されたBeanオブジェクトを返すしかなかったのですが、
Scala的なコードスタイルのOption と None をみて、Option[T] に変更しました。
この変更をテストするコードが次のものです。
var dbx = new Db(driverName, dns, user, passwd) dbx.select("*").where("LOC is null") val recordBean2 = dbx.executeQueryOne[scott.bean.DEPT](classOf[scott.bean.DEPT]) val x2 = recordBean2 match { case Some(n)=> recordBean2.get case None => recordBean2 } println("result " + x2)
Dbクラスは、DEPT表でLOCカラムの値がNULLのものをSELECTするSQL文を作っています。
テスト用のデータベースではこの条件に該当するレコードはないので None を返します。
Javaであれば以下のように書くことになります。
if(recordBean2 != null) { .....
ScalaのOptoinを使って、null ではなく、 None を返すように修正したことで、実行結果を処理するコードは以下のようになります。
val x2 = recordBean2 match { case Some(n)=> recordBean2.get case None => recordBean2 }
でも、これって何か釈然としないです。
確かにJava 最大の汚点はnull だと思います。(printlnでnull を参照したきに “null”文字列は出さないで欲しい。空文字でいいではないか。注:参照)
そのために、NullPointerException を発生させないために、「if(xxx != null)」 と、どれだけコードを書いたことでしょう。
Scalaは、「ない」ことを示す None を作りました。Objective-C の nil と何が違うのかなという感じです。
でも、Someなるものがあることがなんとも面倒くさい。
いろいろなScalaのことを書いたサイトには、「Optionを使うと解決」といありますが、
値がない場合のNoneオブジェクトにgetメソッドを呼び出すとNoSuchElementExceptionがthrowされるget メソッドだけはかんにして欲しい。
(注:これは個人の意見であって、意見には個人差があります。)
APIドキュメントの生成
Seedo Scala Framework のAPIドキュメントは、maven のmaven-scala-plugin のscaladocを使用してました。
ドキュメントの生成は、maven-scala-pluginがpom.xmlのreportingに指定されているため、
mvn scala:doc
で行うことができます。次のコマンドでも生成できます。
mvn site
備考
vscaladoc というものがありましたが、scala2.8.1 の環境では動きませんでした。
ネットをscala 関係を調べていて、いろいろ参考にさせてもらっている記事やBlogがあります。(著者の方々へ、このBlogを書いていてその御苦労がわかりました。このBlogがそのお返しになることを願っております。)
scala関係のソフトはバージョンアップが頻繁に行われているのでついて行くのが大変です。
Scalaなどのバージョンや記事の作成日時をできるかぎり明記するように心がけておりますが、pom.xml など一部古いバージョンになっているものもありますのでご注意いただければ幸いです。
コメントを残す
コメントを投稿するにはログインしてください。