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

  関連記事

images
Chef::Exceptions::ChecksumMismatch:というエラーの対処

今頃になってChefの話。 チェックサムの形式をミスってる可能性がある。 …

no image
Swiftで追加したサードパーティなモジュールを更新する方法

SwiftにはCocoaPodsのようなライブラリを管理するツールがないので、手で追加します。 手で追加したライブラリのバージョンを更新したいときどうすればよいか。 …

images
scrapy実行時のエラー対処

Macで発生した。 scrapyを実行したら下記のようなエラーを吐いた。 …

no image
ファイルとかのパーミッションを再帰的に変更したい

あるディレクトリ以下全ファイルのパーミッションを再帰的に変更 chmod …

no image
Macでdocker系のコマンドが使えなくなったら確認すること

OSXではdockerは使えないため、別にVMを立ち上げ、そこでdockerを動かしてる。 macからdockerコマンドを使うためにboot2dockerというコマンドを使う。 …

logo_og
ReactNativeでGiphyのデータを表示する

まずは下記をサクッとパクってみる。 当方、比較的AndroiderなのでAndroidで。 …

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

Tools > …

300px-Ruby_logo
Ruby,Railsのチートシート

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

logo_og
ReactなComponent同士を連携させたい

実践的なサンプルに塗れてなんとなく使ってると破綻する。 分かってること、分かってないことを整理しておきたい。 …

no image
『Tutorial & Hackathon #1』をやってみる

https://pydata.tokyo/news/pydata.tokyo-tutorial-hackathon-1 タイタニックの乗客データから生存者の推定モデルを作成してる。 …