Slide 1

Slide 1 text

by しんぺい a.k.a. 猫型蓄音機 あの日見た M V Whateverの Modelを僕たちは まだ知らない

Slide 2

Slide 2 text

自己紹介 • しんぺい a.k.a. 猫型蓄音機 • Scala Ruby Perl Swift • 妻の夫で息子の父親

Slide 3

Slide 3 text

息子紹介

Slide 4

Slide 4 text

宣伝

Slide 5

Slide 5 text

M V Whatever?

Slide 6

Slide 6 text

MVW • M V C(ontroller) • M V P(resenter) • M V V(iew)M(odel) • etc.

Slide 7

Slide 7 text

FAQ:何が違うの?

Slide 8

Slide 8 text

どこが同じでどこが違うの? • MVWは全て、Presentation Domain Separationの実現のため のパターン • 実現の仕方が細かく言うといろいろ 違う

Slide 9

Slide 9 text

PDS? • http://martinfowler.com/bliki/ PresentationDomainSeparation. html

Slide 10

Slide 10 text

PDS? • separation between the presentation aspects of a program (the user interface) and the rest of the functionality IUUQNBSUJOGPXMFSDPNCMJLJ 1SFTFOUBUJPO%PNBJO4FQBSBUJPOIUNM

Slide 11

Slide 11 text

PDS? • その名の通り、プレゼンテーション とドメインの分離

Slide 12

Slide 12 text

PDS • This principle is the most prominent part of Model View Controller (MVC) IUUQNBSUJOGPXMFSDPNCMJLJ 1SFTFOUBUJPO%PNBJO4FQBSBUJPOIUNM

Slide 13

Slide 13 text

PDS? • 「Domain?あっDDDでやったとこ ろだ!!!!」<=頻出する間違い です • DDDで言うDomainModelとPDSの 言うDomainの関係は、無関係とい う関係

Slide 14

Slide 14 text

じゃあPDSで 言うところの Domainって なあに?

Slide 15

Slide 15 text

MVWのMのことです

Slide 16

Slide 16 text

じゃあMVWで 言うところの Modelって なあに?

Slide 17

Slide 17 text

よくある説明 • Model:ビジネスロジック • View:見た目 • Whatever:ModelとViewをつなぐ もの

Slide 18

Slide 18 text

ビジネスロジック とは一体(哲学)

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

わからないときは わかりやすい ところから考えよう

Slide 21

Slide 21 text

Viewはわかりやすい • iOSならUIView • AndroidにもViewクラスがありま すね • WebAppならばHTML(DOM)+CSS ですね • WebAPIならJSONとか

Slide 22

Slide 22 text

Wもわかりやすい • iOSならViewController • androidならActivity • RailsならController • ViewをレンダリングしたりViewを 変更したり • 入力を受け取ったり

Slide 23

Slide 23 text

PDSふたたび • separation between the presentation aspects of a program (the user interface) and the rest of the functionality

Slide 24

Slide 24 text

Presentation = View + Whatever 入力を受け取る 見た目を作る

Slide 25

Slide 25 text

では M = Domain の部分はなんなのか

Slide 26

Slide 26 text

PDSみたび • separation between the presentation aspects of a program (the user interface) and the rest of the functionality

Slide 27

Slide 27 text

Domain = the rest プレゼンテーション 以外全部です

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

MVWは Modelの設計方針を 何一つ語っていな い!!!! MVWは Modelの設計方針を 何一つ語っていな い!!!!

Slide 30

Slide 30 text

アバンパート終了

Slide 31

Slide 31 text

あの日見た M V Whateverの Modelを僕たちは まだ知らない

Slide 32

Slide 32 text

Modelのアーキテクチャ例 • ActiveRecordPattern • TransactionScript • LayeredArchitecture

Slide 33

Slide 33 text

Active Record Pattern

Slide 34

Slide 34 text

ActiveRecordPattern • テーブルとクラスが1:1 • rowとインスタンスが1:1 • テーブルに対する操作をクラスメソッ ドに書く • rowに対する操作をインスタンスメ ソッドに書く

Slide 35

Slide 35 text

ARパターン適用前

Slide 36

Slide 36 text

ARパターン適用後

Slide 37

Slide 37 text

• Rack経由せずにテストできるよう になった! • rake タスクとかからも呼べるよ ね〜

Slide 38

Slide 38 text

よくある課題 • 複数のテーブルにまたがるロジック どうするの? • トランザクションどこで制御すんの?

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

ActiveRecordPattern再訪 • Patterns of Enterprise Application Architecture で紹介されたパターンの うちのひとつ • テーブルとクラスが1:1 • 実践DDD says:「単なるCRUDアプリ ケーションならばRuby On Railsで十分 だろう」

Slide 41

Slide 41 text

ARパターンだけで 全てが解決できると 思ってはいけない

Slide 42

Slide 42 text

ちなみに • RoRのARはARパターンをベースにした ライブラリだけど、さらに拡張が加えら れている • RoRではARベースで問題を解決しようと するアプローチもあるっぽいがうまく行っ てるという話はあまり聞かない[要出典]

Slide 43

Slide 43 text

Transaction Script

Slide 44

Slide 44 text

TransactionScript • ユースケースと1:1のメソッド • ユースケースに対応する手続きをそ のメソッドに書いていく • まさに「script:台本」

Slide 45

Slide 45 text

TS適用

Slide 46

Slide 46 text

• ARだけでは実現できなかった、複 数の関心にまたがるユースケースを 実現できた • トランザクションもばっちり

Slide 47

Slide 47 text

よくある課題 • コピペ地獄 • 1メソッドの長さが100000000行 • 1メソッド読み終えるのに5億年か かる

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

ちなみに • とはいえ、WebApplicationや WebAPIではトランザクションスク リプトで問題ないケースは結構ある と思う

Slide 50

Slide 50 text

Layered Architecture

Slide 51

Slide 51 text

Layered Architecture Presentation ApplicationService DomainModel Infrastructure • VとW • Pが叩く窓口 • これ以外すべて • DBアクセスとか

Slide 52

Slide 52 text

in DomainModel

Slide 53

Slide 53 text

in DomainModel

Slide 54

Slide 54 text

in Infrastructure

Slide 55

Slide 55 text

in ApplicationService

Slide 56

Slide 56 text

• 一枚岩のスクリプトだったのが責務 分散された • 複雑化しすぎたTransactionScript はテスタビリティが悪化する • テスタビリティを取り戻した • DomainはDBなしでテストできる

Slide 57

Slide 57 text

よくある課題 • 難しい • 「これどこに書けばいいの?」 • ちゃんとOOPで設計できないプログラマ にとってはTSの手続き型のほうがわかり やすい。というかOOはやっぱり難しい ですよ • ドメイン層、やっていくしかない

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

とはいえ • われわれはそもそも複雑な問題を解 決するためにこのパターンにたどり 着いた • たとえ難しくてもやっていく価値は ある • OOPやDDDを頑張って学ぼう

Slide 60

Slide 60 text

FAQ • Q.これって要するにDDDのこと? • A.惜しいです。 • LayeredArchitectureはDDDで触れられ るパターンのうちのひとつ。DDDはLAの ほかにもユビキタス言語とか境界付けら れたコンテキストとかいろいろ含む

Slide 61

Slide 61 text

Aパート終了

Slide 62

Slide 62 text

アイキャッチ あの日見た M V Whateverの Modelを僕たちは まだ知らない

Slide 63

Slide 63 text

アイキャッチ あの日見た M V Whateverの Modelを僕たちは まだ知らない

Slide 64

Slide 64 text

Bパート GUIで実践編

Slide 65

Slide 65 text

連打マシーンを作る • 連打された数が表示されるカウンター と連打用ボタンが置いてある • ボタンを押すとカウントが +1 さ れる • 自分だけじゃなくてネットワーク越 しにみんなで連打しまくる

Slide 66

Slide 66 text

実装方針 • クライアントで連打数をバッファリング して一定時間おきにサーバーにflush • ただし、タップしたらすぐに見た目上の カウンターの数が増えるようにする • サーバーから定期的に「現在の総連打数」 が送られてくるので、そのときはカウン ターをupdateする

Slide 67

Slide 67 text

意外と複雑!

Slide 68

Slide 68 text

まずはModelを 考えてみる

Slide 69

Slide 69 text

in Domain

Slide 70

Slide 70 text

in Domain

Slide 71

Slide 71 text

in Domain

Slide 72

Slide 72 text

in ApplicationService

Slide 73

Slide 73 text

アプリケーションの 挙動はモデリング できた

Slide 74

Slide 74 text

Presentation層

Slide 75

Slide 75 text

ViewController

Slide 76

Slide 76 text

Presentation層から イベントを受けて Applicationを invokeするところ までできた

Slide 77

Slide 77 text

しかし このままでは Viewが 描き変わらない

Slide 78

Slide 78 text

Counterの状態が 変わったら UILabelを 書き換えたい

Slide 79

Slide 79 text

Xの状態が 変わったら Yを 書き換えたい

Slide 80

Slide 80 text

Xの状態が 変わったら Yを 書き換えたい

Slide 81

Slide 81 text

Observerパターンで やったところだ!

Slide 82

Slide 82 text

CounterをObservableに

Slide 83

Slide 83 text

VCでObserve

Slide 84

Slide 84 text

完成や!!!

Slide 85

Slide 85 text

• ドメインは一切プレゼンテーション に依存していない • テスタブルだし、CocoaTouchに依 存してないから「わかりやすい」

Slide 86

Slide 86 text

PDS! IUUQNBSUJOGPXMFSDPNCMJLJ1SFTFOUBUJPO%PNBJO4FQBSBUJPOIUNM

Slide 87

Slide 87 text

yudetamago, STAR ZERO and YOU 感動のエンドロール

Slide 88

Slide 88 text

感動のエンドロール

Slide 89

Slide 89 text

いきなり数字が < 飛ぶぞ!!!! これはバグだ!

Slide 90

Slide 90 text

No content

Slide 91

Slide 91 text

UIの問題なので Presentationの 領域で 解決しましょう

Slide 92

Slide 92 text

CounterLabel

Slide 93

Slide 93 text

VCも変更

Slide 94

Slide 94 text

• UIの変更がPのみでできた • Dは一切いじってない

Slide 95

Slide 95 text

そして設計沼へ…… • 今回Serverからのpushをハンドルして くれるくんをModelに置いたけど、本当 にこれでいいのか? • Serverからのpush = アプリケーション への入力では? • 本質的にはタイマーイベントと一緒なの では?

Slide 96

Slide 96 text

• PにActionProviderという層があっ てもいいかもしれない • タイマーイベントを発行する君 • サーバーからのpushを受け取ってイベン ト発行する君 • VCがこれらのイベントを監視して ApplicationServiceをinvokeする そして設計沼へ……

Slide 97

Slide 97 text

• このObserverパターン素朴すぎる • Observerパターンはオブジェクトの mutationが前提 • immutableな設計と相性悪い • API呼び出しはInfrastructureに置 いてDIするべきでは そして設計沼へ……

Slide 98

Slide 98 text

• RepositoryとQueryの相性めっ ちゃわるい • ARにはあまりなかったRDBとOOの インピーダンスミスマッチがここに きて問題に そして設計沼へ……

Slide 99

Slide 99 text

• Fluxアーキテクチャとの統合…? • CQRS…? • EventSourcing…? そして設計沼へ……

Slide 100

Slide 100 text

ここから先は 君自身の目で たしかめよう! ▲ ▲▲

Slide 101

Slide 101 text

まとめ • PDSを心がけよう • MVWはプレゼンテーション層の作 り方のパターン • Mの設計はまた別にちゃんと考える 必要あり • トライフォースの力とともに進もう

Slide 102

Slide 102 text

宣伝 • 株式会社リラクでは、一緒に最高の 設計を追求したいプログラマを募集 しています • 声かけてください!

Slide 103

Slide 103 text

まとめ • PDSを心がけよう • MVWはプレゼンテーション層の作 り方のパターン • Mの設計はまた別にちゃんと考える 必要あり • トライフォースの力とともに進もう