Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
あの日見た M V Whateverの Modelを僕たちは まだ知らない
Search
Shinpei Maruyama
July 03, 2016
Programming
7.4k
20
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
あの日見た M V Whateverの Modelを僕たちは まだ知らない
Shinpei Maruyama
July 03, 2016
More Decks by Shinpei Maruyama
See All by Shinpei Maruyama
過去や未来を扱うのは難しい? 過去と未来に立ち向かうための勘所
shinpeim
3
4.5k
設計ナイト2022 トランザクションスクリプト
shinpeim
12
3.7k
Ruby (off|with) the Rails
shinpeim
20
5.3k
綱渡りバッチ脱出大作戦
shinpeim
3
4k
Building native apps with scala.js
shinpeim
2
1.5k
今あえてDRY原則に向き合う
shinpeim
51
560k
Nekogata Drum Sequencer written in Scala.js
shinpeim
2
4.1k
複雑なJavaScriptアプリケーションに立ち向かうためのアーキテクチャ
shinpeim
36
15k
Using Scala.js with the JavaScript ecosystems
shinpeim
0
2.5k
Other Decks in Programming
See All in Programming
AIエージェントで 変わるAndroid開発環境
takahirom
2
680
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
790
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
360
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
180
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
210
霧の中の代数的エフェクト
funnyycat
1
400
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
330
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.5k
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
190
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
270
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
840
Featured
See All Featured
HDC tutorial
michielstock
2
750
RailsConf 2023
tenderlove
30
1.5k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
870
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
770
WENDY [Excerpt]
tessaabrams
11
38k
Prompt Engineering for Job Search
mfonobong
0
380
Technical Leadership for Architectural Decision Making
baasie
3
440
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Scaling GitHub
holman
464
140k
Transcript
by しんぺい a.k.a. 猫型蓄音機 あの日見た M V Whateverの Modelを僕たちは まだ知らない
自己紹介 • しんぺい a.k.a. 猫型蓄音機 • Scala Ruby Perl Swift
• 妻の夫で息子の父親
息子紹介
宣伝
M V Whatever?
MVW • M V C(ontroller) • M V P(resenter) •
M V V(iew)M(odel) • etc.
FAQ:何が違うの?
どこが同じでどこが違うの? • MVWは全て、Presentation Domain Separationの実現のため のパターン • 実現の仕方が細かく言うといろいろ 違う
PDS? • http://martinfowler.com/bliki/ PresentationDomainSeparation. html
PDS? • separation between the presentation aspects of a program
(the user interface) and the rest of the functionality IUUQNBSUJOGPXMFSDPNCMJLJ 1SFTFOUBUJPO%PNBJO4FQBSBUJPOIUNM
PDS? • その名の通り、プレゼンテーション とドメインの分離
PDS • This principle is the most prominent part of
Model View Controller (MVC) IUUQNBSUJOGPXMFSDPNCMJLJ 1SFTFOUBUJPO%PNBJO4FQBSBUJPOIUNM
PDS? • 「Domain?あっDDDでやったとこ ろだ!!!!」<=頻出する間違い です • DDDで言うDomainModelとPDSの 言うDomainの関係は、無関係とい う関係
じゃあPDSで 言うところの Domainって なあに?
MVWのMのことです
じゃあMVWで 言うところの Modelって なあに?
よくある説明 • Model:ビジネスロジック • View:見た目 • Whatever:ModelとViewをつなぐ もの
ビジネスロジック とは一体(哲学)
None
わからないときは わかりやすい ところから考えよう
Viewはわかりやすい • iOSならUIView • AndroidにもViewクラスがありま すね • WebAppならばHTML(DOM)+CSS ですね •
WebAPIならJSONとか
Wもわかりやすい • iOSならViewController • androidならActivity • RailsならController • ViewをレンダリングしたりViewを 変更したり
• 入力を受け取ったり
PDSふたたび • separation between the presentation aspects of a program
(the user interface) and the rest of the functionality
Presentation = View + Whatever 入力を受け取る 見た目を作る
では M = Domain の部分はなんなのか
PDSみたび • separation between the presentation aspects of a program
(the user interface) and the rest of the functionality
Domain = the rest プレゼンテーション 以外全部です
None
MVWは Modelの設計方針を 何一つ語っていな い!!!! MVWは Modelの設計方針を 何一つ語っていな い!!!!
アバンパート終了
あの日見た M V Whateverの Modelを僕たちは まだ知らない
Modelのアーキテクチャ例 • ActiveRecordPattern • TransactionScript • LayeredArchitecture
Active Record Pattern
ActiveRecordPattern • テーブルとクラスが1:1 • rowとインスタンスが1:1 • テーブルに対する操作をクラスメソッ ドに書く • rowに対する操作をインスタンスメ
ソッドに書く
ARパターン適用前
ARパターン適用後
• Rack経由せずにテストできるよう になった! • rake タスクとかからも呼べるよ ね〜
よくある課題 • 複数のテーブルにまたがるロジック どうするの? • トランザクションどこで制御すんの?
None
ActiveRecordPattern再訪 • Patterns of Enterprise Application Architecture で紹介されたパターンの うちのひとつ •
テーブルとクラスが1:1 • 実践DDD says:「単なるCRUDアプリ ケーションならばRuby On Railsで十分 だろう」
ARパターンだけで 全てが解決できると 思ってはいけない
ちなみに • RoRのARはARパターンをベースにした ライブラリだけど、さらに拡張が加えら れている • RoRではARベースで問題を解決しようと するアプローチもあるっぽいがうまく行っ てるという話はあまり聞かない[要出典]
Transaction Script
TransactionScript • ユースケースと1:1のメソッド • ユースケースに対応する手続きをそ のメソッドに書いていく • まさに「script:台本」
TS適用
• ARだけでは実現できなかった、複 数の関心にまたがるユースケースを 実現できた • トランザクションもばっちり
よくある課題 • コピペ地獄 • 1メソッドの長さが100000000行 • 1メソッド読み終えるのに5億年か かる
None
ちなみに • とはいえ、WebApplicationや WebAPIではトランザクションスク リプトで問題ないケースは結構ある と思う
Layered Architecture
Layered Architecture Presentation ApplicationService DomainModel Infrastructure • VとW • Pが叩く窓口
• これ以外すべて • DBアクセスとか
in DomainModel
in DomainModel
in Infrastructure
in ApplicationService
• 一枚岩のスクリプトだったのが責務 分散された • 複雑化しすぎたTransactionScript はテスタビリティが悪化する • テスタビリティを取り戻した • DomainはDBなしでテストできる
よくある課題 • 難しい • 「これどこに書けばいいの?」 • ちゃんとOOPで設計できないプログラマ にとってはTSの手続き型のほうがわかり やすい。というかOOはやっぱり難しい ですよ
• ドメイン層、やっていくしかない
None
とはいえ • われわれはそもそも複雑な問題を解 決するためにこのパターンにたどり 着いた • たとえ難しくてもやっていく価値は ある • OOPやDDDを頑張って学ぼう
FAQ • Q.これって要するにDDDのこと? • A.惜しいです。 • LayeredArchitectureはDDDで触れられ るパターンのうちのひとつ。DDDはLAの ほかにもユビキタス言語とか境界付けら れたコンテキストとかいろいろ含む
Aパート終了
アイキャッチ あの日見た M V Whateverの Modelを僕たちは まだ知らない
アイキャッチ あの日見た M V Whateverの Modelを僕たちは まだ知らない
Bパート GUIで実践編
連打マシーンを作る • 連打された数が表示されるカウンター と連打用ボタンが置いてある • ボタンを押すとカウントが +1 さ れる •
自分だけじゃなくてネットワーク越 しにみんなで連打しまくる
実装方針 • クライアントで連打数をバッファリング して一定時間おきにサーバーにflush • ただし、タップしたらすぐに見た目上の カウンターの数が増えるようにする • サーバーから定期的に「現在の総連打数」 が送られてくるので、そのときはカウン
ターをupdateする
意外と複雑!
まずはModelを 考えてみる
in Domain
in Domain
in Domain
in ApplicationService
アプリケーションの 挙動はモデリング できた
Presentation層
ViewController
Presentation層から イベントを受けて Applicationを invokeするところ までできた
しかし このままでは Viewが 描き変わらない
Counterの状態が 変わったら UILabelを 書き換えたい
Xの状態が 変わったら Yを 書き換えたい
Xの状態が 変わったら Yを 書き換えたい
Observerパターンで やったところだ!
CounterをObservableに
VCでObserve
完成や!!!
• ドメインは一切プレゼンテーション に依存していない • テスタブルだし、CocoaTouchに依 存してないから「わかりやすい」
PDS! IUUQNBSUJOGPXMFSDPNCMJLJ1SFTFOUBUJPO%PNBJO4FQBSBUJPOIUNM
yudetamago, STAR ZERO and YOU 感動のエンドロール
感動のエンドロール
いきなり数字が < 飛ぶぞ!!!! これはバグだ!
None
UIの問題なので Presentationの 領域で 解決しましょう
CounterLabel
VCも変更
• UIの変更がPのみでできた • Dは一切いじってない
そして設計沼へ…… • 今回Serverからのpushをハンドルして くれるくんをModelに置いたけど、本当 にこれでいいのか? • Serverからのpush = アプリケーション への入力では?
• 本質的にはタイマーイベントと一緒なの では?
• PにActionProviderという層があっ てもいいかもしれない • タイマーイベントを発行する君 • サーバーからのpushを受け取ってイベン ト発行する君 • VCがこれらのイベントを監視して
ApplicationServiceをinvokeする そして設計沼へ……
• このObserverパターン素朴すぎる • Observerパターンはオブジェクトの mutationが前提 • immutableな設計と相性悪い • API呼び出しはInfrastructureに置 いてDIするべきでは
そして設計沼へ……
• RepositoryとQueryの相性めっ ちゃわるい • ARにはあまりなかったRDBとOOの インピーダンスミスマッチがここに きて問題に そして設計沼へ……
• Fluxアーキテクチャとの統合…? • CQRS…? • EventSourcing…? そして設計沼へ……
ここから先は 君自身の目で たしかめよう! ▲ ▲▲
まとめ • PDSを心がけよう • MVWはプレゼンテーション層の作 り方のパターン • Mの設計はまた別にちゃんと考える 必要あり •
トライフォースの力とともに進もう
宣伝 • 株式会社リラクでは、一緒に最高の 設計を追求したいプログラマを募集 しています • 声かけてください!
まとめ • PDSを心がけよう • MVWはプレゼンテーション層の作 り方のパターン • Mの設計はまた別にちゃんと考える 必要あり •
トライフォースの力とともに進もう