コード書きましょう。
現在、UnfilteredとJavaFX使ってなんか創ってます。
Unfiltered
コード例
だいたいこんな感じ。
私はAsynchronousにHttpクライアント使ってほげほげしたいので、async版を使います。
※このコードではHttpクライアント使ってないけど例なのでキニシナイ。
私のプロジェクトではこのサーバーを
- アプリケーションとして起動
- JavaFXの裏で起動
JavaFX
SwingはオワコンなのでJavaFX使いましょう。
コード例
クライアントを起動する前にサーバーを起動したいのですが、いろいろと問題があり、通常のrunメソッドによる起動は出来ません。
そこで、runメソッドで行われているstart, stop, destroyを直接呼ぶことにします。
抽象化
重複したところを考えます。
まずはサーバーを組み立てるところ。
ポートも自由に設定したい。
次にnio.Httpのところ。
shutdownは自動でやって欲しい。
幸い、unfiltered.netty.HttpとApplication.launchはThreadをwaitしてくれるのでローンパターン的にします。
util.control.Exceptionを使うと、try - catch - finallyを生で書く必要がないことがわかりますね!
ナチュラルにScalaz使っていますが、>>>はandThenです。
サーバーの方は十分綺麗になりました。
クライアントのサーバーの起動、終了の部分もローンパターンで書けます。
綺麗になりました。
Scalaz
さて、ここまでが私的Scalaプログラミングですが、まあ、普通過ぎて面白くないですね。
そこで、IOモナドを用いて実装してみます。
まずはサーバーのコード。
SafeAppはIOモナドを暗黙的に実行するためのもので、runcをオーバーライドする事でアプリケーションを構築します。
IO#bracketはtry - finallyのようなもので、リソースを扱うときに使います。
次にクライアント。
アンダーバーが付いた関数は、前の結果を捨てるという意味があります。
Haskellの習慣ですね。
はいおしまい。
IOモナドは便利なのですが、UnfilteredやJavaFXがIOモナド用いた設計をしているわけではないので、少しばかり面倒なところがあります。
告知
第二回スタートScalazやります、多分。
0 件のコメント:
コメントを投稿