LoginSignup
24
22

More than 5 years have passed since last update.

AppDelegateはダイエットしましょう

Last updated at Posted at 2016-03-03

自分が他人のソースを解析した時に
たまに画面を叩き割りたくなるパターンのひとつが

「AppDelegateがでかすぎる」

です

AppDelegateは、Xcodeで新規でプロジェクトを立ち上げると、既に作られているものですから
どんなプロジェクトにも必ずと言っていいほどあるクラスです

責務はその名のとおり、アプリケーション全体の主たるイベントをハンドルして
その委譲を受け付けるクラスです

しかしながら、

これが数千行にわたって実装が書かれていることがあります
そんなプロジェクトを何度も見てきました
おそらくアプリ共通の処理はすべて載せとけーてな感じでそんなことになるのでしょう

(-_-) ooO (正直言うと開発初心者の頃の自分もそんな感じだったかも・・・)

これを「Fat AppDelegate」アンチパターンと名づけておきます
許しがたきアンチパターンといえます
もし自分の作ってるアプリがそんなことになっていれば猛省しましょう

では、こんな「太ったAppDelegate」をどうやってダイエットさせましょう?

たとえば

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // 起動時何かさせたーい

        // プッシュ通知から呼ばれたら何かしたーい

        // データを初期化したーい

        // 初回起動かどうかを判定して、何かしたーい

        // データベースを初期化したーい

        // ベンチマーク取りたーい

        // 最初の画面のUIを切り替えたーい

        // 他にも何かしたーい

        // エトセトラ・・・エトセトラ・・・

        return true
    }
}

didFinishLaunchingWithOptionsのメソッドは大混雑です
下手すりゃ、ここにそのすべてを書いてる人もいます

しかしこれでは、メソッドの責務が巨大すぎます
起動時になにかやりたいのはやまやまですが
上記にコメントしたすべてを根こそぎ別々のクラスでやりましょう

AppDelegateの役割は
「アプリのイベントを受け取ること」と
「そのイベントを受けて各クラスに連絡すること」だけに注力させる

そんな設計にすることで
このクラス自体はだいぶすっきりします

「いろいろな処理をやらないといかんのです」という要件であっても
NSNotificationの仕組みを使うなどの工夫で
少なくとも100行を超えたファイルにはならないはずです

軽く100行越えてたら、
ダイエットの余地ありです

24
22
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
22