Object-Functional
Analysis and Design
and Programming温泉
2012年年8⽉月18⽇日
浅海智晴
⽂文脈
論論点
•  業務アプリケーションにおける関数型⾔言語
 •  どこまでかけるのか
 •  モナドの使い所
•  業務アプリケーションにおけるオブジェクト指向⾔言語
 •  本物のオブジェクト指向⾔言語から新たな気づきはないか
•  関数型⾔言語とオブジェクト指向⾔言語の選択
•  関数型⾔言語とモデリング技術の連携
 •  形式⼿手法とモデリング?
アジェンダ
ディスカッションの元ネタを提供します。




関数型プログラミング

  Object Functional
  Programming (OFP)

     Object Functional Analysis
     and Design (OFAD)
新しい現実
ハードウェア

•  メニーコア、⼤大容量量メモリ、SSD
•  インメモリデータベース
•  並列列プログラミング

クラウド・プラットフォーム

•    クラウド・サービス、スマート・デバイス
•    故障、遅延
•    ⼤大規模データ、⼤大規模演算
•    ⾼高頻度度イベント
•    ⾮非同期、並列列、分散
•    NoSQL
アプリケーションの階層と役割

アプリケー   •  DSLの作法に従ってビジネスロ
           ジックを記述
 ション    •  OO、関数型のスキルは最低限


        •  フレームワークを簡単に使⽤用する
 DSL       ための専⽤用⾔言語
        •  OO、関数型の⾼高度度なスキル


フレーム    •  ドメインの共通処理理を記述
 ワーク    •  OO、関数型の⾼高度度なスキル
⽤用語
•  セッション内でのローカルな⽤用法

•  (普通の)オブジェクト指向⾔言語
    •  Java的なオブジェクト指向⾔言語。オブジェクト+クラス+抽象
       データ型+静的型付け+⼿手続き+値。
•  本物のオブジェクト指向⾔言語
    •  オブジェクトとメッセージから構成される核に何かを加えたも
       の。
•  関数型⾔言語
    •  純粋関数型⾔言語(での利利⽤用も可能)
   •  イミュータブル、参照透過性
 •  モナドが⼀一級市⺠民
 •  型クラス(相当)
•  モデリング
   •  業務アプリケーションを分析・設計するためのモデリング⼿手法
   •  UMLを使ったオブジェクト指向モデリング
関数型プログラミング
関数型⾔言語とは
•  ⾼高階関数を扱える。
 •  関数を値として扱える。
 •  関数の引数と返却値に関数を渡せる。
 •  関数リテラル(クロージャ)が記述できる。




•  数学(ラムダ計算、圏論論など)的にプログラムを記述でき
   る。
関数型⾔言語の系譜
浅海私⾒見見。
20年年ほどの空⽩白の後の⾒見見え⽅方、
あるいはOOプログラマが後追い
で調べたときの⾒見見え⽅方と考えて
ください。
                                           新世代関数型
                                           ⾔言語
                                           •  Haskell
                      伝統的関数型               •  Scala(+scalaz)
                      ⾔言語                  •  ラムダ計算
                      •  Lisp, ML, OCaml   •  代数、圏論論
                      •  ラムダ計算             •  型クラス
                      •  ⼿手続き、オブジェ            •  代数データ型、
       元祖関数型⾔言語          クト指向で補完                 モナド
       •  pure Lisp      •  抽象データ型            •  Parametric
                         •  Subtype              polymorphism
       •  ラムダ計算
                            polymorphism
関数型⾔言語の⻑⾧長所と短所
 ⻑⾧長所

 •  ⾼高階関数を使った技が使える
    •  List処理理, 関数合成(コンビネータ)、モナドなど
 •  定理理と証明
    •  証明された(動作保証された)定理理(関数)を積み上げてプログラムを
       記述できる  (← 多少理理想論論も⼊入ってます)

 短所

 •  関数実⾏行行のオーバーヘッド
    •  関数オブジェクト
 •  メモリを⼤大量量に消費する
    •  関数オブジェクト
    •  データの⼤大量量複写
 •  スタックの使⽤用量量が読めない
    •  再帰
    •  回避する技のノウハウが必要
関数型⾔言語の技術マップ
代数的構造デザインパターン
結合律律 (associative law)

•  半群 (semigroup)
•  モノイド  (monoid)         (a + b) + c = a + (b + c)
•  群 (group)

可換律律 (commutative law)

•  可換半群
•  可換モノイド                       a+b=b+a
•  可換群(アーベル群)

分配律律 (distributive law)

•  環  (ring)
•  体 (field)              a * (b + c) = a * b + a * c
圏論論デザインパターン

                         圏  (category)
          モナド            • Hask圏 (Scala圏?)
         (monad)         • クライスリ圏  
                          (kleisli category)




   Applicative                     射 (arrow,
    functor                        morphism)




                      関⼿手  
                   (functor)
並列列プログラミング
•  マルチスレッド  
   •  共有状態 (shared mutability)
   •  共有状態をロック ← 伝統的⽅方法
   •  STM (Software Transactional Memory)
•  アクター
   •  状態をアクターローカル(スレッドローカル)にする (isolating
      mutability)
   •  不不変オブジェクトによるメッセージで通信
•  関数プログラミング⽅方式
   •  代数的データ型、永続データ構造
   •  ⇒ 不不変オブジェクト
 •  状態変更更ではなく、状態変更更命令令書を計算
   •  イメージとしてはSQLの⽂文字列列を計算して作成する感じ
 •  モナドのメカニズムを使って並列列処理理(+状態変更更命令令書)を
    隠蔽
Object  Functional  
Programming  (OFP)
OFP新三種の神器
 トレイト  (trait)

•  mix-in
•  型安全のAOP的な運⽤用

 モナド  (monad)

•  計算⽂文脈をカプセル化する新しい⾔言語概念念
•  Monadicプログラミング

 型クラス  (type class)

•  型安全のダブルディスパッチ(?)
•  Scalaでは、⽂文脈、主体、客体の組でオブジェクトを束縛
オブジェクトと関数の連携(1)
オブジェクトと関数の連携(2)
Arrowを⽤用いたデーターフロー
モナドによる計算⽂文脈
Object  Functional  Analysis  
and  Design  (OFAP)
オブジェクトモデリング
協調の実装技術
がボトルネック              ドメイン・モデル
 になっている         状態
                機械

           協調
                 静的  
アプリケーション         構造
  モデル
オブジェクトの世界と関数の世界
ユースケースと関数
メタモデル
SparkとScalding
val file = spark.textFile("hdfs://...")

file.flatMap(line => line.split(" "))
    .map(word => (word, 1))
                                     Spark
    .reduceByKey(_ + _)


class WordCountJob(args : Args) extends Job(args) {
  TextLine( args("input") ).read.
   flatMap('line -> 'word) { line : String => line.split("s+") }.
   groupBy('word) { _.size }.
   write( Tsv( args("output") ) )
}

                            Scalding
                            •  https://github.com/twitter/scalding
                            •  CascadingのScala DSL
                            •  Collection APIでHadoop演算
まとめ
•  論論点
  •  業務アプリケーションにおける関数型⾔言語
     •  どこまでかけるのか
     •  モナドの使い所
  •  業務アプリケーションにおけるオブジェクト指向⾔言語
     •  本物のオブジェクト指向⾔言語から新たな気づきはないか
  •  関数型⾔言語とオブジェクト指向⾔言語の選択
  •  関数型⾔言語とモデリング技術の連携
     •  形式⼿手法とモデリング?
END

Object-Functional Analysis and Design and Programming温泉