reactive cocoaをかじってみた。
DESCRIPTION
iOS_LTTRANSCRIPT
ReactiveCocoaを かじってみた
#iOS_LT !
田村 孝文
ReactiveCocoaって何?• 「リアクティブプログラミング」のObjective-C実装の一つ
• https://github.com/ReactiveCocoa/ReactiveCocoa
• リアクティブプログラミングって何?
• 『 リアクティブプログラミングは、「時間とともに変化する値」=「振る舞い」同士の関係性を記述することでプログラミングを行うパラダイムです。GUIなどのようにインタラクティブなシステムや、シミュレーションやアニメーションのようにダイナミックに状態が変化するようなシステムを宣言的に記述することができますこれらの「変化する状態」や「外部とのやりとり」が支配的なシステムは、純粋関数型言語が、その強みを発揮しにくい部分でもあります。うんたらかんたら~~~ほにゃほにゃ~~~』
・・・うん、なるほど。よく分からん!
「なぜリアクティブプログラミングは重要か。」http://d.hatena.ne.jp/pokarim/20101226 から引用:
というわけで• よく分かってないけどしゃべります。
• 今日話をする順番
• パラダイムとしての「リアクティブプログラミング」の話(超ざっくり)
• ライブラリとしての「ReactiveCocoa」を実際に使ってみた話
• Target/Action方式とReactiveCocoa方式を見比べる
• ReactiveCocoaでしか出来ない(であろう)方式
リアクティブプログラミングを 絵を見て分かった気になる
引用 http://d.hatena.ne.jp/pokarim/20101226
「値と値の関係性」を関数として記述するプログラミングスタイル、っぽい、みたいな?感じ?
関数として定義 ↓
リアクティブプログラミングを 仮想言語で分かった気になるa = 1
b = a * 3 a = 2 print(b) ←ここで何が出てくる? • 命令型なら
• bは3のまま ← a*3が計算された時のまま • リアクティブプログラミングでは
• bが6になってる ←「bはaの3倍」という関係性を定義しているので、bの値はaの値が変更されたら自動で再計算され、自動で再代入されている(?)
• Excelのセルに書いたマクロのような感じ
ReactiveCocoaを使ってみる: 作ってみるアプリ
ユーザ作成画面を想定
•createボタンは以下の条件を満たしたら有効になる(ルール1)
◦ username,emailが空でない ◦ passwordとpasswordVerificationが同
じ ◦ passwordは8文字以上 • passwordとpasswordVerificationが違う場
合とpasswordが8文字以下の場合は、Labelに警告が表示される(ルール2)
!→TextFieldの状態が変わったら、メッ
セージとボタンの状態が変わる。
ReactiveCocoaを使ってみる: Target/Action方式(1)
• 見慣れた構成 • ルールは、ViewControllerのメソッドとして持つ
ReactiveCocoaを使ってみる: Target/Action方式(2)
https://github.com/taktamur/RACSample/blob/master/RACSample/TargetActionViewController.m
ReactiveCocoaを使ってみる: ReactiveCocoa方式(1)
• 構成としてはほぼ同じ • ルールは、RACSignalオブジェクトが持つ
• RAC =ReactiveCocoa のprefix • ルールはblockで記述
• ルールの記述にUIヘの参照が無い
ReactiveCocoaを使ってみる: ReactiveCocoa方式(2)
https://github.com/taktamur/RACSample/blob/master/RACSample/RACStyleViewController.m
UIのバインド
ルールの実装
結果をバインド
ReactiveCocoaを使ってみる: ここまでの実装で気になる点
• ルール1とルール2に、重複する部分がある • createボタンは以下の条件を満たしたら有効になる(ルール1)
• username,emailが空でない• passwordとpasswordVerificationが同じ• passwordは8文字以上
• passwordとpasswordVerificationが違う場合とpasswordが8文字以下の場合は、Labelに警告が表示される(ルール2)
• このルールの分離はTarget/Action方式ではやりにくいけど、ReactiveCocoaなら可能!
• →RACSignalの連鎖が可能
ReactiveCocoaを使ってみる: RACSignalの連鎖(1)
https://github.com/taktamur/RACSample/blob/master/RACSample/RACStyleViewController2.m
ReactiveCocoaを使ってみる: RACSignalの連鎖(2)
https://github.com/taktamur/RACSample/blob/master/RACSample/RACStyleViewController2.m
別で作ったSignalを 元データとして バインドしている
Signalが連鎖するような書き方は 標準では出来ない(ですよね?)
まとめ• パラダイムとしての「リアクティブプログライング」は魅力的
• テンポラリ的な「変数(状態)」が不要なので、矛盾が発生しにくい。再計算は言語やランタイム、ライブラリが自動で行う。関数型言語っぽい。
• ライブラリとしての「ReactiveCocoa」は難物←今時点での田村評価
• 利点:ビジネスロジックをSignalとして分離出来る。またSignalの連鎖を使って、ビジネスロジックを「単純なルールの組み合わせ」に分解出来る。UIとロジックの分離が可能。
• 欠点:難解。Objective-Cと馴染んでいない。ライブラリが超ヘビー級。
• 同じアイデアを、もっとObjetive-Cに馴染んだ形で、ライトに実装されたものがあればそれが欲しい。←無ければつk(ry
ご清聴 ありがとうございました。
• このLTの原稿 http://qiita.com/paming/items/9ac189ab0fe5b25fe722