Object-Functional!
Analysis and Design!
次世代モデリングパラダイムを考える
2012年5⽉月28⽇日
JJUG
浅海智晴 (@asami224)
⾃自⼰己紹介
•  ⽇日本Javaユーザグループ。
•  代表作
  •  XML SmartDoc (XML⽂文書処理システム)
  •  Relaxer (XML/Javaスキーマコンパイラ)
•  開発中
  •  SimpleModeler (Scala DSLモデルコンパイラ)
  •  SmartDox (⽂文書処理システム)
  •  g3 (サービスマッシュアップフレームワーク)
  •  g4 (Androidアプリケーションフレームワーク)
•  近著
  •  「上流⼯工程UMLモデリング」(⽇日経BP)
  •  「マインドマップではじめるモデリング講座」(翔泳社)
  •  「ボクらのScala」(Softbank Creative)
活動
関連サイト
•  Modegramming Style (テキストDSL駆動開発を
   テーマにしたブログ)
   •  http://modegramming.blogspot.com/
•  SimpleModeler
   •  http://github.com/asami/simplemodeler/
•  SmartDox
   •  http://github.com/asami/smartdox
•  g3フレームワーク
   •  http://code.google.com/p/goldenport3/
•  g4フレームワーク
   •  http://github.com/asami/goldenport-android-
      library/
⽂文脈
アジェンダ

関数型プログラミング

 Object Functional
 Programming (OFP)

   Object Functional Analysis
   and Design (OFAD)

      応⽤用
新しい現実
クラウド・プラットフォーム

•  クラウド・サービス、スマート・デバイス
•  故障、遅延
•  ⼤大規模データ、⼤大規模演算
•  ⾼高頻度イベント
•  ⾮非同期、並列、分散
•  計算機科学

メニーコア

•  並⾏行行プログラミング

DSL (Domain Specific Language)

•  モデル記述としてのDSL
   •  ⾃自動⽣生成
•  フレームワークAPIとしてのDSL
   •  作りやすさの向上、開発量の激減
OFADの要素技術/関連技術
             クラウド
             コンピュー
             ティング
                     アジャイル
       OFP
                      開発




OOAD         OFAD          UCD/UX


                     本セッションのスコープ外
アプリケーションの階層と役割

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


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


フレーム    •  ドメインの共通処理を記述
 ワーク    •  OO、関数型の⾼高度なスキル
関数型プログラミング
関数型⾔言語とは
•  ⾼高階関数を扱える。
 •  関数を値として扱える。
 •  関数の引数と返却値に関数を渡せる。
 •  関数リテラル(クロージャ)が記述できる。




•  数学(ラムダ計算、圏論など)的にプログラムを記述でき
   る。
関数型⾔言語の系譜
浅海私⾒見見。
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を⽤用いたデーターフロー
KliesliでOption/Listを合成
Object Functional Analysis
and Design (OFAP)
オブジェクトモデリング
協調の実装技術
がボトルネック              ドメイン・モデル
 になっている         状態
                機械

           協調
                 静的  
アプリケーション         構造
  モデル
オブジェクトの世界と関数の世界
ユースケースと関数
応⽤用
データフローの実装技術
A Unifiying     ISBN: 978-0-521-11787-6
Framework for
Structured      Yourdon(Structured Chart)、DeMarco(DFD)、Jackson(Structure Text)
Analysis and    を代数(Initial algebra)で記述して、圏論で操作する試み
Design
Models          SA/SDの技術を関数に繋ぐことができる可能性


AsakusaFW       http://www.asakusafw.com/

                DSLで記述したデータフローをHadoop上で実⾏行行するフレームワーク

                Asakusa DSL設計⼿手法 (http://www.asakusafw.com/wp/wp-content/
                uploads/2012/01/AsakusaDSLDesignMethodology.pdf)

Spark           http://www.spark-project.org/

                Apache Mesos上で動作するクラスタ計算システム。Scala⾔言語に統合さ
                れているのが特徴。
                データフロー的演算をScalaの⾃自然なプログラミングで記述できる。
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演算
Enterprise	 Integration	 
     Patterns	 (EIP)
             Apache Camel Enterprise Integration Patterns

            •  http://camel.apache.org/enterprise-integration-
               patterns.html

RouteBuilder builder = new RouteBuilder() {
  public void configure() {
     errorHandler(deadLetterChannel("mock:error"));

         from("seda:a")
            .choice()
               .when(header("foo").isEqualTo("bar"))
                  .to("seda:b")
               .when(header("foo").isEqualTo("cheese"))
                  .to("seda:c")
               .otherwise()
                  .to("seda:d");
     }
};
まとめ
•  関数型⾔言語は時代の要請
 •  クラウド・コンピューティング、メニーコアで並⾏行行プログ
    ラミングが必須に。
 •  DSLにより、アプリケーション開発の⽣生産性向上
 •  関数型⾔言語で計算機科学、数学の果実を取り込む道筋をつ
    ける。
   •  ⇒ 並列、分散、形式⼿手法
•  オブジェクト技術は今も昔も⼤大⿊黒柱
 •  要求仕様、システムアーキテクチャ、OOP
•  オブジェクト技術と関数型⾔言語の併⽤用が必須
 •  OOAD+OOP+FP
•  当⾯面の現実解
 •  データフローをDSLで記述する応⽤用が期待⼤大。
END

Object-Funcational Analysis and design

  • 1.
  • 2.
    ⾃自⼰己紹介 •  ⽇日本Javaユーザグループ。 •  代表作 •  XML SmartDoc (XML⽂文書処理システム) •  Relaxer (XML/Javaスキーマコンパイラ) •  開発中 •  SimpleModeler (Scala DSLモデルコンパイラ) •  SmartDox (⽂文書処理システム) •  g3 (サービスマッシュアップフレームワーク) •  g4 (Androidアプリケーションフレームワーク) •  近著 •  「上流⼯工程UMLモデリング」(⽇日経BP) •  「マインドマップではじめるモデリング講座」(翔泳社) •  「ボクらのScala」(Softbank Creative)
  • 3.
  • 4.
    関連サイト •  Modegramming Style(テキストDSL駆動開発を テーマにしたブログ) •  http://modegramming.blogspot.com/ •  SimpleModeler •  http://github.com/asami/simplemodeler/ •  SmartDox •  http://github.com/asami/smartdox •  g3フレームワーク •  http://code.google.com/p/goldenport3/ •  g4フレームワーク •  http://github.com/asami/goldenport-android- library/
  • 5.
  • 6.
    アジェンダ 関数型プログラミング Object Functional Programming (OFP) Object Functional Analysis and Design (OFAD) 応⽤用
  • 7.
    新しい現実 クラウド・プラットフォーム •  クラウド・サービス、スマート・デバイス •  故障、遅延 • ⼤大規模データ、⼤大規模演算 •  ⾼高頻度イベント •  ⾮非同期、並列、分散 •  計算機科学 メニーコア •  並⾏行行プログラミング DSL (Domain Specific Language) •  モデル記述としてのDSL •  ⾃自動⽣生成 •  フレームワークAPIとしてのDSL •  作りやすさの向上、開発量の激減
  • 8.
    OFADの要素技術/関連技術 クラウド コンピュー ティング アジャイル OFP 開発 OOAD OFAD UCD/UX 本セッションのスコープ外
  • 9.
    アプリケーションの階層と役割 アプリケー •  DSLの作法に従ってビジネスロ ジックを記述 ション •  OO、関数型のスキルは最低限 •  フレームワークを簡単に使⽤用する DSL ための専⽤用⾔言語 •  OO、関数型の⾼高度なスキル フレーム •  ドメインの共通処理を記述 ワーク •  OO、関数型の⾼高度なスキル
  • 10.
  • 11.
    関数型⾔言語とは •  ⾼高階関数を扱える。 • 関数を値として扱える。 •  関数の引数と返却値に関数を渡せる。 •  関数リテラル(クロージャ)が記述できる。 •  数学(ラムダ計算、圏論など)的にプログラムを記述でき る。
  • 12.
    関数型⾔言語の系譜 浅海私⾒見見。 20年ほどの空⽩白の後の⾒見見え⽅方、 あるいはOOプログラマが後追い で調べたときの⾒見見え⽅方と考えて ください。 新世代関数型 ⾔言語 •  Haskell 伝統的関数型 •  Scala(+scalaz) ⾔言語 •  ラムダ計算 •  Lisp, ML, OCaml •  代数、圏論 •  ラムダ計算 •  型クラス •  ⼿手続き、オブジェ •  代数データ型、 元祖関数型⾔言語 クト指向で補完 モナド •  pure Lisp •  抽象データ型 •  Parametric •  Subtype polymorphism •  ラムダ計算 polymorphism
  • 13.
    関数型⾔言語の⻑⾧長所と短所 ⻑⾧長所 • ⾼高階関数を使った技が使える •  List処理, 関数合成(コンビネータ)、モナドなど •  定理と証明 •  証明された(動作保証された)定理(関数)を積み上げてプログラムを 記述できる (← 多少理想論も⼊入ってます) 短所 •  関数実⾏行行のオーバーヘッド •  関数オブジェクト •  メモリを⼤大量に消費する •  関数オブジェクト •  データの⼤大量複写 •  スタックの使⽤用量が読めない •  再帰 •  回避する技のノウハウが必要
  • 14.
  • 15.
    代数的構造デザインパターン 結合律 (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
  • 16.
    圏論デザインパターン 圏 (category) モナド • Hask圏 (Scala圏?) (monad) • クライスリ圏 (kleisli category) Applicative 射 (arrow, functor morphism) 関⼿手 (functor)
  • 17.
    並列プログラミング •  マルチスレッド •  共有状態 (shared mutability) •  共有状態をロック ← 伝統的⽅方法 •  STM (Software Transactional Memory) •  アクター •  状態をアクターローカル(スレッドローカル)にする (isolating mutability) •  不変オブジェクトによるメッセージで通信 •  関数プログラミング⽅方式 •  代数的データ型、永続データ構造 •  ⇒ 不変オブジェクト •  状態変更ではなく、状態変更命令書を計算 •  イメージとしてはSQLの⽂文字列を計算して作成する感じ •  モナドのメカニズムを使って並列処理(+状態変更命令書)を 隠蔽
  • 18.
  • 19.
    OFP新三種の神器 トレイト (trait) • mix-in •  型安全のAOP的な運⽤用 モナド (monad) •  計算⽂文脈をカプセル化する新しい⾔言語概念 •  Monadicプログラミング 型クラス (type class) •  型安全のダブルディスパッチ(?) •  Scalaでは、⽂文脈、主体、客体の組でオブジェクトを束縛
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
    オブジェクトモデリング 協調の実装技術 がボトルネック ドメイン・モデル になっている 状態 機械 協調 静的   アプリケーション 構造 モデル
  • 26.
  • 27.
  • 28.
  • 29.
    データフローの実装技術 A Unifiying ISBN: 978-0-521-11787-6 Framework for Structured Yourdon(Structured Chart)、DeMarco(DFD)、Jackson(Structure Text) Analysis and を代数(Initial algebra)で記述して、圏論で操作する試み Design Models SA/SDの技術を関数に繋ぐことができる可能性 AsakusaFW http://www.asakusafw.com/ DSLで記述したデータフローをHadoop上で実⾏行行するフレームワーク Asakusa DSL設計⼿手法 (http://www.asakusafw.com/wp/wp-content/ uploads/2012/01/AsakusaDSLDesignMethodology.pdf) Spark http://www.spark-project.org/ Apache Mesos上で動作するクラスタ計算システム。Scala⾔言語に統合さ れているのが特徴。 データフロー的演算をScalaの⾃自然なプログラミングで記述できる。
  • 30.
    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演算
  • 31.
    Enterprise Integration Patterns (EIP) Apache Camel Enterprise Integration Patterns •  http://camel.apache.org/enterprise-integration- patterns.html RouteBuilder builder = new RouteBuilder() { public void configure() { errorHandler(deadLetterChannel("mock:error")); from("seda:a") .choice() .when(header("foo").isEqualTo("bar")) .to("seda:b") .when(header("foo").isEqualTo("cheese")) .to("seda:c") .otherwise() .to("seda:d"); } };
  • 32.
    まとめ •  関数型⾔言語は時代の要請 • クラウド・コンピューティング、メニーコアで並⾏行行プログ ラミングが必須に。 •  DSLにより、アプリケーション開発の⽣生産性向上 •  関数型⾔言語で計算機科学、数学の果実を取り込む道筋をつ ける。 •  ⇒ 並列、分散、形式⼿手法 •  オブジェクト技術は今も昔も⼤大⿊黒柱 •  要求仕様、システムアーキテクチャ、OOP •  オブジェクト技術と関数型⾔言語の併⽤用が必須 •  OOAD+OOP+FP •  当⾯面の現実解 •  データフローをDSLで記述する応⽤用が期待⼤大。
  • 33.