MVCもやもや話




かねうちてつや @kaniza
2012.05.19
Cocoa勉強会関西
自己紹介
•かねうちてつや (@kaniza, id:kaniza)
•かねうちてつや (@kaniza, id:kaniza)
•Cocoa勉強会関西代表(2代目)
•かねうちてつや (@kaniza, id:kaniza)
•Cocoa勉強会関西代表(2代目)
 •KOF2012 11/9-10 で開催予定
•かねうちてつや (@kaniza, id:kaniza)
•Cocoa勉強会関西代表(2代目)
 •KOF2012 11/9-10 で開催予定
•最近わりと開発モード
•かねうちてつや (@kaniza, id:kaniza)
•Cocoa勉強会関西代表(2代目)
 •KOF2012 11/9-10 で開催予定
•最近わりと開発モード
 •ARCとかStoryboardとかPush Notificationとか
•かねうちてつや (@kaniza, id:kaniza)
•Cocoa勉強会関西代表(2代目)
 •KOF2012 11/9-10 で開催予定
•最近わりと開発モード
 •ARCとかStoryboardとかPush Notificationとか
 •相変わらずEmacsでObjective-C
•かねうちてつや (@kaniza, id:kaniza)
•Cocoa勉強会関西代表(2代目)
 •KOF2012 11/9-10 で開催予定
•最近わりと開発モード
 •ARCとかStoryboardとかPush Notificationとか
 •相変わらずEmacsでObjective-C
•自炊モード
•かねうちてつや (@kaniza, id:kaniza)
•Cocoa勉強会関西代表(2代目)
 •KOF2012 11/9-10 で開催予定
•最近わりと開発モード
 •ARCとかStoryboardとかPush Notificationとか
 •相変わらずEmacsでObjective-C
•自炊モード
 •大型断裁機をレンタルして本バラしまくり
自炊
(雑談です)
これまでのカッター
レンタルした断裁機:20kg
レンタルした断裁機:20kg
O社の分厚い本も一撃!
本題の前置き
よい設計とは: 疎結合・高凝集
•疎結合
•構成する部分どうしの関連性が最小限
•具体的結合よりは抽象的結合
•相互依存は悪
•高凝集
•関連性の高いものが一カ所にまとまっている
•変更する時はそこだけいじればいい
本題
Model-View-Controller
Model




      View           Controller




ソフトウェアのデザイン(設計)パターンの1つ
Model-View-Controller
Model-View-Controller
• オブジェクト指向のGUIアプリ向け
Model-View-Controller
• オブジェクト指向のGUIアプリ向け
• Appleが基本パターンとして採用
Model-View-Controller
• オブジェクト指向のGUIアプリ向け
• Appleが基本パターンとして採用
• Smalltalk由来の歴史ある考え方
Model-View-Controller
• オブジェクト指向のGUIアプリ向け
• Appleが基本パターンとして採用
• Smalltalk由来の歴史ある考え方
• (オブジェクト指向と同じく)人に
  よって言うことが違う
意義
•役割分担させることで構造がわかりやすくなる
•分離したM-V-Cを(理想的には)それぞれ取り
替えて再利用できる

•ひとつのMで複数のVを持つなどの設計が容易
になる

•ModelロジックとViewロジックが分類できる
•Modelのテストを自動化しやすい
Model
• そのアプリ、画面の存在意義の部分
• データ保持、特殊な処理
  • ビジネスロジック
• GUIとは分離している
 • ViewやControllerのことは知らない
View
• ソフトウェアを人間に知覚させ、操作
  させる

• データの表示
• コマンドの入力
• Modelのことを知っているが、Controller
  のことは知らない
Controller
• ModelとViewをつなぐ
• Viewからの入力をModelに反映
• Modelの変化をViewに反映
• ModelのこともViewのことも知っている
• なくても済めば要らない部分(だけど
  ないと動かない)
Model




View           Controller
イメージ
•Model: ないと意味がない
•View: ないと使えない
•Controller: ないと動かない
iOS開発ありがちパターン
•とりあえずnibで画面を作る
•動きをView Controllerに実装
•さらにView Controllerに実装
•View Controllerバンザイ!!
•MVCなにそれ?
ViewControllerばっかり



  ABCViewController             XYZViewController




                      Other Classes
View Controllerとは
•Viewではない
•MVCではControllerに属する
•ViewのController
•ModelのControllerがあってもいい
 •NSDocumentとか
考える順番をかえてみる
•画面をまず考えるのはOK
•その画面のModelは何か?
 •どんな情報があるか?
 •どんな機能、ロジックがあるか?
•Modelを作る
 •データ取得やキモとなるロジック
•View ControllerにはModelとViewを仲介する
 部分を実装
実際やってみようとすると
Modelが勝手に変わったのを
Viewはどうやって知るの?

                  Model




      View                Controller




               Viewが受けとった入力を
             Controllerはどうやって知るの?
通知

Model              View


          監視




        相互依存は悪!!
必要なもの
ModelがViewを知らなくても
変更が通知できるようにする
Observerパターン
(GoFのデザインパターン参照)
通知

  Model        Observer



                    実現
          監視
                 View




Modelは抽象的・間接的にViewを参照
CocoaでのObserverパターン
Key-Value Observing
NSKeyValueObserving

// 監視する
- (void)addObserver:(NSObject *)anObserver
forKeyPath:(NSString *)keyPath options:
(NSKeyValueObservingOptions)options context:(void
*)context;

// 通知する
- (void)willChangeValueForKey:(NSString *)key;
- (void)didChangeValueForKey:(NSString *)key;

// 通知を受けとる
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object change:(NSDictionary *)change
context:(void *)context
NSKeyValueObserving
•NSObjectで対応
•通知は @synthesize したプロパティを変更し
 たら自動で発動

 •self.foo = @”newVal”;
•とーっても簡単!!
このパターンは他にも使える


   Model   Observer



                実現

             View
たとえばDelegateの場合


    Model   ModelDelegate



                    実現

            ViewController
こういうアプリよりも



 ABCViewController             XYZViewController




                     Other Classes
こういうアプリを目指したい

 ABCViewController              XYZViewController




    ABCModel                         XYZModel




                     Other Classes
Appleのドキュメント

Your Second iOS App: Storyboards
https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/
SecondiOSAppTutorial/Introduction/Introduction.html




単純だけどあえてModelレイヤを分離した設計を採用
まとめ
•View Controllerにすべてを書くのはやめよう
•Modelが何なのかを考えて作ってみよう
•オブジェクト間の連携にはObserverや
Delegateを使って疎結合を保とう

•Singletonは避けよう!(これはまたいつか)
Q&A

MVCもやもや話