SlideShare une entreprise Scribd logo
1  sur  64
Télécharger pour lire hors ligne
関数モデル
2022年2⽉17⽇
浅海智晴
基本モデル
クラウドアプリケーションのための
オブジェクト指向分析設計講座
第8回
第1部 基本編の構成
• 概論 [第1回]
• 開発プロセス [第2回]
• 基本モデル [第3回]
• 静的モデル(1) [第4回]
• 静的モデル(2) [第5回]
• 動的モデル [第6回]
• 協調モデル [第7回]
• 関数モデル [第8回]
• 物理モデル [第9回]
• 作業分野 [第10回]
• ビジネス・モデリング [第11回]
• 要求 [第12回]
• 分析 [第13回]
• 設計 [第14回]
• 作業分野
• 実装 [第15回]
• テスト [第16回]
• アプリケーション・アーキテクチャ [第17回]
• ドメイン・モデル [第18回]
• アプリケーション・モデル [第19回]
• プレゼンテーション・モデル [第20回]
• ケーススタディ[第21回]
• 要求モデル [第22回]
• 分析モデル [第23回]
• 設計モデル [第24回]
• 実装 [第25回]
• テスト [第26回]
SimpleModeling2021
• オブジェクト指向分析設計での共通範囲
• UML/UP
• 本講座で使⽤するUMLプロファイル
• プロファイル:SimpleModeling2021 (SM2021)
• オブジェクト指向分析設計の基本からの拡張部を明確化
• アジャイル開発
• Communication
• Embrace Change
• Travel Light
• Scaling
• クラウド・アプリケーション
• モデル駆動開発
SM2021
Travel Light
Embrace Change
Cloud
Model-Driven
Scaling
原理 (Principle)
• Agail Software Development [ASD]
• SRP (The Single Responsibility Principle)
• OCP (The Open-Close Principle)
• LSP (The Liskov Substitution Principle)
• …
• GRASP (General Responsibility Assignment Software Patterns or Principals)
• Low Coupling
• High Cohesion
• …
• Writing Effective Use Cases [WEUC]
• Scope
• …
パターン (Pattern)
• Design Patterns [DP]
• Observer, Strategy, …
• Domain Driven Design [DDD]
• Ubiquitous Language, Intention-
Revealing Interfaces, …
• Analysis Patterns [AP]
• Party, Quantity, …
• Pattern-Oriented Software
Architecture [POSA]
• Layers, Pipes and Filters, …
• Patterns of Enterprise
Application Architecture [PEAA]
• Unit of Work, Data Transfer Object,
…
• Enterprise Integration Patterns
[EIP]
• Message Bus, Aggregator, …
• Patterns for Effective Use
Cases [PEUC]
• CompleteSingleGoal,
VerbPhraseName, …
• AntiPatterns [AnP]
• Stovepipe System, Analysis
Paralysis, …
実装諸元
• Scala 3.1.1
• オブジェクト指向&関数型プログラミ
ング⾔語
• https://www.scala-lang.org/
• Cats 2.7.0
• 関数型クラスライブラリ
• https://typelevel.org/cats/
• Spire 0.18.0-M3
• 数値計算ライブラリ
• https://typelevel.org/spire/
• ZIO 2.0.0-RC2
• I/Oモナドライブラリ
• https://zio.dev/
• ZStream 2.0.0-RC2
• ZIOのリアクティブ・ストリーム
• https://zio.dev/next/datatypes/stream/zst
ream/
• Akka Actor 2.6.18
• アクターライブラリ
• https://akka.io/
• Akka Stream 2.6.18
• Akka Actorのリアクティブ・スト
リーム
• https://doc.akka.io/docs/akka/current/str
eam/index.html
今回使⽤しないものも含めて、
設計・実装時に使⽤(予定)する
開発環境です
内容
• 関数型プログラミング
• 関数型プログラミングの基盤技術
• 関数型プログラミングの具体例
• 「関数」とオブジェクト指向
• モデリングと「関数」
基本モデル
• UMLの論理モデル(構造、動的)+αを以下の4種類に分類
• 静的モデル (Static Model)
• 動的モデル (Dynamic Model)
• 協調モデル (Collaboration Model)
• 関数モデル (Functional Model)
UML基本分類
UML
アーキテクチャ
ビュー
論理モデルの構成
オブジェクト指向の位置付け 第3回 基本モデル
クラス図
クラス図 クラス図
コンポーネント図
コンポーネント図
ユースケース図 コミュニケーション図
コンポーネント図 コンポーネント図
第10回 作業分野
第3回 基本モデル
作業分野
とモデル
論理モデルの特性
第3回 基本モデル
関数型プログラミング
「関数」への視点
• 「関数」という技術をオブジェクト指向分析設計/オブジェク
ト指向プログラミングの中でどのように位置付けていくのか
• 「関数」の新技術の理解
• 「関数」の旧来技術の再評価
• 関数で実現した箇所は開発効率/品質向上が⾒込める
• 可能な限り関数化したい
• Side-Effect Free Function [DDD]
• 来たるべき分散・並列処理時代への備え
• 証明プログラミングへの布⽯
Cloud
「関数」の適⽤箇所
• 概念
• 型クラス
• 抽象代数
• 圏論
• モデル
• ルール
• データ・フロー
• リアクティブ・ストリーム
• 応⽤
• 数理モデルを⽤いた各種応⽤(統計処理、機械学習など)
プログラミング⾔語と「証明」
「コンパイルによる証明」のメリット
• 品質向上
• ⼯数削減
• テスト⼯数削減
• 「証明」された機能はテストを省略できる
• リファクタリング
• リファクタリングのベースとして「コンパイルによる証明」は核⼼的
な重要さを持つ
• 並列・分散
• 今後、⼀般化すると考えられる並列・分散でも核⼼的な重要さを持つ
ことになると考えられる
Travel Light
Embrace Change
Scaling
Cloud
関数型プログラミングの特性
• 副作⽤なし
• Side-Effect-Free Functions [DDD]
• 参照透過性(Referential transparency)
• 同じ⼊⼒に対して必ず同じ値を返す
• 置換モデル
• 「等価による置換」の繰り返しで式の評価を⾏う
• 合成可能性(Composable)
• 細粒度のマイクロ・フレームワーク上でアルゴリズムの部品化・再利⽤
• DSL(Domain Specific Language)メタ⾔語
• Declarative Style [DDD]
関数型プログラミングの⻑所短所
• ⻑所
• ⾼品質
• 開発効率
• DSLのメタ⾔語
• 短所
• 動作性能が遅い
• メモリを⼤量消費する
• 関数プログラミングのハードルが⾼い
並列・分散処理への適⽤
• 代数的性質
• Idempotent (冪等性)
• Monoid (モノイド)
• CommutativeMonoid (可換モノイド)
• 分散処理フレームワーク
• Apache Hadoop
• MapReduce
• Apache Spark
• RDD(Resilient Distributed Dataset)
• Read-only, transformation (map, filter, join)
関数型プログラミングの
基盤技術
代数的データ型 (Algebraic Data Type)
• 2つのADT
• Abstract Data Type: 抽象データ型 ⇒ オブジェクト指向
• Algebraic Data Type: 代数的データ型 ⇒ 関数型
• 複数の型を組み合わせてつくる複合型
• 直積型 (product type)
• 直和型 (sum type)
• UML: 複合型のdatatype
• Value Object [DDD]
• Scalaでの実現
• 不変オブジェクト
• 直積 : Tuple, case class
• 直和 : Either, enum, sealed trait
型クラス (Type class)
• 計算機科学においてアドホッ
ク多相をサポートする型シス
テムの構成機能(Wikipedia)
• 関数型⾔語でクラス&継承的
なものを実現する(Haskell由
来)
SM2021
第4回 静的モデル(1)
型クラス
• アドホック多相(ad hoc polymorphism)
• クラスとの違い
• コンパイル時に静的に解決される
• 対象のクラスに後付で型クラスを設定することができる
• 使い所
• 外部ライブラリのクラスをポリモーフィズム対象にできる
• クラス間の依存性の低減(疎結合)
• 多重継承問題の回避
• 関数の各種性質を再利⽤可能な形でモデル化
第4回 静的モデル(1)
主要型クラス/抽象代数
• Semigroup
• 群論の半群
• Monoid
• 群論のモノイド
• Group
• 群論の群
Semigroup (半群)
• 群論の半群
• 定義(Wikipedia)
• 集合 S とその上の⼆項演算 • : S × S → S が与えられたとき、組 (S,
• ) が以下の条件を満たすならば、これを半群という。
• 結合律S の各元 a, b, c に対して、等式 (a • b) • c = a • (b • c) が満たされる。
• ⼆項演算(加法)
• 結合法則: (a + b) + c = a + (b + c)
• 例1: (1 + 2) + 3 = 1 + (2 + 3)
• 例2: (1 * 2) * 3 = 1 * (2 * 3)
• 例3: (“a” + “b”) + “c” = “a” + (“b” + “c”)
Monoid (モノイド)
• 半群に単位元の条件を追加したもの
• 定義(Wikipedia改)
• 集合 S とその上の⼆項演算 •: S × S → S が与えられ、以下の条件を
満たすならば、組 (S, •, e) をモノイドという。
• 結合律S の任意の元 a, b, c に対して、(a • b) • c = a • (b • c).
• 単位元の存在S の元 e が存在して、S の任意の元 a に対して e • a = a • e = a.
• 単位元: a + e = e + a = e (e: 単位元)
• 例1: 2 + 0 = 0 + 2 = 2
• 例2: 2 × 1 = 1 × 2 = 2
• 例2: “a” + “” = “” + “a” = “a”
Group (群)
• モノイドに逆元の条件を追加したもの
• 定義(Wikipedia)
• 集合 G とその上の⼆項演算 μ: G × G → G の組 (G, μ) が群であるとは、以下の3つの条件を満た
すことをいう:
• (結合法則)任意の G の元 g, h, k に対して、μ(g, μ(h, k)) = μ(μ(g, h), k) を満たす:
• (∀g, h, k ∈ G)[μ(g, μ(h, k)) = μ(μ(g, h), k)].
• (単位元の存在)μ(g, e) = μ(e, g) = g を G のどんな元 g に対しても満たすような G の元 e が存在する:
• (∃e ∈ G)(∀g ∈ G)[μ(g, e) = μ(e, g) = g].
• このような e は存在すれば⼀意であり、G の単位元という。
• (逆元の存在)G のどんな元 g に対しても、μ(g, x) = μ(x, g) = e となるような G の元 x が存在する:
• (∀g ∈ G)(∃x ∈ G)[μ(g, x) = μ(x, g) = e].
• このような x は存在すれば⼀意であり、この x を g の G における逆元といい、しばしば g−1, あるいは演算を加法的
に書く場合には −g で表される。
• 逆元: a + (-a) = (-a) + a = e (e: 単位元)
• 例1: 2 + (-2) = (-2) + 2 = 0
• 例2: 2 ×
!
"
=
!
"
* 2 = 1
• 例3: “a” + ??? = ??? + “a” = “”
Catsの定義
• Semigroup
• combine(x: A, y: A): A [⼆項演算]
• 法則 : SemigroupLawsで定義
• Monoid
• empty: A [単位元]
• 法則 : MonoidLawsで定義
• Group
• inverse(a: A): A [逆元]
• 法則 : GroupLawsで定義
主要型クラス/マイクロ・フレームワーク
• Functor
• 圏論の関⼿
• Applicative
• 圏論のアプリカティブ関⼿
• Monad
• 圏論のモナド
• Traverse
• ⾛査可能なコンテナ
• Foldable
• 畳み込み可能なコンテナ
Functor, Applicative, Monadは圏論由来ですが、
実務的な観点からマイクロ・フレームワークとして
理解・活⽤していくのが本講座の⽅針です。
Functor
• 圏論の関⼿由来
• Catsの定義
• mapコンビネータ : Functor上の要素の写像
• 規則
• Scala⾔語オリジナルではコンベンションでサポート
• mapコンビネータ
• for comprehension(シンタックス・シュガー)
def covariantIdentity[A](fa: F[A]): IsEq[F[A]] =
fa.map(identity) <-> fa
def covariantComposition[A, B, C](fa: F[A], f: A => B, g: B => C): IsEq[F[C]] =
fa.map(f).map(g) <-> fa.map(f.andThen(g))
など
Applicative
• 圏論のアプリカティブ関⼿由来
• Catsの定義
• apコンビネータ: Applicative上の関数をApplicative上の要素に適⽤
• pureコンビネータ : 要素をApplicative上に持ち上げる
• 規則
• Scala⾔語オリジナルでは直接サポートなし
def applicativeIdentity[A](fa: F[A]): IsEq[F[A]] =
F.pure((a: A) => a).ap(fa) <-> fa
def applicativeHomomorphism[A, B](a: A, f: A => B): IsEq[F[B]] =
F.pure(f).ap(F.pure(a)) <-> F.pure(f(a))
def applicativeInterchange[A, B](a: A, ff: F[A => B]): IsEq[F[B]] =
ff.ap(F.pure(a)) <-> F.pure((f: A => B) => f(a)).ap(ff)
def applicativeMap[A, B](fa: F[A], f: A => B): IsEq[F[B]] =
fa.map(f) <-> F.pure(f).ap(fa)
など
Monad
• 圏論のモナド由来
• Catsの定義
• flatMapコンビネータ : Kleisli関数(A => F[B])による写像
• 規則
• Scala⾔語オリジナルではコンベンションでサポート
• flatMapコンビネータ
• for comprehension(シンタックス・シュガー)
def monadLeftIdentity[A, B](a: A, f: A => F[B]): IsEq[F[B]] =
F.pure(a).flatMap(f) <-> f(a)
def monadRightIdentity[A](fa: F[A]): IsEq[F[A]] =
fa.flatMap(F.pure) <-> fa
def mapFlatMapCoherence[A, B](fa: F[A], f: A => B): IsEq[F[B]] =
fa.flatMap(a => F.pure(f(a))) <-> fa.map(f)
Foldable
• 畳み込み演算を⾏うコンテナ
• 通常の畳み込み演算に加えてMonoid, Applicative, Monadに
対する畳込み演算を提供
• foldMapコンビネータ: Monoidの要素列を畳み込む
Traverse
• ⾛査演算を⾏うコンテナ
• Foldableを継承
• 通常の⾛査演算に加えてApplicative, Monadに対する⾛査演
算を提供
• traverseコンビネータ: List[Option[Int]] ⇒ Option[List[Int]]
• モナドの⼊れ⼦を扱う場合は必須
関数型プログラミングの
具体例
Monoidの例 : Counter
case class Counter(c: Int) extends AnyVal:
def +(rhs: Counter): Counter = Counter(c + rhs.c)
object Counter:
val empty = Counter(0)
implicit object CounterEq extends Eq[Counter]:
def eqv(x: Counter, y: Counter) = x == y
implicit object CounterMonoid extends Monoid[Counter]:
def empty: Counter = Counter.empty
def combine(x: Counter, y: Counter): Counter = x + y
Counterの定義
CounterのMonoid型クラスの定義 emptyメソッド(単位元) を定義
Semigroup由来のcombineメソッド(結合法則を満たした⼆項演算)を定義
def legacyprocedual(ps: List[Int]): Counter =
var r = Counter.empty
for (i <- 0 until ps.length)
r = r + Counter(ps(i))
r
def procedual(ps: List[Int]): Counter =
var r = Counter.empty
for (x <- ps)
r = r + Counter(x)
r
⼿続き型での利⽤
伝統的⼿続き
モダン⽂法(Scala)での⼿続き
def functional(ps: List[Int]): Counter =
@annotation.tailrec
def go(ls: List[Int], c: Counter): Counter = ls match
case Nil => c
case x :: xs => go(xs, c + Counter(x))
go(ps, Counter.empty)
def morefunctional(ps: List[Int]): Counter =
ps.foldLeft(Counter.empty)((z, x) => z + Counter(x))
def algebraic(ps: List[Int]): Counter =
ps.foldMap(Counter.apply)
関数型での利⽤
関数型基本(再帰呼び出し)
代数的抽象(MonoidとFoldable)による実現
関数型畳み込み
class CounterPropertySpec extends AnyWordSpec with should.Matchers with
ScalaCheckDrivenPropertyChecks:
"Counter" should {
val nonNegativeInts = Gen.listOf(Gen.choose(0, 10000))
"Property-Based TestingでCounterのfoldMap動作をテストする" in
forAll(nonNegativeInts) { (xs: List[Int]) =>
val c: Counter = xs.foldMap(Counter.apply)
c.c should be(xs.sum)
}
}
Property-basedテスティングによるテスト
テストデータの特性を定義
Property−basedテスティングの実⾏
BDD (Behavior-Driven Development)スタイルのテスト
Travel Light
第16回 テスト
class CounterLawSpec extends AnyFunSuite with FunSuiteDiscipline with Configuration:
lazy val counterGen: Gen[Counter] = Gen.choose(0, 10000).map(Counter.apply)
implicit lazy val counterArbitrary: Arbitrary[Counter] = Arbitrary(counterGen)
checkAll("Counter", MonoidTests[Counter].monoid)
Monoid法則のテスト
Monoid法則のテストを⼀括して⾏う
型クラスの規則のテスト⽤トレイト
sbt:Scala 3 Cats> test
[info] compiling 1 Scala source to /Users/asami/src/workspace2021/scala3cats/target/scala-3.1.0/classes ...
[info] done compiling
[info] CounterLawSpec:
[info] - Counter.monoid.associative
[info] - Counter.monoid.collect0
[info] - Counter.monoid.combine all
[info] - Counter.monoid.combineAllOption
[info] - Counter.monoid.intercalateCombineAllOption
[info] - Counter.monoid.intercalateIntercalates
[info] - Counter.monoid.intercalateRepeat1
[info] - Counter.monoid.intercalateRepeat2
[info] - Counter.monoid.is id
[info] - Counter.monoid.left identity
[info] - Counter.monoid.repeat0
[info] - Counter.monoid.repeat1
[info] - Counter.monoid.repeat2
[info] - Counter.monoid.reverseCombineAllOption
[info] - Counter.monoid.reverseRepeat1
[info] - Counter.monoid.reverseRepeat2
[info] - Counter.monoid.reverseReverses
[info] - Counter.monoid.right identity
[info] CounterPropertySpec:
[info] Counter
[info] - should Property-Based TestingでCounterのfoldMap動作をテストする
[info] ScalaTest
[info] Run completed in 443 milliseconds.
[info] Total number of tests run: 19
[info] Suites: completed 2, aborted 0
[info] Tests: succeeded 19, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[info] Passed: Total 20, Failed 0, Errors 0, Passed 20
[success] Total time: 1 s, completed 2021/11/07 5:54:50
CounterLawSpecによるMonoid法則テスト
CounterPropertySpecによるBDDテスト
「関数」とオブジェクト指向
オブジェクトと関数
サービスと関数
Functorによるパイプライン
モナディック・パイプライン
(Monadic Pipeline) 本講座ではモナドを中⼼とした
マイクロ・フレームワークを
モナディック・パイプラインと呼びます。
Optionモナドによる
モナディック・パイプライン
Scala: for comprehension
• モナディック・パイプラインのためのシンタクスシュガー
def func(a: Int): Int =
val r: Option[Int] = for {
b <- f(a)
c <- g(b)
d = h(c)
e <- i(d)
} yield e
r.get
def f(x: Int): Option[Int] = ???
def g(x: Int): Option[Int] = ???
def h(x: Int): Int = ???
def i(x: Int): Option[Int] = ???
flatMapコンビネータ
mapコンビネータ
リアクティブ・ストリーム
• The Reactive Manifesto
• Reactive Streams
• ⾮同期ストリーム処理、バック
プレッシャー、ノンブロッキン
グ
• Akka Streams
• Reactive Stream & 関数
• FS2(Functional Stream for
Scala)
• Scalaz-stream
• ZStream
Cloud
第6回 動的モデル
リアクティブ・ストリームを
ZStream Monadで実現
ストリーミング
並⾏・⾮同期
リソース・セーフ
リジリエント
状態遷移
チャンク化
モデリングと「関数」
分析・設計で使⽤する関数系のモデル
• ルール
• データフロー
• リアクティブ・ストリーム
ルール
• アプリケーションで使⽤する各種ルールをモデル化
• ビジネス・モデリング、ドメイン・モデルとアプリケーションの連
続性
• ビジネス・サイドのステークホルダーと共有
• 変化点(variation point)/拡張点(extension point)の実現
• ルールの種類
• ビジネス・ルール
• ドメイン・ルール
• アプリケーション・ルール
• 実現⽅法
• 単純な関数、表からルール・エンジンまで
DFD (Data Flow Diagram)
• 構造化⼿法の記法
• データの流れを記述
• 概念レベル
• システムの全体像をデータの観点から
記述
• 詳細レベル
• バッチの設計情報
• UMLではアクティビティ図(オブジェ
クト・フロー)が対応
• OMTの第1版ではFunctionalモデルに
⼊っていたが第2版では削除された
• 関数的なアプローチとして再評価して
もよいかも
第6回 動的モデル
リアクティブ・ストリーム
(Reactive Streams)
• ストリーミング処理をモデル化
• データのクラスタリングが可能
• 移⼊・移出などの⼤規模データ操作にも適している
• Akka-Streams, Zstreamなどリアクティブ・ストリームのフ
レームワークを使って実装まで連続性がある
• Enterprise Integration Patterns [EIP]
まとめ
• 主要型クラス
• 抽象代数
• Semigroup, Monoid, Group
• マイクロ・フレームワーク
• Functor, Applicative, Monad, Foldable, Traverse
• モナディック・パイプライン
• 関数モデル
• ルール
• データフロー
• リアクティブ・ストリーム
参考⽂献
• The Unified Modeling Language Reference Manual, 2nd (Rumbaugh他,
2004)
• The Unified Modeling Language User Guide, 2nd (Booch他, 2004)
• The Unified Software Development Process (Jacobson他, 1999)
• UML 2 and the Unified Process: Practical Object-Oriented Analysis and
Design (Arlow他, 2005)
• OMG Unified Modeling Language Version 2.5 (OMG, 2015)
• Agile Software Development : Principles, Patterns, and Practices
(Martin他, 2003)
• Applying UML and Patterns : An Introduction to Object-Oriented
Analysis and Design and Iterative Development, 3rd (Larman, 2005)
• Writing Effective Use Cases (Cockburn, 2000)
• 上流⼯程UMLモデリング (浅海, 2008)
• Design Patterns : Elements of Reusable Object-Oriented Software
(Gamma他, 1995)
• Domain-Driven Design: Tracking Complexity in the Heart of Software
(Evans, 2003)
• Analysis Patterns: Reusable Object Models (Fowler, 1996)
• Pattern-Oriented Software Arhitecture: A System of Patterns
(Buschamnn他, 1996)
• Patterns of Enterprise Application Architecture (Fowler他, 2002)
• Enterprise Integration Patterns : Designing, Building, and Deploying
Messaging Solutions (Hohpe他, 2004)
• Patterns for Effective Use Cases (Adolph他, 2003)
• AntiPatterns : Refactoring Software, Architectures, and Projects in
Crisis (Brown他, 2008)
• Functional and Reactive Domain Modeling (Ghosh, 2016)
• Functional Programming in Scala (Chiusano他, 2014)
• Scala Design Patterns: Design modular, clean, and scalable applications
by applying proven design patterns in Scala (Nikolov, 2018)

Contenu connexe

Similaire à 関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】

オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと Haruka Ozaki
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】Tomoharu ASAMI
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】Tomoharu ASAMI
 
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) kunihikokaneko1
 
研究生のためのC++ no.4
研究生のためのC++ no.4研究生のためのC++ no.4
研究生のためのC++ no.4Tomohiro Namba
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】Tomoharu ASAMI
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Prunus 1350
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】Tomoharu ASAMI
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しようYasutaka Kawamoto
 
すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-Hiromasa Ohashi
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 

Similaire à 関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】 (20)

オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
 
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
 
研究生のためのC++ no.4
研究生のためのC++ no.4研究生のためのC++ no.4
研究生のためのC++ no.4
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
 
HiRoshimaR3_IntroR
HiRoshimaR3_IntroRHiRoshimaR3_IntroR
HiRoshimaR3_IntroR
 
Python opt
Python optPython opt
Python opt
 
Gurobi python
Gurobi pythonGurobi python
Gurobi python
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 

Plus de Tomoharu ASAMI

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】Tomoharu ASAMI
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】Tomoharu ASAMI
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】Tomoharu ASAMI
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】Tomoharu ASAMI
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】Tomoharu ASAMI
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】Tomoharu ASAMI
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】Tomoharu ASAMI
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】Tomoharu ASAMI
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】Tomoharu ASAMI
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】Tomoharu ASAMI
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】Tomoharu ASAMI
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】Tomoharu ASAMI
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】Tomoharu ASAMI
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】Tomoharu ASAMI
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】Tomoharu ASAMI
 
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】Tomoharu ASAMI
 
要求/ユースケース 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第13回】
要求/ユースケース 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第13回】要求/ユースケース 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第13回】
要求/ユースケース 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第13回】Tomoharu ASAMI
 
要求 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第12回】
要求 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第12回】要求 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第12回】
要求 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第12回】Tomoharu ASAMI
 
ビジネス・モデリング 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第11回】
ビジネス・モデリング 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第11回】ビジネス・モデリング 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第11回】
ビジネス・モデリング 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第11回】Tomoharu ASAMI
 
作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】
作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】
作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】Tomoharu ASAMI
 

Plus de Tomoharu ASAMI (20)

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
 
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
 
要求/ユースケース 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第13回】
要求/ユースケース 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第13回】要求/ユースケース 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第13回】
要求/ユースケース 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第13回】
 
要求 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第12回】
要求 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第12回】要求 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第12回】
要求 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第12回】
 
ビジネス・モデリング 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第11回】
ビジネス・モデリング 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第11回】ビジネス・モデリング 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第11回】
ビジネス・モデリング 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第11回】
 
作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】
作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】
作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】
 

関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】

  • 2. 第1部 基本編の構成 • 概論 [第1回] • 開発プロセス [第2回] • 基本モデル [第3回] • 静的モデル(1) [第4回] • 静的モデル(2) [第5回] • 動的モデル [第6回] • 協調モデル [第7回] • 関数モデル [第8回] • 物理モデル [第9回] • 作業分野 [第10回] • ビジネス・モデリング [第11回] • 要求 [第12回] • 分析 [第13回] • 設計 [第14回] • 作業分野 • 実装 [第15回] • テスト [第16回] • アプリケーション・アーキテクチャ [第17回] • ドメイン・モデル [第18回] • アプリケーション・モデル [第19回] • プレゼンテーション・モデル [第20回] • ケーススタディ[第21回] • 要求モデル [第22回] • 分析モデル [第23回] • 設計モデル [第24回] • 実装 [第25回] • テスト [第26回]
  • 3. SimpleModeling2021 • オブジェクト指向分析設計での共通範囲 • UML/UP • 本講座で使⽤するUMLプロファイル • プロファイル:SimpleModeling2021 (SM2021) • オブジェクト指向分析設計の基本からの拡張部を明確化 • アジャイル開発 • Communication • Embrace Change • Travel Light • Scaling • クラウド・アプリケーション • モデル駆動開発 SM2021 Travel Light Embrace Change Cloud Model-Driven Scaling
  • 4. 原理 (Principle) • Agail Software Development [ASD] • SRP (The Single Responsibility Principle) • OCP (The Open-Close Principle) • LSP (The Liskov Substitution Principle) • … • GRASP (General Responsibility Assignment Software Patterns or Principals) • Low Coupling • High Cohesion • … • Writing Effective Use Cases [WEUC] • Scope • …
  • 5. パターン (Pattern) • Design Patterns [DP] • Observer, Strategy, … • Domain Driven Design [DDD] • Ubiquitous Language, Intention- Revealing Interfaces, … • Analysis Patterns [AP] • Party, Quantity, … • Pattern-Oriented Software Architecture [POSA] • Layers, Pipes and Filters, … • Patterns of Enterprise Application Architecture [PEAA] • Unit of Work, Data Transfer Object, … • Enterprise Integration Patterns [EIP] • Message Bus, Aggregator, … • Patterns for Effective Use Cases [PEUC] • CompleteSingleGoal, VerbPhraseName, … • AntiPatterns [AnP] • Stovepipe System, Analysis Paralysis, …
  • 6. 実装諸元 • Scala 3.1.1 • オブジェクト指向&関数型プログラミ ング⾔語 • https://www.scala-lang.org/ • Cats 2.7.0 • 関数型クラスライブラリ • https://typelevel.org/cats/ • Spire 0.18.0-M3 • 数値計算ライブラリ • https://typelevel.org/spire/ • ZIO 2.0.0-RC2 • I/Oモナドライブラリ • https://zio.dev/ • ZStream 2.0.0-RC2 • ZIOのリアクティブ・ストリーム • https://zio.dev/next/datatypes/stream/zst ream/ • Akka Actor 2.6.18 • アクターライブラリ • https://akka.io/ • Akka Stream 2.6.18 • Akka Actorのリアクティブ・スト リーム • https://doc.akka.io/docs/akka/current/str eam/index.html 今回使⽤しないものも含めて、 設計・実装時に使⽤(予定)する 開発環境です
  • 7. 内容 • 関数型プログラミング • 関数型プログラミングの基盤技術 • 関数型プログラミングの具体例 • 「関数」とオブジェクト指向 • モデリングと「関数」
  • 8. 基本モデル • UMLの論理モデル(構造、動的)+αを以下の4種類に分類 • 静的モデル (Static Model) • 動的モデル (Dynamic Model) • 協調モデル (Collaboration Model) • 関数モデル (Functional Model)
  • 16. 「関数」への視点 • 「関数」という技術をオブジェクト指向分析設計/オブジェク ト指向プログラミングの中でどのように位置付けていくのか • 「関数」の新技術の理解 • 「関数」の旧来技術の再評価 • 関数で実現した箇所は開発効率/品質向上が⾒込める • 可能な限り関数化したい • Side-Effect Free Function [DDD] • 来たるべき分散・並列処理時代への備え • 証明プログラミングへの布⽯ Cloud
  • 17. 「関数」の適⽤箇所 • 概念 • 型クラス • 抽象代数 • 圏論 • モデル • ルール • データ・フロー • リアクティブ・ストリーム • 応⽤ • 数理モデルを⽤いた各種応⽤(統計処理、機械学習など)
  • 18.
  • 20. 「コンパイルによる証明」のメリット • 品質向上 • ⼯数削減 • テスト⼯数削減 • 「証明」された機能はテストを省略できる • リファクタリング • リファクタリングのベースとして「コンパイルによる証明」は核⼼的 な重要さを持つ • 並列・分散 • 今後、⼀般化すると考えられる並列・分散でも核⼼的な重要さを持つ ことになると考えられる Travel Light Embrace Change Scaling Cloud
  • 21. 関数型プログラミングの特性 • 副作⽤なし • Side-Effect-Free Functions [DDD] • 参照透過性(Referential transparency) • 同じ⼊⼒に対して必ず同じ値を返す • 置換モデル • 「等価による置換」の繰り返しで式の評価を⾏う • 合成可能性(Composable) • 細粒度のマイクロ・フレームワーク上でアルゴリズムの部品化・再利⽤ • DSL(Domain Specific Language)メタ⾔語 • Declarative Style [DDD]
  • 22. 関数型プログラミングの⻑所短所 • ⻑所 • ⾼品質 • 開発効率 • DSLのメタ⾔語 • 短所 • 動作性能が遅い • メモリを⼤量消費する • 関数プログラミングのハードルが⾼い
  • 23. 並列・分散処理への適⽤ • 代数的性質 • Idempotent (冪等性) • Monoid (モノイド) • CommutativeMonoid (可換モノイド) • 分散処理フレームワーク • Apache Hadoop • MapReduce • Apache Spark • RDD(Resilient Distributed Dataset) • Read-only, transformation (map, filter, join)
  • 25. 代数的データ型 (Algebraic Data Type) • 2つのADT • Abstract Data Type: 抽象データ型 ⇒ オブジェクト指向 • Algebraic Data Type: 代数的データ型 ⇒ 関数型 • 複数の型を組み合わせてつくる複合型 • 直積型 (product type) • 直和型 (sum type) • UML: 複合型のdatatype • Value Object [DDD] • Scalaでの実現 • 不変オブジェクト • 直積 : Tuple, case class • 直和 : Either, enum, sealed trait
  • 26. 型クラス (Type class) • 計算機科学においてアドホッ ク多相をサポートする型シス テムの構成機能(Wikipedia) • 関数型⾔語でクラス&継承的 なものを実現する(Haskell由 来) SM2021 第4回 静的モデル(1)
  • 27. 型クラス • アドホック多相(ad hoc polymorphism) • クラスとの違い • コンパイル時に静的に解決される • 対象のクラスに後付で型クラスを設定することができる • 使い所 • 外部ライブラリのクラスをポリモーフィズム対象にできる • クラス間の依存性の低減(疎結合) • 多重継承問題の回避 • 関数の各種性質を再利⽤可能な形でモデル化 第4回 静的モデル(1)
  • 28. 主要型クラス/抽象代数 • Semigroup • 群論の半群 • Monoid • 群論のモノイド • Group • 群論の群
  • 29.
  • 30. Semigroup (半群) • 群論の半群 • 定義(Wikipedia) • 集合 S とその上の⼆項演算 • : S × S → S が与えられたとき、組 (S, • ) が以下の条件を満たすならば、これを半群という。 • 結合律S の各元 a, b, c に対して、等式 (a • b) • c = a • (b • c) が満たされる。 • ⼆項演算(加法) • 結合法則: (a + b) + c = a + (b + c) • 例1: (1 + 2) + 3 = 1 + (2 + 3) • 例2: (1 * 2) * 3 = 1 * (2 * 3) • 例3: (“a” + “b”) + “c” = “a” + (“b” + “c”)
  • 31. Monoid (モノイド) • 半群に単位元の条件を追加したもの • 定義(Wikipedia改) • 集合 S とその上の⼆項演算 •: S × S → S が与えられ、以下の条件を 満たすならば、組 (S, •, e) をモノイドという。 • 結合律S の任意の元 a, b, c に対して、(a • b) • c = a • (b • c). • 単位元の存在S の元 e が存在して、S の任意の元 a に対して e • a = a • e = a. • 単位元: a + e = e + a = e (e: 単位元) • 例1: 2 + 0 = 0 + 2 = 2 • 例2: 2 × 1 = 1 × 2 = 2 • 例2: “a” + “” = “” + “a” = “a”
  • 32. Group (群) • モノイドに逆元の条件を追加したもの • 定義(Wikipedia) • 集合 G とその上の⼆項演算 μ: G × G → G の組 (G, μ) が群であるとは、以下の3つの条件を満た すことをいう: • (結合法則)任意の G の元 g, h, k に対して、μ(g, μ(h, k)) = μ(μ(g, h), k) を満たす: • (∀g, h, k ∈ G)[μ(g, μ(h, k)) = μ(μ(g, h), k)]. • (単位元の存在)μ(g, e) = μ(e, g) = g を G のどんな元 g に対しても満たすような G の元 e が存在する: • (∃e ∈ G)(∀g ∈ G)[μ(g, e) = μ(e, g) = g]. • このような e は存在すれば⼀意であり、G の単位元という。 • (逆元の存在)G のどんな元 g に対しても、μ(g, x) = μ(x, g) = e となるような G の元 x が存在する: • (∀g ∈ G)(∃x ∈ G)[μ(g, x) = μ(x, g) = e]. • このような x は存在すれば⼀意であり、この x を g の G における逆元といい、しばしば g−1, あるいは演算を加法的 に書く場合には −g で表される。 • 逆元: a + (-a) = (-a) + a = e (e: 単位元) • 例1: 2 + (-2) = (-2) + 2 = 0 • 例2: 2 × ! " = ! " * 2 = 1 • 例3: “a” + ??? = ??? + “a” = “”
  • 33. Catsの定義 • Semigroup • combine(x: A, y: A): A [⼆項演算] • 法則 : SemigroupLawsで定義 • Monoid • empty: A [単位元] • 法則 : MonoidLawsで定義 • Group • inverse(a: A): A [逆元] • 法則 : GroupLawsで定義
  • 34. 主要型クラス/マイクロ・フレームワーク • Functor • 圏論の関⼿ • Applicative • 圏論のアプリカティブ関⼿ • Monad • 圏論のモナド • Traverse • ⾛査可能なコンテナ • Foldable • 畳み込み可能なコンテナ Functor, Applicative, Monadは圏論由来ですが、 実務的な観点からマイクロ・フレームワークとして 理解・活⽤していくのが本講座の⽅針です。
  • 35.
  • 36. Functor • 圏論の関⼿由来 • Catsの定義 • mapコンビネータ : Functor上の要素の写像 • 規則 • Scala⾔語オリジナルではコンベンションでサポート • mapコンビネータ • for comprehension(シンタックス・シュガー) def covariantIdentity[A](fa: F[A]): IsEq[F[A]] = fa.map(identity) <-> fa def covariantComposition[A, B, C](fa: F[A], f: A => B, g: B => C): IsEq[F[C]] = fa.map(f).map(g) <-> fa.map(f.andThen(g)) など
  • 37. Applicative • 圏論のアプリカティブ関⼿由来 • Catsの定義 • apコンビネータ: Applicative上の関数をApplicative上の要素に適⽤ • pureコンビネータ : 要素をApplicative上に持ち上げる • 規則 • Scala⾔語オリジナルでは直接サポートなし def applicativeIdentity[A](fa: F[A]): IsEq[F[A]] = F.pure((a: A) => a).ap(fa) <-> fa def applicativeHomomorphism[A, B](a: A, f: A => B): IsEq[F[B]] = F.pure(f).ap(F.pure(a)) <-> F.pure(f(a)) def applicativeInterchange[A, B](a: A, ff: F[A => B]): IsEq[F[B]] = ff.ap(F.pure(a)) <-> F.pure((f: A => B) => f(a)).ap(ff) def applicativeMap[A, B](fa: F[A], f: A => B): IsEq[F[B]] = fa.map(f) <-> F.pure(f).ap(fa) など
  • 38. Monad • 圏論のモナド由来 • Catsの定義 • flatMapコンビネータ : Kleisli関数(A => F[B])による写像 • 規則 • Scala⾔語オリジナルではコンベンションでサポート • flatMapコンビネータ • for comprehension(シンタックス・シュガー) def monadLeftIdentity[A, B](a: A, f: A => F[B]): IsEq[F[B]] = F.pure(a).flatMap(f) <-> f(a) def monadRightIdentity[A](fa: F[A]): IsEq[F[A]] = fa.flatMap(F.pure) <-> fa def mapFlatMapCoherence[A, B](fa: F[A], f: A => B): IsEq[F[B]] = fa.flatMap(a => F.pure(f(a))) <-> fa.map(f)
  • 39. Foldable • 畳み込み演算を⾏うコンテナ • 通常の畳み込み演算に加えてMonoid, Applicative, Monadに 対する畳込み演算を提供 • foldMapコンビネータ: Monoidの要素列を畳み込む
  • 40. Traverse • ⾛査演算を⾏うコンテナ • Foldableを継承 • 通常の⾛査演算に加えてApplicative, Monadに対する⾛査演 算を提供 • traverseコンビネータ: List[Option[Int]] ⇒ Option[List[Int]] • モナドの⼊れ⼦を扱う場合は必須
  • 43. case class Counter(c: Int) extends AnyVal: def +(rhs: Counter): Counter = Counter(c + rhs.c) object Counter: val empty = Counter(0) implicit object CounterEq extends Eq[Counter]: def eqv(x: Counter, y: Counter) = x == y implicit object CounterMonoid extends Monoid[Counter]: def empty: Counter = Counter.empty def combine(x: Counter, y: Counter): Counter = x + y Counterの定義 CounterのMonoid型クラスの定義 emptyメソッド(単位元) を定義 Semigroup由来のcombineメソッド(結合法則を満たした⼆項演算)を定義
  • 44. def legacyprocedual(ps: List[Int]): Counter = var r = Counter.empty for (i <- 0 until ps.length) r = r + Counter(ps(i)) r def procedual(ps: List[Int]): Counter = var r = Counter.empty for (x <- ps) r = r + Counter(x) r ⼿続き型での利⽤ 伝統的⼿続き モダン⽂法(Scala)での⼿続き
  • 45. def functional(ps: List[Int]): Counter = @annotation.tailrec def go(ls: List[Int], c: Counter): Counter = ls match case Nil => c case x :: xs => go(xs, c + Counter(x)) go(ps, Counter.empty) def morefunctional(ps: List[Int]): Counter = ps.foldLeft(Counter.empty)((z, x) => z + Counter(x)) def algebraic(ps: List[Int]): Counter = ps.foldMap(Counter.apply) 関数型での利⽤ 関数型基本(再帰呼び出し) 代数的抽象(MonoidとFoldable)による実現 関数型畳み込み
  • 46. class CounterPropertySpec extends AnyWordSpec with should.Matchers with ScalaCheckDrivenPropertyChecks: "Counter" should { val nonNegativeInts = Gen.listOf(Gen.choose(0, 10000)) "Property-Based TestingでCounterのfoldMap動作をテストする" in forAll(nonNegativeInts) { (xs: List[Int]) => val c: Counter = xs.foldMap(Counter.apply) c.c should be(xs.sum) } } Property-basedテスティングによるテスト テストデータの特性を定義 Property−basedテスティングの実⾏ BDD (Behavior-Driven Development)スタイルのテスト Travel Light 第16回 テスト
  • 47. class CounterLawSpec extends AnyFunSuite with FunSuiteDiscipline with Configuration: lazy val counterGen: Gen[Counter] = Gen.choose(0, 10000).map(Counter.apply) implicit lazy val counterArbitrary: Arbitrary[Counter] = Arbitrary(counterGen) checkAll("Counter", MonoidTests[Counter].monoid) Monoid法則のテスト Monoid法則のテストを⼀括して⾏う 型クラスの規則のテスト⽤トレイト
  • 48. sbt:Scala 3 Cats> test [info] compiling 1 Scala source to /Users/asami/src/workspace2021/scala3cats/target/scala-3.1.0/classes ... [info] done compiling [info] CounterLawSpec: [info] - Counter.monoid.associative [info] - Counter.monoid.collect0 [info] - Counter.monoid.combine all [info] - Counter.monoid.combineAllOption [info] - Counter.monoid.intercalateCombineAllOption [info] - Counter.monoid.intercalateIntercalates [info] - Counter.monoid.intercalateRepeat1 [info] - Counter.monoid.intercalateRepeat2 [info] - Counter.monoid.is id [info] - Counter.monoid.left identity [info] - Counter.monoid.repeat0 [info] - Counter.monoid.repeat1 [info] - Counter.monoid.repeat2 [info] - Counter.monoid.reverseCombineAllOption [info] - Counter.monoid.reverseRepeat1 [info] - Counter.monoid.reverseRepeat2 [info] - Counter.monoid.reverseReverses [info] - Counter.monoid.right identity [info] CounterPropertySpec: [info] Counter [info] - should Property-Based TestingでCounterのfoldMap動作をテストする [info] ScalaTest [info] Run completed in 443 milliseconds. [info] Total number of tests run: 19 [info] Suites: completed 2, aborted 0 [info] Tests: succeeded 19, failed 0, canceled 0, ignored 0, pending 0 [info] All tests passed. [info] Passed: Total 20, Failed 0, Errors 0, Passed 20 [success] Total time: 1 s, completed 2021/11/07 5:54:50 CounterLawSpecによるMonoid法則テスト CounterPropertySpecによるBDDテスト
  • 55. Scala: for comprehension • モナディック・パイプラインのためのシンタクスシュガー def func(a: Int): Int = val r: Option[Int] = for { b <- f(a) c <- g(b) d = h(c) e <- i(d) } yield e r.get def f(x: Int): Option[Int] = ??? def g(x: Int): Option[Int] = ??? def h(x: Int): Int = ??? def i(x: Int): Option[Int] = ??? flatMapコンビネータ mapコンビネータ
  • 56. リアクティブ・ストリーム • The Reactive Manifesto • Reactive Streams • ⾮同期ストリーム処理、バック プレッシャー、ノンブロッキン グ • Akka Streams • Reactive Stream & 関数 • FS2(Functional Stream for Scala) • Scalaz-stream • ZStream Cloud 第6回 動的モデル
  • 60. ルール • アプリケーションで使⽤する各種ルールをモデル化 • ビジネス・モデリング、ドメイン・モデルとアプリケーションの連 続性 • ビジネス・サイドのステークホルダーと共有 • 変化点(variation point)/拡張点(extension point)の実現 • ルールの種類 • ビジネス・ルール • ドメイン・ルール • アプリケーション・ルール • 実現⽅法 • 単純な関数、表からルール・エンジンまで
  • 61. DFD (Data Flow Diagram) • 構造化⼿法の記法 • データの流れを記述 • 概念レベル • システムの全体像をデータの観点から 記述 • 詳細レベル • バッチの設計情報 • UMLではアクティビティ図(オブジェ クト・フロー)が対応 • OMTの第1版ではFunctionalモデルに ⼊っていたが第2版では削除された • 関数的なアプローチとして再評価して もよいかも 第6回 動的モデル
  • 62. リアクティブ・ストリーム (Reactive Streams) • ストリーミング処理をモデル化 • データのクラスタリングが可能 • 移⼊・移出などの⼤規模データ操作にも適している • Akka-Streams, Zstreamなどリアクティブ・ストリームのフ レームワークを使って実装まで連続性がある • Enterprise Integration Patterns [EIP]
  • 63. まとめ • 主要型クラス • 抽象代数 • Semigroup, Monoid, Group • マイクロ・フレームワーク • Functor, Applicative, Monad, Foldable, Traverse • モナディック・パイプライン • 関数モデル • ルール • データフロー • リアクティブ・ストリーム
  • 64. 参考⽂献 • The Unified Modeling Language Reference Manual, 2nd (Rumbaugh他, 2004) • The Unified Modeling Language User Guide, 2nd (Booch他, 2004) • The Unified Software Development Process (Jacobson他, 1999) • UML 2 and the Unified Process: Practical Object-Oriented Analysis and Design (Arlow他, 2005) • OMG Unified Modeling Language Version 2.5 (OMG, 2015) • Agile Software Development : Principles, Patterns, and Practices (Martin他, 2003) • Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development, 3rd (Larman, 2005) • Writing Effective Use Cases (Cockburn, 2000) • 上流⼯程UMLモデリング (浅海, 2008) • Design Patterns : Elements of Reusable Object-Oriented Software (Gamma他, 1995) • Domain-Driven Design: Tracking Complexity in the Heart of Software (Evans, 2003) • Analysis Patterns: Reusable Object Models (Fowler, 1996) • Pattern-Oriented Software Arhitecture: A System of Patterns (Buschamnn他, 1996) • Patterns of Enterprise Application Architecture (Fowler他, 2002) • Enterprise Integration Patterns : Designing, Building, and Deploying Messaging Solutions (Hohpe他, 2004) • Patterns for Effective Use Cases (Adolph他, 2003) • AntiPatterns : Refactoring Software, Architectures, and Projects in Crisis (Brown他, 2008) • Functional and Reactive Domain Modeling (Ghosh, 2016) • Functional Programming in Scala (Chiusano他, 2014) • Scala Design Patterns: Design modular, clean, and scalable applications by applying proven design patterns in Scala (Nikolov, 2018)