MVCをX-Codeに当てはめてみる

iPhoneで新規プロジェクトを作ったときは、とりあえずControllerが作成される。
そう、これは、MVCアーキテクチャで作れとのことである。

MVCモデルとは?

  • Model:データの格納
  • View:画面レイアウトと表示
  • Controller:データと表示のコントロール

の処理系統を3つに分類して考えるやりかたの事だ。

Objective-Cでの実装

まずは、クラス図です。

プロジェクトをViewBaseで作成した場合は、mainと、mainのDelegateと、Controllerが作成された状態で始まる。
mainとDelegateはControllerを作成するために必要なものであり、最初は無視しても問題ない。
Controllerには同じ名前のxibファイルがある。これがViewです。
xibは起動時に自動的に読み込まれるので、何もせずともビルドをすれば、このViewが表示される。
ただし、このままではViewにCoreGraphicsを使った描画が行えないので、使いたい場合は独自にViewを作成する必要がある。
[Action]->[追加]->[新規ファイル]->Objective-C class](UIView)とすれば、作成出来る。
Modelは自分で作成する必要がある。
[Action]->[追加]->[新規ファイル]->[Objective-C class](NSObject)とすれば、作成出来る。
各オブジェクトのつなげ方は、上図の通りだが解説を行うと、Controllerのヘッダー(.h)にViewとModelを保持できるように、ポインタを宣言。同時にsetter、gatterを自動生成してもらうために、ヘッダー(.h)に@propertyを宣言、メソッド(.m)に@synthesizeを宣言。同様にViewのヘッダー(.h)にModelのポインタ、@propertyを宣言、メソッド(.m)に@synthesizeを宣言。
ControllerのviewDidLoadでModelの作成、Viewを作成&addView&Model参照をする。
このようにする事で、ControllerとViewからModelを参照する事ができ、必要な操作が行えるようになる。
ビジネスロジックをControllerに組み込むか、Modelに組み込むかは意見が分かれる所だが、Model単体で必要なロジックはModelに組み込み、複数のModelを操作する場合は、ControllerとModelの間に中間層のControllerを置くと作成しやすくなる。

Inkscapeでのエラー回避

Mac(OSX 10.6 Snow Leopard)でInkscape 0.47使い始めて、日本語表示ができるようになった後、テキスト入力をするとエラー吐いて落ちていたのだけど、解決したので、備忘録として書いておく。

概要としては、GDKの新しい機能を使用すると問題が起きて落ちているようです。
回避するためには、ターミナルからviエディタでInkscapeの設定ファイルを開いて、機能を無効化すれば解決。

まずは、アプリケーションの中のユーテリィティからターミナルをみつけて開いてください。(アイコンは黒い四角です。)
VIで設定ファイルを開く。
vi /Applications/Inkscape.app/Contents/Resources/bin/inkscape

次の行を追記。
export GDK_NATIVE_WINDOWS=1

ちなみに、日本語化は同じファイルのexport LANGを以下の行で上書き。
export LANG="ja_JP.UTF-8"

開発の進め方

私が個人的なアプリを開発するときの流れを書き留めて置きます。
大規模なプロジェクトに比べ、行程を少なくし、小回りが利くようにしています。
大枠は以下の通りです。

  1. 現状分析、要求定義
  2. 技術調査、設計
  3. 製造、テスト、運用

現状分析、要求定義

  • 日頃から欲しい機能やひらめき、現状の不満点などを手帳に書き、アイデアの種を残す。
  • 現在時点で類似品、代替品が作成されていないかを調べる。
  • アプリの目的を明確にする。
  • 欲しい機能の洗い出し。

技術調査、設計

  • 機能が技術的に実現できるかの調査。
  • プラットフォームの決定。
  • 機能ごとのユーザインターフェース設計
  • データベース設計。

製造、テスト、運用

  • 機能ごとに製造とテストを繰り返し、少しずつ製品に近づける。
  • 最終的に全体を見回してバグを修正する。

別アプリの起動。

セキュリティの保護のために、アプリケーション自身のフォルダ以外は参照することができないフレームワークになっている。iPhoneのアプリは他のアプリの領域を認知できない。
しかし、RSSリーダーなどのアプリではsafariを起動したい場合がある。こちらは別の方法で起動が行えるようになっており、それが、カスタムURLというものである。
これは各アプリの設定で、カスタムURLを設定しておき、別アプリから起動するときはこのカスタムURLにアクセスするだけでよいというものだ。例えば、safariのカスタムURLは"http"であるので、

NSURL *myURL = [NSURL URLWithString:@"http://"];
[ [UIApplication sharedApplication] openURL:myURL];

とすれば、safariが起動できる。デフォルトのMapのカスタムURLは"map"なので、httpをmapに変えると、Mapが開いてくれる。
ただし、先に紹介した制限事項があるので、アプリケーション自身が他のアプリケーションのカスタムURLを調べることはできない。このため、アプリ作成時に既にカスタムURLを知っている必要がある。

BetterTouchToolのすすめ。

今、iMacを買うとマジックマウス(Magic Mouse)がついてくる。
一見した所、ホイールもなければ、ボタンもない変なやつだが、使ってみるとiPhoneのタッチパネルの感触でマウスホイールが行え、とても使いやすい。
しかし、問題が無い訳ではない。
まず、マウスの速度が遅すぎる。そして、最近の6ボタンマウスなどに比べると、ショートカットが少なすぎるのだ。
これを解消するのが、フリーソフトの『BetterTouchTool』(http://blog.boastr.net/)である。
これを入れたとたんに、マウスの速度の改善ができ、さらにシングルタップや3本指スワイプなどのジェスチャーに対応することができる。他にも沢山の設定が行えるが、私はまだ使いこなせていない。
インストールも簡単で、ダウンロードした後に、アプリケーションに放り込んで起動すれば終わりである。起動後は画面の右上(時計の並び)に常駐する。これをクリックし、「Preference」を選び設定を行う。
現在は開発版が頻繁に更新されているので、今後の動向にも注目したい。

デリゲートとプロトコル

iPhoneフレームワークにはデリゲートが使用されている。関連の深いプロトコルとともに解説を行う。

デリゲート

デリゲートとは、あるメソッドを別のメソッドで実装する手段である。
controllerからItemをインスタンス化し、処理をdelegateクラスのメソッドに実装した例を示す。

Itemクラスのmethod1はdelegate先のメソッドを呼び出すように実装されている。
メソッドの実装をItem自身に持たせないことで、delegateクラスを変えることで途中でmethod1の実装を変えることができる。
extend(継承)でMethod1を実装した時に比べた場合、プログラム内で実装を変えることができる面で優れていると言える。

iPhoneフレームワークでのデリゲートの使われ方

iPhoneフレームワークでは、イベント処理で使用されている。(C#VC++/CLIと同じ)
Itemクラスのdelegate先をcontrollerクラス自信(self)にすることで、一度しか使用されないボタンクラスを複数クラスに分けることなく実装することができ、ソースの可読性を高めている。

プロトコル

メソッドが実装されることを約束するものである。(JavaC#のinterfaceと同じ)
例でいえば、Itemクラスがdelegate先のメソッドで実装されていて欲しいメソッドが宣言されており、delegate先であるcontrollerクラスはmethod1を実装しなければならない。(プロトコル内で@optionとなっているものは、実装しないでも問題ない。)

同じItemに違うメソッド

上記だけでは一つの画面内に2つ以上の違う動作をするItemをおけないように見えるが、異なる名前のメソッドを用意しておき、InterfaceBuilderで関連をしていすれば、違うメソッドを呼び出すことができる。同じ引数と返り値であれば、違う名前のメソッドを呼ぶことができるのがデリゲートのよい所である。

apple storeに不満を持つ。

iPhoneのアプリをDownloadするためには、apple storeを使用するしかないのだが、各カテゴリごとに有料/無料がそれぞれ評価の高い順に並んでいるだけであり、検索機能としては全文検索があるだけで、使いたいジャンルの一覧や、面白いソフトを見つけるには向いていない。
それを打開するためか、アプリのレビューサイトもあるが、サイトの一人だけが評価しているので、全く当てにならない評価が乗っているだけで、使い物にならない。
私はこの現状には満足できない。みんなそうは思わないか?
正当な評価を全員でつけられるシステムの作成が早急に作成されることが望まれるが、誰か作らないかな。待っているより、作ってしまった方が早いのだろうか。まだ、SDKの勉強中なので時間はかかるが、作成するべきアプリとして書き留めておこう。