SlideShare uma empresa Scribd logo
1 de 54
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

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
GUI アプリケーションにおける MVC
GUI アプリケーションにおける MVCGUI アプリケーションにおける MVC
GUI アプリケーションにおける MVC
 
MVVM入門
MVVM入門MVVM入門
MVVM入門
 
New Features of DotNet 6 Blazor WASM
New Features of DotNet 6 Blazor WASMNew Features of DotNet 6 Blazor WASM
New Features of DotNet 6 Blazor WASM
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
Dockerクイックツアー
 
塹壕よりLivetとMVVM
塹壕よりLivetとMVVM塹壕よりLivetとMVVM
塹壕よりLivetとMVVM
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Azure Cosmos DB のキホンと使いドコロ
Azure Cosmos DB のキホンと使いドコロAzure Cosmos DB のキホンと使いドコロ
Azure Cosmos DB のキホンと使いドコロ
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
 
ASP.NETの進化とASP.NET Core Blazorの凄さ
ASP.NETの進化とASP.NET Core Blazorの凄さASP.NETの進化とASP.NET Core Blazorの凄さ
ASP.NETの進化とASP.NET Core Blazorの凄さ
 
そろそろレガシーな.Net開発をやめなイカ?
そろそろレガシーな.Net開発をやめなイカ?そろそろレガシーな.Net開発をやめなイカ?
そろそろレガシーな.Net開発をやめなイカ?
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
WebブラウザでC#実行 WebAssemblyの技術
WebブラウザでC#実行 WebAssemblyの技術WebブラウザでC#実行 WebAssemblyの技術
WebブラウザでC#実行 WebAssemblyの技術
 
マジックビーンズ
マジックビーンズマジックビーンズ
マジックビーンズ
 
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
 

Destaque

Spectroscopy Letters Volume 26 issue 3 1993 [doi 10.1080_00387019308011552] S...
Spectroscopy Letters Volume 26 issue 3 1993 [doi 10.1080_00387019308011552] S...Spectroscopy Letters Volume 26 issue 3 1993 [doi 10.1080_00387019308011552] S...
Spectroscopy Letters Volume 26 issue 3 1993 [doi 10.1080_00387019308011552] S...
Al Baha University
 
Inteligo valuation report bvn
Inteligo valuation report bvnInteligo valuation report bvn
Inteligo valuation report bvn
gro77
 
فن الحياة الناجحة أبونا متى المسكين
فن الحياة الناجحة   أبونا متى المسكينفن الحياة الناجحة   أبونا متى المسكين
فن الحياة الناجحة أبونا متى المسكين
Ibrahimia Church Ftriends
 

Destaque (20)

MVC 03
MVC 03MVC 03
MVC 03
 
Container view活用術とポイントになる部分
Container view活用術とポイントになる部分Container view活用術とポイントになる部分
Container view活用術とポイントになる部分
 
MVC 01
MVC 01MVC 01
MVC 01
 
MVC 02
MVC 02MVC 02
MVC 02
 
1 2 neo revolution
1 2 neo revolution1 2 neo revolution
1 2 neo revolution
 
Spectroscopy Letters Volume 26 issue 3 1993 [doi 10.1080_00387019308011552] S...
Spectroscopy Letters Volume 26 issue 3 1993 [doi 10.1080_00387019308011552] S...Spectroscopy Letters Volume 26 issue 3 1993 [doi 10.1080_00387019308011552] S...
Spectroscopy Letters Volume 26 issue 3 1993 [doi 10.1080_00387019308011552] S...
 
شرح رساله افسس القس ابراهيم سعيد
شرح رساله افسس   القس ابراهيم سعيدشرح رساله افسس   القس ابراهيم سعيد
شرح رساله افسس القس ابراهيم سعيد
 
Inteligo valuation report bvn
Inteligo valuation report bvnInteligo valuation report bvn
Inteligo valuation report bvn
 
Athens
AthensAthens
Athens
 
France
FranceFrance
France
 
No hiv aids no hcv
No hiv aids no hcvNo hiv aids no hcv
No hiv aids no hcv
 
Forum
ForumForum
Forum
 
فن الحياة الناجحة أبونا متى المسكين
فن الحياة الناجحة   أبونا متى المسكينفن الحياة الناجحة   أبونا متى المسكين
فن الحياة الناجحة أبونا متى المسكين
 
Mobile Computing IEEE 2014 Projects
Mobile Computing IEEE 2014 ProjectsMobile Computing IEEE 2014 Projects
Mobile Computing IEEE 2014 Projects
 
Byzantium
ByzantiumByzantium
Byzantium
 
數位時代的直接民主可能
數位時代的直接民主可能數位時代的直接民主可能
數位時代的直接民主可能
 
INTERNET I EINES 2.0 PER FACILITAR LA TASCA DE COMANDAMENT Sessió 2
INTERNET I EINES 2.0  PER FACILITAR LA TASCA DE COMANDAMENT Sessió 2INTERNET I EINES 2.0  PER FACILITAR LA TASCA DE COMANDAMENT Sessió 2
INTERNET I EINES 2.0 PER FACILITAR LA TASCA DE COMANDAMENT Sessió 2
 
Cenário Botafogo, Lançamento Mozak, Apartamentos no Rio, 2 quartos em Botafog...
Cenário Botafogo, Lançamento Mozak, Apartamentos no Rio, 2 quartos em Botafog...Cenário Botafogo, Lançamento Mozak, Apartamentos no Rio, 2 quartos em Botafog...
Cenário Botafogo, Lançamento Mozak, Apartamentos no Rio, 2 quartos em Botafog...
 
Michel Foucault - Discipline and Punish
Michel Foucault - Discipline and PunishMichel Foucault - Discipline and Punish
Michel Foucault - Discipline and Punish
 
IoMT - Technological Environment of Personalized Medicine and New Era of Heal...
IoMT - Technological Environment of Personalized Medicine and New Era of Heal...IoMT - Technological Environment of Personalized Medicine and New Era of Heal...
IoMT - Technological Environment of Personalized Medicine and New Era of Heal...
 

Semelhante a MVCもやもや話

[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
david9142
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa
Tomoki Maeda
 
VSUGDAY2012 - ASP.NET MVC 4 Deveoper Preview による モバイルWEBアプリケーション開発
VSUGDAY2012 - ASP.NET MVC 4 Deveoper Preview による モバイルWEBアプリケーション開発VSUGDAY2012 - ASP.NET MVC 4 Deveoper Preview による モバイルWEBアプリケーション開発
VSUGDAY2012 - ASP.NET MVC 4 Deveoper Preview による モバイルWEBアプリケーション開発
tomotoshi
 

Semelhante a MVCもやもや話 (20)

iOSでMVVM入門
iOSでMVVM入門iOSでMVVM入門
iOSでMVVM入門
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 
AngularJSの高速化
AngularJSの高速化AngularJSの高速化
AngularJSの高速化
 
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
 
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa
 
WKWebViewとUIWebView
WKWebViewとUIWebViewWKWebViewとUIWebView
WKWebViewとUIWebView
 
VSUGDAY2012 - ASP.NET MVC 4 Deveoper Preview による モバイルWEBアプリケーション開発
VSUGDAY2012 - ASP.NET MVC 4 Deveoper Preview による モバイルWEBアプリケーション開発VSUGDAY2012 - ASP.NET MVC 4 Deveoper Preview による モバイルWEBアプリケーション開発
VSUGDAY2012 - ASP.NET MVC 4 Deveoper Preview による モバイルWEBアプリケーション開発
 
20120616
2012061620120616
20120616
 
try!swift必見5選
try!swift必見5選try!swift必見5選
try!swift必見5選
 
ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験
 
Swift入門
Swift入門Swift入門
Swift入門
 
Slide
SlideSlide
Slide
 
SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発! SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発!
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング
 
Mvc conf session_1_osada
Mvc conf session_1_osadaMvc conf session_1_osada
Mvc conf session_1_osada
 
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
 
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
 
MvvmCross 入門
MvvmCross 入門MvvmCross 入門
MvvmCross 入門
 
Asp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソAsp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソ
 

Mais de Tetsuya Kaneuchi (7)

いま OS X アプリがアツい
いま OS X アプリがアツいいま OS X アプリがアツい
いま OS X アプリがアツい
 
いまさら NSArray
いまさら NSArrayいまさら NSArray
いまさら NSArray
 
Dependency Injection FAQ
Dependency Injection FAQDependency Injection FAQ
Dependency Injection FAQ
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだ
 
Core Animation と View
Core Animation と ViewCore Animation と View
Core Animation と View
 
Core Data の概要と NSIncrementalStore
Core Data の概要と NSIncrementalStoreCore Data の概要と NSIncrementalStore
Core Data の概要と NSIncrementalStore
 
WebViewでエラーページを表示する話
WebViewでエラーページを表示する話WebViewでエラーページを表示する話
WebViewでエラーページを表示する話
 

Último

Último (7)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

MVCもやもや話

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n