ViewController間のインタラクション

ViewControllerを書いていると、ViewControllerが別のViewControllerを使いたくなることがあります。ViewControllerが別のControllerを使うみたいな感じ。これは果たして良いことだろうか?

例えば、認証のために用意したAuthControllerとアプリ起動時に表示するスプラッシュ画面を制御するSplashControlllerがある場合を考えてみる。 このSplashPageでの仕様は、認証のチェックを行い認証済みであればホーム画面へ遷移させ、そうでなければ、ログイン画面へ遷移させるというものだ。

Controllerが別のコントローラーを所持することを許可する場合、次のようなクラス図が書ける。

SplashPage

SplashController

+ SplashStatus status

+ AuthController controller

- void onInit()

«emun»

SplashStatus

Display

NotLogin

Login

AuthController

+ bool checkAuth()

この方法でも十分な場合もあるが、このコードはSplashControllerがAuthControllerに依存している。 認証の場合は、認証とスプラッシュの関係はそこまで変更されることが多いわけではないので、この設計でも問題ないかもしれない。

しかし、一般的にあるControllerがないと他のControllerが使えないという構造は問題になることが多い。 Controller数が3、4と増えていくにつれて、コードが複雑化していく。 なるべく、それぞれのControllerが依存関係なしに独立して存在できる方が好ましい。

今回のケースで言うと、SplashControllerはSplashStatusの状態の変化とその通知の役割のみに徹する方が良いだろう。