iPhoneアプリ作成までの道のり6

6. Cocoaの設計思想を理解する

簡単なサンプルアプリを作ることに慣れてきたら、ここでまたオブジェクト指向の勉強の時間だ。この段階では以前のような概論ではなく、より具体的な設計手法を学ぶこととする。まずはSmalltalk時代からの伝統的なMVCに対する理解が必要だ。オブジェクト指向の入門的な話と同様、MVCについてもネット上に丁寧な解説がたくさんあるので、個々が分かりやすいと思うサイトを参考にすれば良いと思う。一番良いのは、実際にSmalltalkについて書かれた書籍で学ぶことであろうが、それには時間がかかるだろうし、私も読んだことはない。差し当たっては、wikiなどの短い説明でも十分であろう。

MVCの目的については、何も難しいことはない。データと画面をコントローラーでつないで、できる限りそれぞれを疎結合にしましょうというだけの話だ。ただ、実際に理解を深めるためには、もう少し別の勉強も付け加えなければならない。

そこで登場するのがデザインパターンだ。デザインパターンについては、まともに習得しようとしたら、それだけで数ヶ月かかってしまう。まず、入門としては、「デザインパターンとは何か」をそれなりに理解した上で、「どんなパターンがあるのか」を一通り理解すべきだ。はてなダイアリーの人で、短く、うまくまとめてくれている人がいる。こちらの記事がお勧めだ。

これはあくまで個人的にだが、Factory Methodの理解を最優先にすべきだと考えている。前にオブジェクト指向の話をしたときに、ポリモーフィズムの理解が難しいだろうという話をしたが、Factory Methodを理解すれば、その有用性は明確に体感できるようになるだろう。

本章の話を先に進めるためには、少なくとも、Composite, Strategy, Observerパターンを理解する必要がある。
以下、AppleチュートリアルObjective-Cプログラミングの概念」より引用。

  • Composite:アプリケーションのビューオブジェクトは、実際には入れ子になったビューの複合体(composite)であり、このビュー群が協調して(ビュー階層の形で)動作します。この表示コ ンポーネントは、ウインドウを頂点とし、その下にテーブルビューなどの複合ビュー、さらにその下にはボタンなどの分割できないビューがあります。ユーザ入力や画面表示の処理は、複合体を構成するどのレベルでも可能です。

  • Strategy:コントローラオブジェクトは、いくつかのビューオブジェクトに対する戦略(strategy) を実装しています。ビューオブジェクトの機能は(視覚的)表示に関わる範囲に限定し、インターフェイスの振る舞いが当該アプリケーションにおいてはどのような意味を持つか、の判断はすべてコントローラに委譲します。

  • Observer:モデルオブジェクトは、自分自身と直接的な関わり合いがあるオブジェクト(一般にビューオブジェクト)の状態が変化すると、その通知を受け取ります。
  • この伝統的なMVCは、実際にCocoaにおけるGUI構築で十分通用する。その場合はKVOというアーキテクチャを使うことになるだろう。KVOについてはまた後の章で補足する。

    上記のMVCにおいてはViewをModelのObserverとして登録することになる。部品の再利用性の観点からすると、ViewとModel間に直接的な関係があるのはあまり望ましくない*1Cocoaでは複合パターンとしてのMVCを推奨している。この複合パターンを理解するには、追加のデザインパターンとして、MediatorとCommandパターンを理解する必要がある。Cocoaの複合パターンとしてのMVCでは、ControllerがMediatorとStrategyを包含して、ViewはアクションをCommandとしてControllerに通知する。ModelからControllerへの通知が必要な場合には、ControllerがModelのObserverになる。これにより、View-Model間は完全に疎結合になる。ただし、これだけではControllerの負荷が増えて、View-Controller間とModel-Controller間が密接になりすぎてしまう。そこでCocoaでは、Controllerを「仲介型」と「調整型」の2種類にわけている。調整型Controllerは仲介型Controllerを所有し、その名の通り、全体の調整役としてMVC内のあらゆるクラスに依存する。その代わりに、仲介型Controller, Model, Viewはすべて疎結合になる。ただし、一部のViewと仲介型Controllerは、Modelへの依存がどうしても避けられない場合はある。MVCの中で最も重要なこととして、最低でもModelが、他のModel以外の役者に依存することだけは避けなければならない。

    より詳しい内容については、Appleの公式ドキュメント「Objective-Cプログラミングの概念」を参考されたし。


    --

    *1:とは言っても、KVOにおけるViewとModelの結びつきというのは、僅かなものである。