moxt

Just another Blog site

iOSアプリの設計ってどうやるの?

      2015/07/03

ViewControllerに処理を詰め込みすぎて保守が大変になるのはあるあるネタですよね。
じゃあ、ViewControllerでやることってなんだろうって問われると、まあ、こんなんだろうなってフワッとしてる。
文字に書くことで境界線を引いてみたい。

ViewControllerって何するの?

  • Viewの更新
  • Modelに何かしらの処理を依頼
  • Modelの処理した結果を受け取る
  • Viewに関するイベントを受け取る
  • ハードウェア的なイベントを受け取る

Modelの処理はViewControllerに書くとやばそう

と、いうのは情弱な私でも身にしみてる。

上のスライドで言うところのログインなどの認証周りの処理をViewControllerにベタっと書くと、他の画面でその同じ処理したいときにコードをコピペするか元ViewControllerのメソッドを呼んじゃう!みたいな危険な依存を生むナニカができそうですよね。

なのでModelは
* 独自のクラスに処理を集約する
* UIに関する処理は一切混ぜない

って感じでしょうか。

『集約するのが良いから!』と言って何でもかんでも1つのModelに詰め込むと、それはそれでヤバいので機能や関心ごとにクラスを分割してやると良さそうですよね。

UIに関する処理とModelな処理が混在してると、1つのメソッド内で完結できて良かったのに。。同期的な処理ならともかく、APIを叩くみたいな非同期な処理の場合とか、分けちゃったらどうやってUI更新したらいいんだ。

delegateかNotificationを使うんですかね。
ここの使い分けがイマイチ分かってないですが、いずれかを使えばModelの更新メッセージをViewControllerで受け取ることができます。

APIを叩いて結果を受け取ったらdelegate○○に結果のオブジェクトを渡してコールする。
みたいな。

1つの画面で複数のAPIを叩くような場合はどうすんだろ

大量のdelegateがViewControllerを覆い尽くすことは容易に想像できますよね。。
ViewControllerが調整役とは言えどもなんかアレな気がします。
こういう場合は、各関心ごとにコンポーネント的な子ViewControllerを作って、その中で完結させる感じすかねー。

子ViewController側でModelを叩いた結果が、親ViewControllerにも影響ある場合

子ViewControllerからメッセージを受けるか、ModelからNotificationを飛ばしてもらう感じなんかな。謎。

delegateの問題点?

ViewやModel、端末からのイベントを検知を検知する→何かしら更新する
これがViewControllerの役割。
なので、1つのViewControllerで取り扱うイベントの種類が増えたらその分リスナーは増える。

複数のTextViewを1枚のViewControllerで扱うとする。
delegateを使えば1つのリスナーに「○○(←ある任意のTextView)のテキストが更新されたよ」という情報が返ってくる。
リスナーの中にTextViewがAだった場合はこの処理で、TextViewがBだった場合はそっちの処理で、、、って書くことになる。

なんかヤバそうだよね。。

ViewController側は『switchで分岐』まではやるけど、その先の各TextViewの更新は別のクラスに委譲するのがいいのだろうか。

BlocksKitは?

delegateで起こる↑のような分岐処理の煩雑さを解消してくれそう。
ただ、各TextViewに対してクロージャ的なナニカをくっ付けるので、無邪気にやってるとViewControllerが肥大化しそう。

認識

雑多な処理は子ViewControllerに集約(ここの中でBlocksKitを使うのはアリな気がする)して、子ViewController間をまたぐような処理は親ViewControllerが取り持ってやるのが良さそう?

 - プログラミング

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

  関連記事

Ruby,Railsのチートシート

こういうのブログ形式じゃなくてwikiの方が良いのでは。。 と、遠い目をしつつ。 …

no image
RDSの特定のデータベースをダンプする

Publicly Accessibleがyesならどこからでも下記が実行可能。 …

no image
DockerでNginxしたい

Contents1 Dockerfileを用意する2 …

no image
GrowthPushのAndroid-SDK(?)のコードを読んでみる

できること、できないことを知るために。 GrowthPush.java …

no image
意識低いRuby on Rails再入門4

下記の内容を読んでテスト系の処理をすっ飛ばしたメモ。 http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#top …

no image
YosemiteでRubyMineが起動できない

yosemiteからjavaが1.7系になってる。 一方、rubymineは1.6系を想定している。 …

no image
AndroidのHandlerって何?

Handlerは何?と、Handlerを直視するとHandlerの存在意義というかなんというか文脈を捉えることが難しい。 なので、まずはAndroidがシングルスレッドである、という所からスタートしてHandlerに向かってゆく。 …

no image
SwiftでOSのバージョンが8.0.0以下とそれより大きいヤツで処理を分岐させたい

前置き push通知のデバイストークン取得方法がiOS8から変わりました。 …

no image
開発で詰まったときにググるキーワード

そもそも公式サイトやソースコード、テストコード、githubなどのissueを読む 基本的には1ヶ月から1年以内の回答しか見ないようにする …

no image
Androidアプリを実機デバッグしたいのにNo debuggable applicationsと表示される時の対処例

Tools > …