読者です 読者をやめる 読者になる 読者になる

山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

サーバーサイドにも取り入れたいプログラミングのトレンド

ブログ
Androidやっているとサーバーサイドと同じJavaでもどんどん進化していてたのしいですね。新しいフレームワーク的なものもいろいろ出ています。

サーバーサイドしかやったことがない人向けに解説するとGUIのプログラミングにおいては非同期処理が非常に重要です。時間のかかる処理をメインスレッドで実行してしまうと画面がその間止まってしまう、つまりユーザーから見るとアプリが固まったように見えます。そこでHTTP通信やDBアクセスはできるだけ非同期で実行する必要があります。そうするとさくさく動くアプリになります。

非同期で実行するプログラムを書く場合、JavaのThreadだといろいろ都合が悪いです。例えばHTTP通信をする処理だったらサーバーからデータを取得するところを新しいスレッドで実行しただけで終わっては意味がありません。データを取得した後画面に反映させる必要があります。これはメインスレッドで実行しなければなりません。そういう、起動したスレッドから元のスレッドに戻る方法がありません。(あるかもしれませんが、私はわかりません)

こういうプログラムを書きやすく読みやすくするのがクロージャです。処理自体を引数にすることで、非同期で実行して元のスレッドに戻るような処理を書きやすくなります。iPhoneアプリだとこんなふうに書きます。

dispatch_async(グローバルキュー, {
  非同期に行う処理
  dispatch_async(main, {
    メインスレッドで画面に反映
  })
})

{}がクロージャです。なおJava8以前で同じようなことをする場合は無名クラスを使うのが一般的です。その場合余分な決まり文句的コードを書かないといけないので冗長になります。

いろいろなことをやりだすとバックグラウンドの処理とメインスレッドの処理を行ったり来たりすることになります。そうなると上記の書き方でもどんどんネストが深くなって解読が難しいコードになっていきます。

そこでJavaScriptJavaでもそういうのを書きやすくするものがいろいろ出ています。AndroidだとRxJava(RxAndroid)が一番注目されています。RxJavaはJavaで「リアクティブプログラミング」をできるようにするものです。

リアクティブプログラミングとは何かというと、私もまだきちんと理解できていない気がしますが、平たく言うと上記のようなクロージャを次々に呼び出すようなプログラミングモデルのようなイメージだと思われます。

ここでサーバーサイドに戻ると、Webアプリケーションだと非同期処理をしてもレスポンスが1回しかないので結局あまり使い道がありません。GUIほど非同期にして処理を並列させて処理時間を短縮しても違いが体感できません。しかしRxJavaだとコレクションの処理がスマートに書けたりします。例えば従来for分でループしていたような処理がこんなふうに書けます。

collection.forEach({それぞれの要素への処理})

クライアントとサーバーでプログラムの書き方をそろえておくといろいろメリットがありそうですし、ぜひサーバーサイドでもリアクティブプログラミングを取り入れたいものです。

コレクション操作くらいは素のJava8でできたような気もしてきましたが。