読者です 読者をやめる 読者になる 読者になる

ナカザンドットネット

Android Developer's memo

Android開発におけるMVC

Android Programming 雑想 Java

まずは一言。
卒研しろ、俺。


ということで、こんなん書いてて良い時期じゃなくなってきましたが、書かないと忘れそうなので今の内に。


今回は、AndroidにおけるMVCアーキテクチャについてのお話です。
実は自分、半年くらい前に大学の授業でMVCについては学んでいたのです。iPhone開発で。
ただ、卒研でAndroidアプリを作り始めたら、どうやってMVCを構成したらいいか分からなくなってしまった。
で、本格的にアプリ制作に着手してから3ヶ月、ようやく自分なりにAndroidMVCを実現する方法が掴めたので、ほぼ自分用の覚書として書き留めておきます。
※大学生の与太話みたいなもんなので、鵜呑みにはしないでね!

AndroidでのModel

「内部処理のみを行う、多くのサブクラス」がModelにあたると思われます。
加速度やGPSなどのセンサーイベントを処理したり、データベースの操作などを行います。
また、大抵の場合java.*に属するメソッドはModelでしか利用されない気がします。
M→V→Cの順に記事書いてるから最初に来ちゃったけど、ViewとController以外のクラスって言った方が良いのかもしれない。

AndroidでのView

android.view、android.widgetandroid.graphicsによるクラス・メソッド、それからeclipseで言うところの/res/layout/以下のレイアウト用XMLファイルなんかが主になって定義されます。
特に画面作成で猛威を振るうのが、レイアウト用XML。大規模なアニメーション(レーシングとかね)を必要としないアプリ(ギターとか)であれば、XMLだけで画面の描画はほとんど全てできてしまいます。
ただ、画面描画、ボタン配置などを司る部分ではありますが、現状ではGUIでレイアウト配置を行うための実用的な手段がありません。*1
XMLを使わずとも、Layout系クラスを使ってController側から新規に構成することも可能だったりします。

AndroidでのController

Activity系やService系クラス、android.os.Handlerあたりが主になって定義されます。
Controllerの役割として「Viewへの書き換えを依頼する」ことがありますが、Handlerクラスではこれが顕著になっていて、スレッドを用いて描画処理をする際には「スレッドにHandlerを噛ませないと描画処理が成立しない」という仕組みになっています。
この辺はadamrockerさんのエントリが詳しいので、興味のある方はどうぞ。
ActivityやServiceは皆様ご存じ、影に日向にModelやViewへガンガン指示を飛ばしまくる司令塔です。

MVCの目安?

僕なりのMVCの解釈はこんな感じになりました。
MVCになるように色々とやりかたを模索してみた結果……ではなく、卒研アプリをリファクタリングしていったら自然にこうなったというお話。
AndroidMVCが実現できているかどうかの目安として正しいのか分かりませんが、卒研アプリを眺めていて気がついたのが、Model View Controllerの各クラスでのimportの内容が

Model java.*やandroid.hardware.*やandroid.location.*
View android.view.*やandroid.graphics.*
Controller android.app.*とか


と、こんな感じで偏っているんですね。
もちろん、例外的に色んなimportはしてますし、僕のアプリも必ずしも綺麗なMVCになっているわけでもないのですが。

まとめ

何ヶ月か悩まされた「Android上のMVC」に、自分なりの一段落が付けられたので、ひとまず駄文に落としこんでみました。
たぶん認識が甘い部分や間違っている部分がたくさんあると思うので、そのうち改訂版とか書くと思います。


……書くのかなあ。

補足

日本Androidの会の勉強会で豆蔵の人がAndroid×MVCについて喋ってました。


AndroidMVCアプリケーションアーキテクチャ
http://android.siprop.org/index.php?%CA%D9%B6%AF%B2%F1%2F%C2%E8%C8%AC%B2%F3


なるほど、インテントと絡めるとMVCの威力が更に上がるんですね。
流石に本格的なデベロッパーさんは素晴らしい……。

*1:DroidDrawは実用レベルとは言い難い。