Object-Functional!
Analysis and Design!
次世代モデリングパラダイムへの道標
2012年3⽉月19⽇日
匠BusinessPlace
浅海智晴
⾃自⼰己紹介
•  (株)匠BusinessPlace。⽇日本Javaユーザグループ副会⻑⾧長。
   edge2.cc主宰。
•  代表作
  •  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)

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

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

メニーコア

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

メモリDB

•  I/Oボトルネックの解消
   •  アルゴリズム勝負
   •  並⾏行行プログラミング
OFADの要素技術/関連技術
                            CQRS

      Scala                 EIP
                    クラウド
      DSL           コンピュー   EDA

 計算機科学              ティング
                             アジャイル
              OFP
                              開発




  OOAD              OFAD           UCD/UX

DDD

DCI
                            はセッションで触れる技術
アプリケーションの階層と役割

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


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


フレーム    •  ドメインの共通処理を記述
 ワーク    •  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)
Object Functional
Programming (OFP)
OFP新三種の神器
 トレイト (trait)

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

 モナド (monad)

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

 型クラス (type class)

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

           協調
                 静的  
アプリケーション         構造
  モデル
モデル変換の流れ


 業務モデリング          要求モデリング        システム・モデリング             設計          実装
                                 アプリケーション・モデル


                                    システム
 業務モデル     抽出     要求モデル     変換                具体化     設計モデル    実現   実装
                                    モデル




                                      調整




                                                        調整




                                                                    参照
   抽出




                     拡張




                                     解決空間             解決空間
           問題空間                    プラットフォーム         プラットフォーム   実現   実装
                                      非依存              固有


                                   ドメイン・モデル




                                   DDDのカバー範囲
オブジェクトの世界と関数の世界
オブジェクトの世界と関数の世界-2
ユースケースと関数
イベント→データフローの流れ
メタモデル
データフローの実装技術
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演算
応⽤用
Domain-Driven	 Design	 (DDD)
•  A	 Model	 Expressed	 in	 Software
  •  Value	 Object	 (97)
•  Supple	 Design
  •    Side-Effect-Free	 Functions	 (250)
  •    Closure	 of	 Operations	 (268)
  •    Declarative	 Design	 –	 Domain	 Specific	 Language
  •    A	 Declarative	 Style	 of	 Design	 –	 Composite	 Specification
•  Maintaining	 Model	 Integrity
  •  Context	 Map	 (344)
•  Destillation
  •  Declarative	 Style	 (426)
Data	 Context	 Interaction	 (DCI)




    トレイト/型クラス
    でロールをデータ
      に編みこみ
CQRS,	 EDA
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で記述する応⽤用が期待⼤大。
END

More Related Content

PDF
Scalaプログラミング・マニアックス
PDF
オブジェクト指向開発におけるObject-Functional Programming
PDF
Object-Functional Analysis and Design and Programming温泉
PDF
実務者のためのかんたんScalaz
PDF
Object-Funcational Analysis and design
PDF
C#実装から見るDDD(ドメイン駆動設計)
PDF
Scalaでプログラムを作りました
PDF
ドメイン駆動設計のためのオブジェクト指向入門
Scalaプログラミング・マニアックス
オブジェクト指向開発におけるObject-Functional Programming
Object-Functional Analysis and Design and Programming温泉
実務者のためのかんたんScalaz
Object-Funcational Analysis and design
C#実装から見るDDD(ドメイン駆動設計)
Scalaでプログラムを作りました
ドメイン駆動設計のためのオブジェクト指向入門

What's hot (20)

PDF
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
PDF
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
PDF
ScalaMatsuri 2016
PPTX
Scala × DDD × 弊社実践例
PDF
ドメイン駆動設計(DDD)の実践Part2
PDF
協調モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第7回】
PDF
Thinking in Cats
PDF
Scalaで型クラス入門
PPTX
Java使いにとっての関数
PDF
Xcore introduction
PDF
Sbtのマルチプロジェクトはいいぞ
PDF
Why Reactive Matters #ScalaMatsuri
PDF
ATN No.2 Scala事始め
PDF
はてなブックマーク in Scala
PDF
めんどくさくない Scala #kwkni_scala
PDF
ちいさなオブジェクトでドメインモデルを組み立てる
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
PDF
なぜリアクティブは重要か #ScalaMatsuri
PDF
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
PDF
Phantom Type in Scala
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
ScalaMatsuri 2016
Scala × DDD × 弊社実践例
ドメイン駆動設計(DDD)の実践Part2
協調モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第7回】
Thinking in Cats
Scalaで型クラス入門
Java使いにとっての関数
Xcore introduction
Sbtのマルチプロジェクトはいいぞ
Why Reactive Matters #ScalaMatsuri
ATN No.2 Scala事始め
はてなブックマーク in Scala
めんどくさくない Scala #kwkni_scala
ちいさなオブジェクトでドメインモデルを組み立てる
あなたのScalaを爆速にする7つの方法(日本語版)
なぜリアクティブは重要か #ScalaMatsuri
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Phantom Type in Scala
Ad

Viewers also liked (17)

PDF
20110820 metaprogramming
PDF
SimpleModelerによるAndroidアプリ自動生成 with g3/g4
PDF
モデリングの未来 〜~パネルディスカッション
PDF
JavaWorld Day 2009 Scala
PDF
DSL駆動によるクラウド・アプリケーション開発
PDF
楽々Scalaプログラミング
PDF
Monadicプログラミング マニアックス
PDF
Everforth AWS
PDF
Scala DSLの作り方
PDF
文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox
PPT
メタプログラミングって何だろう
PDF
Scala in Model-Driven development for Apparel Cloud Platform
PDF
Scalaz-StreamによるFunctional Reactive Programming
PDF
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
PPTX
Prefer Cloud Platform - ビジョン、アーキテクチャ
PPTX
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
PDF
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
20110820 metaprogramming
SimpleModelerによるAndroidアプリ自動生成 with g3/g4
モデリングの未来 〜~パネルディスカッション
JavaWorld Day 2009 Scala
DSL駆動によるクラウド・アプリケーション開発
楽々Scalaプログラミング
Monadicプログラミング マニアックス
Everforth AWS
Scala DSLの作り方
文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox
メタプログラミングって何だろう
Scala in Model-Driven development for Apparel Cloud Platform
Scalaz-StreamによるFunctional Reactive Programming
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
Prefer Cloud Platform - ビジョン、アーキテクチャ
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
Ad

Similar to Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標 (20)

PDF
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
PDF
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
PDF
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
PDF
Kaleidox
PDF
Software Development with Symfony
PDF
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
PDF
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
PDF
Enterprise cloud design pattern 大量データ処理アーキテクチャの構築
PDF
Symfony2でより良いソフトウェアを作るために
PDF
ざっくり DDD 入門!!
PDF
ドメイン駆動設計という仕事の流儀
PPT
ドメインロジックの実装方法とドメイン駆動設計
PDF
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
PPTX
R超入門機械学習をはじめよう
PPTX
2014 11-20 Machine Learning with Apache Spark 勉強会資料
PPT
Scala on Hadoop
PDF
Isomorphic web development with scala and scala.js
PDF
Functional JavaScript with Lo-Dash.js
PDF
DTraceによるMySQL解析ことはじめ
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
Kaleidox
Software Development with Symfony
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Enterprise cloud design pattern 大量データ処理アーキテクチャの構築
Symfony2でより良いソフトウェアを作るために
ざっくり DDD 入門!!
ドメイン駆動設計という仕事の流儀
ドメインロジックの実装方法とドメイン駆動設計
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
R超入門機械学習をはじめよう
2014 11-20 Machine Learning with Apache Spark 勉強会資料
Scala on Hadoop
Isomorphic web development with scala and scala.js
Functional JavaScript with Lo-Dash.js
DTraceによるMySQL解析ことはじめ

More from Tomoharu ASAMI (20)

PDF
ケーススタディ/テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第47回】
PDF
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
PDF
分析モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第44回】
PDF
要求モデル/BDD 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第43回】
PDF
要求モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第42回】
PDF
ビジネス・モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第41回】
PDF
ケーススタディ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第40回】
PDF
Cloud Native Component Framework 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第39回】
PDF
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
PDF
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
PDF
ドメイン・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第36回】
PDF
Cloud Native CBD 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第35回】
PDF
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
PDF
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
PDF
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
PDF
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
PDF
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
PDF
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
PDF
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
PDF
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
ケーススタディ/テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第47回】
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
分析モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第44回】
要求モデル/BDD 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第43回】
要求モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第42回】
ビジネス・モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第41回】
ケーススタディ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第40回】
Cloud Native Component Framework 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第39回】
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
ドメイン・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第36回】
Cloud Native CBD 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第35回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】

Recently uploaded (12)

PDF
Working as an OSS Developer at Ruby Association Activity Report 2025
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PDF
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
PDF
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
PPTX
Vibe Codingを触って感じた現実について.pptx .
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
Working as an OSS Developer at Ruby Association Activity Report 2025
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
Vibe Codingを触って感じた現実について.pptx .
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...

Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標

  • 2. ⾃自⼰己紹介 •  (株)匠BusinessPlace。⽇日本Javaユーザグループ副会⻑⾧長。 edge2.cc主宰。 •  代表作 •  XML SmartDoc (XML⽂文書処理システム) •  Relaxer (XML/Javaスキーマコンパイラ) •  開発中 •  SimpleModeler (Scala DSLモデルコンパイラ) •  SmartDox (⽂文書処理システム) •  g3 (サービスマッシュアップフレームワーク) •  g4 (Androidアプリケーションフレームワーク) •  近著 •  「上流⼯工程UMLモデリング」(⽇日経BP) •  「マインドマップではじめるモデリング講座」(翔泳社) •  「ボクらのScala」(Softbank Creative)
  • 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/
  • 6. アジェンダ 関数型プログラミング Object Functional Programming (OFP) Object Functional Analysis and Design (OFAD) 応⽤用
  • 7. 新しい現実 クラウド・プラットフォーム •  クラウド・サービス、スマート・デバイス •  故障、遅延 •  ⼤大規模データ、⼤大規模演算 •  ⾼高頻度イベント •  ⾮非同期、並列、分散 •  計算機科学 メニーコア •  並⾏行行プログラミング メモリDB •  I/Oボトルネックの解消 •  アルゴリズム勝負 •  並⾏行行プログラミング
  • 8. OFADの要素技術/関連技術 CQRS Scala EIP クラウド DSL コンピュー EDA 計算機科学 ティング アジャイル OFP 開発 OOAD OFAD UCD/UX DDD DCI はセッションで触れる技術
  • 9. アプリケーションの階層と役割 アプリケー •  DSLの作法に従ってビジネスロ ジックを記述 ション •  OO、関数型のスキルは最低限 •  フレームワークを簡単に使⽤用する DSL ための専⽤用⾔言語 •  OO、関数型の⾼高度なスキル フレーム •  ドメインの共通処理を記述 ワーク •  OO、関数型の⾼高度なスキル
  • 11. 関数型⾔言語とは •  ⾼高階関数を扱える。 •  関数を値として扱える。 •  関数の引数と返却値に関数を渡せる。 •  関数リテラル(クロージャ)が記述できる。 •  数学(ラムダ計算、圏論など)的にプログラムを記述でき る。
  • 12. 関数型⾔言語の系譜 新世代関数型 ⾔言語 •  Haskell 伝統的関数型 •  Scala(+scalaz) ⾔言語 •  ラムダ計算 •  Lisp, ML, OCaml •  代数、圏論 •  ラムダ計算 •  型クラス •  ⼿手続き、オブジェ •  代数データ型、 元祖関数型⾔言語 クト指向で補完 モナド •  pure Lisp •  抽象データ型 •  Parametric •  Subtype polymorphism •  ラムダ計算 polymorphism
  • 13. 関数型⾔言語の⻑⾧長所と短所 ⻑⾧長所 •  ⾼高階関数を使った技が使える •  List, 関数合成(コンビネータ)など •  定理と証明 •  証明された(動作保証された)定理(関数)を積み上げてプログラ ムを記述できる (← 多少理想論も⼊入ってます) 短所 •  関数実⾏行行のオーバーヘッド •  関数オブジェクト •  メモリを⼤大量に消費する •  関数オブジェクト •  データの⼤大量複写 •  スタックの使⽤用量が読めない •  再帰
  • 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)
  • 18. OFP新三種の神器 トレイト (trait) •  mix-in •  型安全のAOP的な運⽤用 モナド (monad) •  計算⽂文脈をカプセル化する新しい⾔言語概念 •  Monadicプログラミング 型クラス (type class) •  型安全のダブルディスパッチ(?) •  Scalaでは、⽂文脈、主体、客体の組でオブジェクトを束縛
  • 24. オブジェクトモデリング 協調の実装技術 がボトルネック ドメイン・モデル になっている 状態 機械 協調 静的   アプリケーション 構造 モデル
  • 25. モデル変換の流れ 業務モデリング 要求モデリング システム・モデリング 設計 実装 アプリケーション・モデル システム 業務モデル 抽出 要求モデル 変換 具体化 設計モデル 実現 実装 モデル 調整 調整 参照 抽出 拡張 解決空間 解決空間 問題空間 プラットフォーム プラットフォーム 実現 実装 非依存 固有 ドメイン・モデル DDDのカバー範囲
  • 31. データフローの実装技術 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の⾃自然なプログラミングで記述できる。
  • 32. 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演算
  • 34. Domain-Driven Design (DDD) •  A Model Expressed in Software •  Value Object (97) •  Supple Design •  Side-Effect-Free Functions (250) •  Closure of Operations (268) •  Declarative Design – Domain Specific Language •  A Declarative Style of Design – Composite Specification •  Maintaining Model Integrity •  Context Map (344) •  Destillation •  Declarative Style (426)
  • 35. Data Context Interaction (DCI) トレイト/型クラス でロールをデータ に編みこみ
  • 37. 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"); } };
  • 38. まとめ •  クラウド・コンピューティング、メニーコアで並⾏行行・分 散プログラミングが必須に。 •  関数型⾔言語で計算機科学、数学の果実を取り込む道筋をつ ける。 •  技術革新の発⽣生する場になる。 •  要求仕様からシステムアーキテクチャはオブジェクト、 アルゴリズムは関数のハイブリッドが現実解。 •  オブジェクト・モデリングのボトルネックである協調を 関数型で埋める⽅方法が論点の⼀一つ。 •  プロセス計算で協調を記述するのはまだ時期尚早? •  当⾯面はデータフローをDSLで記述する応⽤用が期待⼤大。
  • 39. END