2012年3月6日火曜日

オブジェクトと関数の連携(1)

要求開発アライアンスのセッション『Object-Functional Analysis and Design: 次世代モデリングパラダイムへの道標』で使用するスライドについて背景説明を行っています。

今回は背景説明第5弾として、「オブジェクトと関数の連携(1)」として用意した以下の図を説明します。


まず、プログラミング言語のスコープでオブジェクト指向と関数型の連携について考えます。オブジェクト指向言語と関数型言語のハイブリッドであるScalaを念頭に置いています。

Scalaでは、オブジェクト指向言語の機能と関数型の機能をシームレスに使うことができます。このため、特に意識しないでプログラミングを行うと、オブジェクト指向言語と関数型言語の機能が渾然一体となったプログラムになりがちです。

図の上側では、オブジェクト、手続き、状態、関数、値、データ構造が渾然一体となっています。

関数型言語を使用する最も重要なポイントは、数学理論の活用が期待できることです。現段階では、まだまだ活用できる数学理論は少ないですが、それでも群論のモノイド、圏論のモナドという数学概念が、具体的に利用できるプログラミング言語の機能として活用されていることを説明しました。実務の世界での関数型言語の本格活用は端緒についたばかりであり、今後大発展が期待できます。すでにある膨大な数の数学理論を、必要な部分だけ関数型プログラミングの世界に移し替えるだけで、完成度の高いさまざまな技法や応用が使えるようになるので、陸続と新しい技術が登場してくるのではないかと予測します。

この大きな流れに乗るためには、できるだけ純粋関数型言語的な使い方をすることで、型付ラムダ計算から各種の数学理論につなげていく方向で考えていくのが筋であり、長い目で見ていろいろな効用が出てくるでしょう。

方針

とはいえ、純粋関数型言語ですべてを構築するのは現段階ではリスクを伴います。少なくてもScalaを採用する場合は、そういう判断がある事が多いでしょう。

その場合でも、できるだけ関数型言語のメリットを享受したいわけです。その際のプログラミングの方針としては、オブジェクト指向で作成する部分と、関数型で作成する部分を明確に分離して、プログラミングしていくのが現実解です。

図の下側では、左側にオブジェクト指向の世界、右側に関数型の世界を配置しています。関数型プログラミングの基本中の基本は副作用がないことです。左側が副作用のある世界、右側が副作用のない世界となります。

関数型の世界では、副作用がない計算を実現するために、以下の3つの機能を使います。

  • 関数
  • 代数的データ型
  • 永続データ構造

オブジェクト指向で値オブジェクト(value object)として扱っていたものは、代数的データ型に、データ構造は永続データ構造に変換した上で使用します。

関数型の世界で記述する部分を増やしていくことで、先ほど説明したように技術革新の大波を受け止めることが期待できます。たとえば、関数合成による再利用性の向上や並行プログラミングといった技術で関数型プログラミングの恩恵を享受できるようになりそうです。

0 件のコメント:

コメントを投稿