44
リアクティブプログラミングと MVVMパターンについて 2014/10/31 @taketin

リアクティブプログラミングとMVVMパターンについて

Embed Size (px)

DESCRIPTION

2014/10/31 LINE Fukuoka tech MTG

Citation preview

Page 1: リアクティブプログラミングとMVVMパターンについて

リアクティブプログラミングとMVVMパターンについて

2014/10/31 @taketin

Page 2: リアクティブプログラミングとMVVMパターンについて

免責事項

「リアクティブプログラミング」に興味を持って軽い気持ちで調べ始めましたが、想像以上に奥が深い概念であった為、理解不十分なところがあります。そのため、嘘を言ってる可能性もあります。

また、今回は概念の説明になりますのでふんわりしたお話になります。

あらかじめご了承ください。

Page 3: リアクティブプログラミングとMVVMパターンについて

FRP (FunctionalReactiveProgramming)

Page 4: リアクティブプログラミングとMVVMパターンについて

FRP (Functional Reactive Programming)

・最近よく聞く

Page 5: リアクティブプログラミングとMVVMパターンについて

FRP (Functional Reactive Programming)

・最近よく聞く

・フロントエンド開発者は特に知っといた方が良さそう

Page 6: リアクティブプログラミングとMVVMパターンについて

FRP とは・リアルタイムイベントを適切に扱うためのプログラミングパラダイム

Page 7: リアクティブプログラミングとMVVMパターンについて

FRP とは・リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

Page 8: リアクティブプログラミングとMVVMパターンについて

FRP とは・リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

・リアクティブプログラミング http://www.reactivemanifesto.org/ に関数

型言語の特徴を加えたものが FRP。1997年に  Functional Reactive Animation http://conal.net/papers/icfp97/ として提唱されたらしい。

Page 9: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

Page 10: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界発生するイベントに対して実行する命令を書く。

Page 11: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界発生するイベントに対して実行する命令を書く。

・FRP の世界入力と出力の関係性を定義する。

Page 12: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界

var a = 1;

var b = a + 1;

a = 10;

console.log(b) // => 2

Page 13: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界

var a = 1;

var b = a + 1;

a = 10;

console.log(b) // => 2

・FRPの世界

var a = 1;

var b = a + 1;

a = 10;

console.log(b) // => 11

Page 14: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界

var a = 1;

var b = a + 1;

a = 10;

console.log(b) // => 2

・FRPの世界

var a = 1;

var b = a + 1;

a = 10;

console.log(b) // => 11

FRPは「時間とともに変化する値」を扱う。b = a + 1 の「関係性」を保持する。

Page 15: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界

var a = 1;

var b = a + 1;

a = 10;

console.log(b) // => 2

・FRPの世界

var a = 1;

var b = a + 1;

a = 10;

console.log(b) // => 11

FRPは「時間とともに変化する値」を扱う。b = a + 1 の「関係性」を保持する。

Excel で A1セルに =B2+C3と書くと、A1セルの内容はB2とC3が加算されて、動

的に書き換えられるような動きのイメージ。

Page 16: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界

$("#select").change(function(val){ console.log(val.currentTarget.value);});

// selectbox で値が “foo” を選択した

> foo

// selectbox で値が “bar” を選択した

> bar

・FRPの世界

var select = $("#select").asEventStream("change");select.onValue(function(val) { console.log(val.currentTarget.value)});

// selectbox で値が “foo” をチェックした

> foo

// selectbox で値が “bar” をチェックした

> bar

Page 17: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界

$("#select").change(function(val){ console.log(val.currentTarget.value);});

・FRPの世界

var select = $("#select").asEventStream("change");select.onValue(function(val) { console.log(val.currentTarget.value)});

これまでは入力が変化したという出来事(イベント)に対応する処理をプログラムで記述していた。これに対して、リアクティブ・プログラミングでは、入力と出力の関係性を定義しておけば自動的に処理が行われる。

Page 18: リアクティブプログラミングとMVVMパターンについて

リアルタイムイベントを適切に扱うためのプログラミングパラダイム

・非FRPの世界

$("#select").change(function(val){ console.log(val.currentTarget.value);});

・FRPの世界

var select = $("#select").asEventStream("change");select.onValue(function(val) { console.log(val.currentTarget.value)});

これまでは入力が変化したという出来事(イベント)に対応する処理をプログラムで記述していた。これに対して、リアクティブ・プログラミングでは、入力と出力の関係性を定義しておけば自動的に処理が行われる。

イベント駆動の命令型 定義宣言型

Page 19: リアクティブプログラミングとMVVMパターンについて

非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

Page 20: リアクティブプログラミングとMVVMパターンについて

非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

・定義を宣言する対象 == 時間とともに変化する値

Page 21: リアクティブプログラミングとMVVMパターンについて

非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

・定義を宣言する対象 == 時間とともに変化する値

ex) textField : 文字の入力と共に内容が変わる

button : クリックして on, off が変わる

Page 22: リアクティブプログラミングとMVVMパターンについて

非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

・定義を宣言する対象 == 時間とともに変化する値

ex) textField : 文字の入力と共に内容が変わる

button : クリックして on, off が変わる

FRP では、これらの「時間とともに変化する値」を

「ストリーム」と呼ばれる第1級オブジェクトとして扱えるようにする事で、定義宣言型のプログラミングを行える様にした。

Page 23: リアクティブプログラミングとMVVMパターンについて

非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

・振る舞い

Page 24: リアクティブプログラミングとMVVMパターンについて

非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

・振る舞い

ex) 入力値 : 1, 2, 3, 4 振る舞い : 入力された値を倍にする -> 2, 4, 6, 8 振る舞い : 4 の倍数だけ返す -> 4, 8

Page 25: リアクティブプログラミングとMVVMパターンについて

非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

・振る舞い

ex) 入力値 : 1, 2, 3, 4 振る舞い : 入力された値を倍にする -> 2, 4, 6, 8 振る舞い : 4 の倍数だけ返す -> 4, 8

この振る舞い1つ1つがストリームとして扱える。

Page 26: リアクティブプログラミングとMVVMパターンについて

非同期データストリームを用いるプログラミングであり、「時間とともに変化する値」と「振る舞い」同士の関係性を記述する

・振る舞い

ex) 入力値 : 1, 2, 3, 4 振る舞い : 入力された値を2倍にする -> 2, 4, 6, 8 ∟ 振る舞い : 4 の倍数だけ返す -> 4, 8 ∟ 振る舞い:5 以上だけ返す -> 6, 8

この振る舞い1つ1つがストリームとして扱える。

ストリームをベースに振る舞いを重ねていく事ができる。

Page 27: リアクティブプログラミングとMVVMパターンについて

Reactive programmingとは...

・時間や外部入力と共に変化する値や計算を、命令的に記述す

るのではなく、宣言的に定義する。

Page 28: リアクティブプログラミングとMVVMパターンについて

Reactive programmingとは...

・時間や外部入力と共に変化する値や計算を、命令的に記述す

るのではなく、宣言的に定義する。

・入力と出力の関係性を定義しておけば自動的に更新処理が

行われる為、データバインディング機構の実装に適している。

Page 29: リアクティブプログラミングとMVVMパターンについて

Reactive programmingとは...

・時間や外部入力と共に変化する値や計算を、命令的に記述す

るのではなく、宣言的に定義する。

・入力と出力の関係性を定義しておけば自動的に更新処理が

行われる為、データバインディング機構の実装に適している。

・MVVM パターンの実装に使われている。

Page 30: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)

Page 31: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)

・2005年、Microsoft の WPF や Silverlight 発祥 のアーキテクチャ via: http://ja.wikipedia.org/wiki/Model_View_ViewModel

・主に GUI アプリケーションで採用。

Page 32: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)

・2005年、Microsoft の WPF や Silverlight 発祥 のアーキテクチャ via: http://ja.wikipedia.org/wiki/Model_View_ViewModel

・主に GUI アプリケーションで採用。

・ViewはViewModelに依存し、ViewModelはModelに依存。逆方向の依存は無い。

image: http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_02/greatblogentry_02_01.html

Page 33: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)・Model - ドメイン(問題領域)

・View - UIへの出力とUIからの入力

・ViewModel - ViewとModelの間の情報の伝達(Viewから受け取った入力を適

切な形に変換して渡す)と、Viewのための状態保持のみを役割とする要素。Viewとの

通信はデータバインディング機構のような仕組みを通じて行うのが前提。

Page 34: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)ViewとViewModelの間の情報を開発者が手動で同期しなければならないようなプ

ラットフォームでは非常に開発者の負担が大きくなり、メリットが発揮しにくい。

そのためデータバインディング機構のような仕組みを持つプラットフォームか、既存の

プラットフォームにデータバインディング機構のような仕組みを拡張したプラットフォー

ムで採用されている。

Page 35: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)

必要なもの

・宣言的な Viewテンプレート

・データバインディング機構

Page 36: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)

ReactiveCocoa (Objective-C)

・FRPパラダイムを採用した言語内DSL。・GitHub社の人達をメインに開発。GitHubのMacアプリで採用されている。

・変更をシグナルと呼ばれるオブジェクトで表現し、別途用意する VM にプレゼンテーションロジックを書く事で、ViewController から View とロジックを分離する。

 ※ ViewController は MVC の C では無い。MVVM の V 相当。

Page 37: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)

ReactiveCocoa (Objective-C)

メリット

・テストの記述が容易になり、コードの再利用性が高まる。

Page 38: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)

ReactiveCocoa (Objective-C)

メリット

・テストの記述が容易になり、コードの再利用性が高まる。

デメリット

・記述量が増える。

・DSL と FRP の学習コスト。

Page 39: リアクティブプログラミングとMVVMパターンについて

MVVM (Model View ViewModel)

ReactiveCocoa (Objective-C)

次期メジャーバージョン 3系で Swift 対応。

Swift 用ライブラリは他に https://github.com/ReactKit/ReactKit がある。

とりあえず試してみたい。

Page 40: リアクティブプログラミングとMVVMパターンについて

FRPについて調べてみた感想

・実装によって言葉の定義が曖昧な気がするので、大変混乱した。

ストリーム

シグナル

Page 41: リアクティブプログラミングとMVVMパターンについて

FRPについて調べてみた感想

・実装によって言葉の定義が曖昧な気がするので、大変混乱した。

ストリーム

シグナル

・関数型言語への関心が深まった。

参照透過性(関数の呼び出しをそのまま値に置き換えても全く同じ動作をする。関数に副作用が無い状態)

Page 42: リアクティブプログラミングとMVVMパターンについて

FRPについて調べてみた感想

・実装によって言葉の定義が曖昧な気がするので、大変混乱した。

ストリーム

シグナル

・関数型言語への関心が深まった。

参照透過性(関数の呼び出しをそのまま値に置き換えても全く同じ動作をする。関数に副作用が無い状態)

・実際にアプリケーション書きながらじゃないと理解が進まなそう。

Page 43: リアクティブプログラミングとMVVMパターンについて

LibraryFRP: Javascript・https://github.com/Reactive-Extensions/RxJS ・https://github.com/baconjs/bacon.js・https://github.com/facebook/reactMVVM: Javascript・https://github.com/knockout/knockout・https://github.com/jashkenas/backbone・https://github.com/angular/angular.js・https://github.com/ractivejs/ractive・https://github.com/yyx990803/vue

Page 44: リアクティブプログラミングとMVVMパターンについて

参考リンク・【翻訳】あなたが求めていたリアクティブプログラミング入門

http://ninjinkun.hatenablog.com/entry/introrxja・なぜリアクティブプログラミングは重要か。

http://d.hatena.ne.jp/pokarim/20101226・ストリーム表現とその変換

http://r7kamura.hatenablog.com/entry/2014/08/21/113654・FRPの話

http://maoe.hatenadiary.jp/entry/2012/12/24/011414・Webフロントエンドでリアクティブプログラミング

http://www.ediplex.com/blog/?p=830・ゆるやかな ReactiveCocoa の導入

https://speakerdeck.com/ninjinkun/yuruyakanareactivecocoafalsedao-ru・MVVM for iOS

https://speakerdeck.com/laiso/mvvm-for-ios・ReactiveCocoaでiOSでもMVVM

http://ios.caph.jp/articles/mvvm-using-reactivecocoa・AngularJSで始めるリアクティブプログラミング

http://zoetrope.hatenablog.jp/entry/2014/02/15/175040・Bacon.jsで眺めるFunctional reactive programming

http://gan.hatenablog.jp/entry/2013/11/10/152720