More Related Content
PDF
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い PPTX
知らないと損するアプリ開発におけるStateMachineの活用法(full版) PPTX
FINAL FANTASY Record Keeperのマスターデータを支える技術 PPTX
KEY
PDF
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング PDF
テストとリファクタリングに関する深い方法論 #wewlc_jp PDF
What's hot
PDF
マルチテナント化で知っておきたいデータベースのこと PDF
PPTX
PDF
PDF
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기 PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話 PDF
PDF
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~ PDF
PDF
PDF
PDF
쿠키런 1년, 서버개발 분투기 PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について PDF
PDF
PPTX
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference PPTX
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら PDF
強いて言えば「集約どう実装するのかな、を考える」な話 PDF
なかったらINSERTしたいし、あるならロック取りたいやん? PPTX
Viewers also liked
PDF
iOS アプリのメンテナンス性を高めるための基本的な考え方 PPTX
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか) PDF
iOSやAndroidアプリ開発のGoodPractice PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」 PDF
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法 PDF
プロトコル指向 - 夢と現実の狭間 #cswift PDF
NS Prefix 外伝 … Copy-On-Write #関モバ PPT
Android mvc-frameworkが凄くて泣きそう PDF
Swift 2.0 大域関数の行方から #swift2symposium PPTX
PDF
AnyObject – 自分が見落としていた、基本の話 PDF
Apple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべて PDF
リアクティブプログラミングとMVVMパターンについて PDF
Android cleanarchitecture PDF
VIPER アーキテクチャによる iOS アプリの設計 PDF
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi PPTX
PDF
PDF
PDF
[Android]Fragmentとのつきあい方を考える Similar to IOS/Androidアプリの3つの大事な設計方針
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題 KEY
PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ PPTX
PPTX
121117 metro styleapp_templateapp PDF
PPTX
2012 05-19第44回cocoa勉強会発表資料 PDF
BNN CAMP vol.3 インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1 PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1 PPTX
PDF
PDF
Introduction for Browser Side MVC PDF
PPTX
KEY
PPTX
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„ PPTX
KEY
PDF
More from Ken Morishita
PDF
BigQuery勉強会 Standard SQL Dialect PPTX
知らないと損するアプリ開発におけるStateMachineの活用法(15分版) PDF
PDF
PDF
PPTX
Pythonとdeep learningで手書き文字認識 IOS/Androidアプリの3つの大事な設計方針
- 1.
- 2.
- 3.
- 4.
- 5.
端的に言うとこういうこと
• Model と それ以外を分ける
• Objectのライフサイクルと参照関
係の整理理をしよう
• ⾮非同期制御でState Machineを活⽤用
しよう
11つずつ説明していくよ
- 6.
- 7.
まずは「MMooddeellって何?」っ
てことよね。
MMooddeellが意味する範囲は広い
のよ。
基本的にはアプリケーション
データの本質的な処理をする
のがMMooddeellに相当するわ。
といってもピンとこないから、
「何がMMooddeellでないか?」を
考えるとわかりやすいよ。
- 8.
簡単に言うとMMooddeellは
アプリの中でUUIIに関係しない部分
つまりUUIIに関係する部分はMMooddeell
ではないわ
UI=User Interface: ユーザの操作を受け付けたり何かを表⽰示をする部分
- 9.
- 10.
- 11.
MMooddeellはUUIIに無関係の部分だ
から、
iiPPhhoonneeとiiPPaaddのようにVViieeww
のレイアウトが全く違うよう
な場合でも再利用できるはず
の部分なの。
もしVViieewwが変わったときに、
大きいコピペが必要ならそれ
はMMooddeellかもよ?
極端な話、CCUUIIでもMMooddeellの
部分は再利用できるはず。
CUI=Command UI: テキストベースのUI. Shellとか。
- 12.
- 13.
- 14.
- 15.
MMooddeell
EEddiittoorr
お前は絶対にダメだ
MMooddeell → EEddiittoorrは直接アクセスしてはダメ
EEddiittoorr部分は代替可能
なのだから当然よね。
MMooddeellはEEddiittoorrの
具体的な存在を知らないものよ
- 16.
- 17.
- 18.
MMooddeell EEddiittoorr
ポイント残⾼高を教えて!
例えば、残高を表示したい場合
あ、今調べるわ
でも、通信したりしないとわか
らないケースがあるよね。その
場合は同期的に値は返せないの。
あっそ, 待ってるよ
return
- 19.
- 20.
MMooddeellからEEddiittoorrへの通知方法
• Observerパターンを使う
• iOS なら NSNotificationCenter を
使っても良良い
こういうときは
OObbsseerrvveerrパターンやその類
似の方法を使うのが普通だね
Observerパターン: デザインパターンの⼀一つ。知らなければググってみよう。
- 21.
- 22.
- 23.
- 24.
- 25.
じゃあ、まとめるよ
• Model → Editor の直接参照はしない
• ⾮非同期で結果を返すときは Observer
パターンなどを使う
• Modelはいつどんな指⽰示を受けても問
題を起こさないことが⼤大事とても大事なことだか
ら覚えておいてね!
- 26.
- 27.
- 28.
- 29.
- 30.
C
逆に「短命」 → 「長命」
という参照だけだと、
短命OObbjjeeccttが消滅したとき
に一緒に長命OObbjjeeccttが消滅
してしまうよね。
A B
本当は⻑⾧長命
C
A B
事故死天寿
- 31.
- 32.
ライフサイクルと参照関係
• ⻑⾧長命→短命 が基本
• 各Objectがどういうライフサイク
ルであるべきか、を念念頭に参照関
係を設計するのが⼤大事
当たり前体操よね
- 33.
- 34.
- 35.
- 36.
- 37.
最もよく見かける問題それは
PPaaggeeCCoonnttrroolllleerrだけが本来
長命であるOObbjjeeccttを生成・
維持・使用する
というケースよ
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
MMooddeell PPaaggeeCCoonnttrroolllleerr
調べてよ→
通信中
調べてよ→
既読スルー
MMooddeellRReeppoo
生成
Model頂戴
どうぞ
Model頂戴
どうぞ
実現例としては例えば、
MMooddeell RReeppoossiittoorryyのよ
うな超長命のOObbjjeeccttが
MMooddeellを生成・維持する
方法があるわね
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
PPaaggee
CCoonnttrroolllleerr
FFrraammeewwoorrkk
UUII
通信
SSeennssoorr//DDeevviiccee
Create/Destroy,
Resume/Suspend
Tap,
etc…
OK,
Error
GPS,
BLE,
Camera
そもそもPPaaggeeCCoonnttrroolllleerr((以降
PPCCと略))は色々なEEvveennttを処理
する必要があるし、
EEvveennttはどんな順番でいつ来る
かはほぼわからないわけよ。
画面表示
どんとこい
- 52.
- 53.
SSttaattuuss管理の場合、
どのSSttaattuussの時にどういう
EEvveennttが来たら、次にどの
SSttaattuussになるかという決まり
があるけど、それが各EEvveenntt
HHaannddlleerrに分散記述されると見
通しが悪くなる。
IIffやsswwiittcchhが大量に出てくる感
じね。こうなると可読性が落ち
ていくわ。
FFllaaggの場合も同様ね。
- 54.
- 55.
じゃあ、どうするか?
簡潔にいうと
SSttaattee MMaacchhiinnee((略してSSMM))を別
途作って状態をそこで管理する
ということよ
SSMMは次の事が主な役割よ
-- EEvveennttを受け付けて状態を遷移
-- 遷移時にAAccttiioonnを呼び出す
状態機械
- 56.
- 57.
TODO3
TODO1
TODO2
削除
削除
削除
削除しますか?
OK
Cancel
• サーバとの通信中はクルクルインジケーターを表示
• TODOをListで表示
• それぞれ削除ボタンがある
• 削除ボタンを押すと、ダイアログが表示されて本当
に削除するか尋ねる。Yesなら削除、Noなら何もしな
い。
• Yesならサーバと通信して、削除成功かエラーかをダ
イアログで表示する
• 削除処理中は、新たな削除は受け付けない。
ざっくり仕様よ
画⾯面イメージ
- 58.
- 59.
- 60.
- 61.
- 62.
この場合、
PPCCが実装するAAccttiioonnは
以下のものになるね
-‐‑‒ updateModel
-‐‑‒ showDeleteConfirm
-‐‑‒ closeDialog
-‐‑‒ deleteModel
-‐‑‒ showResult
-‐‑‒ finishComm
- 63.
33つを並べてみる
整列
-‐‑‒ updateModel
-‐‑‒ showDeleteConfirm
-‐‑‒ closeDialog
-‐‑‒ deleteModel
-‐‑‒ showResult
-‐‑‒ finishComm
- 64.
このやり方のメリットはこんなと
ころかしら
11.. 状態遷移がグラフ化され何を
したいか理解がし易い
22.. 各AAccttiioonnの位置づけが明確な
ので実装しやすい
33.. ボタンの連打や予期せぬ
EEvveennttを考慮しなくて良い
44.. 要するに可読性が高い
55.. 状態遷移の変更に強い
- 65.
- 66.
- 67.
- 68.
こんな感じかなぁ
OOKK//NNGG,, YYeess//NNoo
とかは共通で良いか
もね
- 69.
さっきの遷移図が良いかは置い
ておいて、
大事なのは、あのグラフを見て
どういう状態を考えるべきかと
いう本質的な問題に集中できる
ことよ。レビューも著しく捗る
わ。
FFllaagg管理だともうこの複雑レベ
ルですら可読性が超低下してい
ると思うよ
- 70.
- 71.
- 72.
- 73.
じゃあ、まとめるよ
• State Machineですっきり実装しよう
• Page Controllerだけじゃなくて
Modelの実装でも使えるよ
• State Machineは⾃自動⽣生成が楽
とても大事なことだか
ら覚えておいてね!
- 74.
さいごにもう一度
• Model と それ以外を分ける
• Objectのライフサイクルと参照関
係の整理理しよう
• ⾮非同期制御でState Machineを活⽤用
しよう
大事なことだから22度言います