SlideShare a Scribd company logo
1 of 16
非関数型プログラマにおくる
データフロー図のすゝめ
真鍋俊之
まとめ
• 副作用のあるプログラムは複雑になりやすい
• 副作用が少ないプログラムは、
▫ モジュール性が高まる
▫ テストが簡単になる
▫ 並列化しやすくなる
• データフロー図を用いた設計を行うことで、副
作用の少ないプログラムができる、かも
関数型プログラミング
• 副作用をできるだけ用いない
プログラミングスタイル
• 副作用とは、
▫ 「式の値を計算して求める(評価)」以外の動作
引用:Qiita「関数型言語」に関するFAQ形式の一般的説明
http://qiita.com/esumii/items/ec589d138e72e22ea97e
副作用のない関数例
• int add ( int a, int b ) {
return a + b;
}
副作用のある関数例
• int add ( int a, int b ) {
printf ( “%d”, a );
return a + b;
}
• 「 printf ( “%d”, a ); 」の行で
画面に出力している。
▫ 「画面に表示する」という副作用を含んでいる。
副作用がないことで何が嬉しい?
• 関数の出力が入力にのみに依存する
(=文脈によって、結果が変わらない)
▫ 関数の独立性が高い
▫ テスト、検証が容易
▫ 人が理解しやすい
オブジェクト指向と
関数型プログラミング
• 「オブジェクト指向は副作用の分割統治を、
関数型プログラミングは副作用の排除を
行うことで、モジュール性を高めようとしたと
考えられます。」
引用:なぜリアクティブプログラミングは重要か。
http://d.hatena.ne.jp/pokarim/20101226
関数型プログラミングは難しい?
• 難しい話が多い
▫ 再帰関数
▫ 高階関数
▫ 参照透明性
▫ 遅延評価
▫ モナド
▫ 型推論
なぜ、データフロー図を使うのか
• 設計なので、関数型(プログラミング)言語を使
わない人でも利用可能
• 副作用のない関数を考える目的でも使える
処理データ データ
データフロー図の書き方
• データと処理を矢印でつなげる。
• 「データ⇒処理」はデータが処理の入力である
ことを示す
• 「処理⇒データ」はデータが処理の出力である
ことを示す
• 処理は副作用がないように、必要なデータはで
きる限り書く
処理
入力 出力
データ データ
データフロー図の何が嬉しいのか
• どの順序でデータを作ればよいか(≒処理順序)
が分かりやすくなる
• 並列に実行できるところが分かる
処理
処理
データ
データ
データ
データ
処理 データ並列に実行可能
実例:ライフゲーム(1/2)
• 碁盤のような格子があり、一つの格子はセル(細胞)と
呼ばれる。
• 各セルには8つの近傍のセルがある (ムーア近傍)
• 各セルには「生」と「死」の2つの状態があり、あるセ
ルの次のステップ(世代)の状態は周囲の8つのセルの
今の世代における状態により決定される。
実例:ライフゲーム(2/2)
• セルの生死は次のルールに従う。
• 誕生
▫ 死んでいるセルに隣接する生きたセルがちょうど3つあれば、次
の世代が誕生する。
• 生存
▫ 生きているセルに隣接する生きたセルが2つか3つならば、次の
世代でも生存する。
• 過疎
▫ 生きているセルに隣接する生きたセルが1つ以下ならば、過疎に
より死滅する。
• 過密
▫ 生きているセルに隣接する生きたセルが4つ以上ならば、過密に
より死滅する。
実例:ライフゲーム(2/2)
• セルの生死は次のルールに従う。
• 誕生
▫ 死んでいるセルに隣接する生きたセルがちょうど3つあれば、次
の世代が誕生する。
• 生存
▫ 生きているセルに隣接する生きたセルが2つか3つならば、次の
世代でも生存する。
• 過疎
▫ 生きているセルに隣接する生きたセルが1つ以下ならば、過疎に
より死滅する。
• 過密
▫ 生きているセルに隣接する生きたセルが4つ以上ならば、過密に
より死滅する。
今のセルの状態と、
隣接する生きたセルの数で
次の世代の状態が決まる
世界 次の世代の
世界
座標
セルの生死
隣接する生きている
セルの数
次の世代の
セルの生死
ルール
まとめる
隣接セル
見る
セルの
座標取得
セルの生死
を見る
まとめ
• 副作用のあるプログラムは複雑になりやすい
• 副作用が少ないプログラムは、
▫ モジュール性が高まる
▫ テストが簡単になる
▫ 並列化しやすくなる
• データフロー図を用いた設計を行うことで、副
作用の少ないプログラムができる、かも

More Related Content

Viewers also liked

詳細設計とアプリケーション開発工程
詳細設計とアプリケーション開発工程詳細設計とアプリケーション開発工程
詳細設計とアプリケーション開発工程康 新谷
 
シーケンス図とアクティビティ図と状態遷移図
シーケンス図とアクティビティ図と状態遷移図シーケンス図とアクティビティ図と状態遷移図
シーケンス図とアクティビティ図と状態遷移図akipii Oga
 
ビジネスモデルをシステムにつなげる
ビジネスモデルをシステムにつなげるビジネスモデルをシステムにつなげる
ビジネスモデルをシステムにつなげるZenji Kanzaki
 
ソフトウェア設計のすすめ
ソフトウェア設計のすすめソフトウェア設計のすすめ
ソフトウェア設計のすすめYoshimura Soichiro
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで増田 亨
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?増田 亨
 

Viewers also liked (7)

詳細設計とアプリケーション開発工程
詳細設計とアプリケーション開発工程詳細設計とアプリケーション開発工程
詳細設計とアプリケーション開発工程
 
シーケンス図とアクティビティ図と状態遷移図
シーケンス図とアクティビティ図と状態遷移図シーケンス図とアクティビティ図と状態遷移図
シーケンス図とアクティビティ図と状態遷移図
 
ビジネスモデルをシステムにつなげる
ビジネスモデルをシステムにつなげるビジネスモデルをシステムにつなげる
ビジネスモデルをシステムにつなげる
 
ソフトウェア設計のすすめ
ソフトウェア設計のすすめソフトウェア設計のすすめ
ソフトウェア設計のすすめ
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 

Similar to 20150131 mvp com_camp_lt

【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上Tatsuya Ishikawa
 
Gui自動テストツール基本
Gui自動テストツール基本Gui自動テストツール基本
Gui自動テストツール基本Tsuyoshi Yumoto
 
How to Develop Experiment-Oriented Programs
How to Develop Experiment-Oriented ProgramsHow to Develop Experiment-Oriented Programs
How to Develop Experiment-Oriented ProgramsKenta Oono
 
TDDはじめる前に
TDDはじめる前にTDDはじめる前に
TDDはじめる前にYasui Tsutomu
 
19-B-4 開発品質向上のための、ASQ/ALMソリューション
19-B-4 開発品質向上のための、ASQ/ALMソリューション19-B-4 開発品質向上のための、ASQ/ALMソリューション
19-B-4 開発品質向上のための、ASQ/ALMソリューションDevelopers Summit
 
単体テストをやってみた~既存サービスに単体テストを追加するチャレンジ~
単体テストをやってみた~既存サービスに単体テストを追加するチャレンジ~単体テストをやってみた~既存サービスに単体テストを追加するチャレンジ~
単体テストをやってみた~既存サービスに単体テストを追加するチャレンジ~ceres-inc
 
テスト駆動&オブジェクト指向ハンズオン
テスト駆動&オブジェクト指向ハンズオンテスト駆動&オブジェクト指向ハンズオン
テスト駆動&オブジェクト指向ハンズオンyuichi_kuwahara
 
テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門Satoshi Watanabe
 
開発ビギナーだけじゃない!インフラエンジニア & マネージャー にも知ってほしいテスト自動化と品質管理
開発ビギナーだけじゃない!インフラエンジニア & マネージャー にも知ってほしいテスト自動化と品質管理開発ビギナーだけじゃない!インフラエンジニア & マネージャー にも知ってほしいテスト自動化と品質管理
開発ビギナーだけじゃない!インフラエンジニア & マネージャー にも知ってほしいテスト自動化と品質管理慎一 古賀
 
開発品質向上のための、ASQ/ALMソリューション ~品質向上策・活用していないのは何故ですか?~
開発品質向上のための、ASQ/ALMソリューション ~品質向上策・活用していないのは何故ですか?~開発品質向上のための、ASQ/ALMソリューション ~品質向上策・活用していないのは何故ですか?~
開発品質向上のための、ASQ/ALMソリューション ~品質向上策・活用していないのは何故ですか?~mafujiwara
 
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) kunihikokaneko1
 
Istqb : Test automation Engineer
Istqb : Test automation EngineerIstqb : Test automation Engineer
Istqb : Test automation EngineerSadaaki Emura
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱Koichi ITO
 
【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSST
【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSST【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSST
【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSSTKotaro Ogino
 
退屈なブラウザ作業をpuppeteerにやらせたいお話
退屈なブラウザ作業をpuppeteerにやらせたいお話退屈なブラウザ作業をpuppeteerにやらせたいお話
退屈なブラウザ作業をpuppeteerにやらせたいお話Tadashi Nemoto
 
F#で学ぶ関数プログラミング入門?
F#で学ぶ関数プログラミング入門?F#で学ぶ関数プログラミング入門?
F#で学ぶ関数プログラミング入門?pocketberserker
 

Similar to 20150131 mvp com_camp_lt (20)

【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
 
Gui自動テストツール基本
Gui自動テストツール基本Gui自動テストツール基本
Gui自動テストツール基本
 
How to Develop Experiment-Oriented Programs
How to Develop Experiment-Oriented ProgramsHow to Develop Experiment-Oriented Programs
How to Develop Experiment-Oriented Programs
 
TDDはじめる前に
TDDはじめる前にTDDはじめる前に
TDDはじめる前に
 
19-B-4 開発品質向上のための、ASQ/ALMソリューション
19-B-4 開発品質向上のための、ASQ/ALMソリューション19-B-4 開発品質向上のための、ASQ/ALMソリューション
19-B-4 開発品質向上のための、ASQ/ALMソリューション
 
単体テストをやってみた~既存サービスに単体テストを追加するチャレンジ~
単体テストをやってみた~既存サービスに単体テストを追加するチャレンジ~単体テストをやってみた~既存サービスに単体テストを追加するチャレンジ~
単体テストをやってみた~既存サービスに単体テストを追加するチャレンジ~
 
テスト駆動&オブジェクト指向ハンズオン
テスト駆動&オブジェクト指向ハンズオンテスト駆動&オブジェクト指向ハンズオン
テスト駆動&オブジェクト指向ハンズオン
 
テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門
 
開発ビギナーだけじゃない!インフラエンジニア & マネージャー にも知ってほしいテスト自動化と品質管理
開発ビギナーだけじゃない!インフラエンジニア & マネージャー にも知ってほしいテスト自動化と品質管理開発ビギナーだけじゃない!インフラエンジニア & マネージャー にも知ってほしいテスト自動化と品質管理
開発ビギナーだけじゃない!インフラエンジニア & マネージャー にも知ってほしいテスト自動化と品質管理
 
開発品質向上のための、ASQ/ALMソリューション ~品質向上策・活用していないのは何故ですか?~
開発品質向上のための、ASQ/ALMソリューション ~品質向上策・活用していないのは何故ですか?~開発品質向上のための、ASQ/ALMソリューション ~品質向上策・活用していないのは何故ですか?~
開発品質向上のための、ASQ/ALMソリューション ~品質向上策・活用していないのは何故ですか?~
 
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
 
Istqb : Test automation Engineer
Istqb : Test automation EngineerIstqb : Test automation Engineer
Istqb : Test automation Engineer
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSST
【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSST【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSST
【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSST
 
2022-jasst-tohoku.pdf
2022-jasst-tohoku.pdf2022-jasst-tohoku.pdf
2022-jasst-tohoku.pdf
 
退屈なブラウザ作業をpuppeteerにやらせたいお話
退屈なブラウザ作業をpuppeteerにやらせたいお話退屈なブラウザ作業をpuppeteerにやらせたいお話
退屈なブラウザ作業をpuppeteerにやらせたいお話
 
恋するJenkins
恋するJenkins恋するJenkins
恋するJenkins
 
Gamedevenvstudy1
Gamedevenvstudy1Gamedevenvstudy1
Gamedevenvstudy1
 
テスト自動化入門@Graat勉強会
テスト自動化入門@Graat勉強会テスト自動化入門@Graat勉強会
テスト自動化入門@Graat勉強会
 
F#で学ぶ関数プログラミング入門?
F#で学ぶ関数プログラミング入門?F#で学ぶ関数プログラミング入門?
F#で学ぶ関数プログラミング入門?
 

More from Toshiyuki Manabe

20190919 tocfe sendai branch
20190919 tocfe sendai branch20190919 tocfe sendai branch
20190919 tocfe sendai branchToshiyuki Manabe
 
20180623 theory of Entertainment
20180623 theory of Entertainment20180623 theory of Entertainment
20180623 theory of EntertainmentToshiyuki Manabe
 
20180512 recommendation for_anxiety_management
20180512 recommendation for_anxiety_management20180512 recommendation for_anxiety_management
20180512 recommendation for_anxiety_managementToshiyuki Manabe
 
20180321 sapid_fan_meeting
20180321 sapid_fan_meeting20180321 sapid_fan_meeting
20180321 sapid_fan_meetingToshiyuki Manabe
 
聴き手に理解してもらうためのプレゼン資料の作り方
聴き手に理解してもらうためのプレゼン資料の作り方聴き手に理解してもらうためのプレゼン資料の作り方
聴き手に理解してもらうためのプレゼン資料の作り方Toshiyuki Manabe
 
納得してもらえる社内提案を考えよう
納得してもらえる社内提案を考えよう納得してもらえる社内提案を考えよう
納得してもらえる社内提案を考えようToshiyuki Manabe
 
聴き手に満足してもらうための伝える技術
聴き手に満足してもらうための伝える技術聴き手に満足してもらうための伝える技術
聴き手に満足してもらうための伝える技術Toshiyuki Manabe
 
パフォーマー視点から学ぶエンジニア像
パフォーマー視点から学ぶエンジニア像パフォーマー視点から学ぶエンジニア像
パフォーマー視点から学ぶエンジニア像Toshiyuki Manabe
 
20150608 初心者によるazure machinelearning入門
20150608 初心者によるazure machinelearning入門20150608 初心者によるazure machinelearning入門
20150608 初心者によるazure machinelearning入門Toshiyuki Manabe
 

More from Toshiyuki Manabe (17)

20190919 tocfe sendai branch
20190919 tocfe sendai branch20190919 tocfe sendai branch
20190919 tocfe sendai branch
 
20181213_toc_tocfe_sendai
20181213_toc_tocfe_sendai20181213_toc_tocfe_sendai
20181213_toc_tocfe_sendai
 
20180912 toc tocfe_sendai
20180912 toc tocfe_sendai20180912 toc tocfe_sendai
20180912 toc tocfe_sendai
 
20180728 helping
20180728 helping20180728 helping
20180728 helping
 
20180623 theory of Entertainment
20180623 theory of Entertainment20180623 theory of Entertainment
20180623 theory of Entertainment
 
20180512 recommendation for_anxiety_management
20180512 recommendation for_anxiety_management20180512 recommendation for_anxiety_management
20180512 recommendation for_anxiety_management
 
20180328 toc tocfe sendai
20180328 toc tocfe sendai20180328 toc tocfe sendai
20180328 toc tocfe sendai
 
20180321 sapid_fan_meeting
20180321 sapid_fan_meeting20180321 sapid_fan_meeting
20180321 sapid_fan_meeting
 
聴き手に理解してもらうためのプレゼン資料の作り方
聴き手に理解してもらうためのプレゼン資料の作り方聴き手に理解してもらうためのプレゼン資料の作り方
聴き手に理解してもらうためのプレゼン資料の作り方
 
納得してもらえる社内提案を考えよう
納得してもらえる社内提案を考えよう納得してもらえる社内提案を考えよう
納得してもらえる社内提案を考えよう
 
聴き手に満足してもらうための伝える技術
聴き手に満足してもらうための伝える技術聴き手に満足してもらうための伝える技術
聴き手に満足してもらうための伝える技術
 
20160423 test analyze
20160423 test analyze20160423 test analyze
20160423 test analyze
 
パフォーマー視点から学ぶエンジニア像
パフォーマー視点から学ぶエンジニア像パフォーマー視点から学ぶエンジニア像
パフォーマー視点から学ぶエンジニア像
 
20150608 初心者によるazure machinelearning入門
20150608 初心者によるazure machinelearning入門20150608 初心者によるazure machinelearning入門
20150608 初心者によるazure machinelearning入門
 
20150404 jazug fukushima
20150404 jazug fukushima20150404 jazug fukushima
20150404 jazug fukushima
 
20150131 mvp com_camp
20150131 mvp com_camp20150131 mvp com_camp
20150131 mvp com_camp
 
20140920 jazug ml
20140920 jazug ml20140920 jazug ml
20140920 jazug ml
 

20150131 mvp com_camp_lt