2012年12月11日火曜日

ゆるふわScalaプログラミング・振り返り(5)

振り返り(4)では、並行プログラミング/並列プログラミングの軸と、可変共用、可変分離、不変の軸を導入し、この2つの軸の相性の良い組合せと考えられる:

  • 可変分離⇔並行プログラミング
  • 不変⇔並列プログラミング

について簡単に考えてみました。

可変分離⇔並行プログラミング

アクター・プログラミングでは、「可変分離」戦略によって、アクター内に閉じたリソースに関しては競合を気にすることなく自由に更新することができます。

とはいえ、プログラムの信頼性、保守性を考えると可能な限り「不変」戦略を取るのがよいでしょう。また、個人的には一定のテクニックをマスターすれば、「不変」戦略の方が開発効率が高いと感じています。バグが出難いのが大きいですし、オブジェクトのライフサイクルに対する考慮をしなくてもよいのも大きなメリットです。

スライドにある以下の図は、オブジェクト指向と関数型を組み合わせたプログラミング・モデルです。オブジェクト指向の部分と関数型の部分を明確に分離し、オブジェクト指向の部分でリソースの更新を行います。そして、関数型の部分では「不変」戦略によって信頼性、保守性、開発効率のメリットを取りにいきます。



簡単な流れは以下のようになります。

  1. アクターがリクエストを受け取る。
  2. リクエストからリソースを更新するための更新指示書を計算。
  3. 更新指示書に従ってリソースを更新。
  4. 必要に応じてレスポンスを返す。

ここでは、ざっくり「更新指示書」と呼んでいますが、単なる値の場合もありますし、SQLのようなバッチ的更新プログラム、インタラクティブなインタープリタ・プログラムといったパターンがあります。

いずれにしても、アクター処理の大半を関数型的な「不変」戦略によって記述することで、信頼性、保守性、開発効率のメリットを享受することができます。

この方式の短所として、メモリ使用量が多くなる、実行速度が若干遅くなる、ということはありますが、今時のハードウェアではほとんど問題にならないと思われます。問題になるケースでも、問題箇所のみオブジェクト指向を使う、Javaを使う、という形で旧来の技術で最適化を行えばよいでしょう。

0 件のコメント:

コメントを投稿