これがわからない理由
恐らくあなたは
- コントローラが依存しているHTTPの世界の要素についての理解
- 「疎結合にする」という目
のどちらかを持っていないと想像できる。
簡単な解説
コントローラについて
コントローラはHTTPの仕様に依存したものが入っている。例えば下記のようなものだ。
- リクエスト(GET引数やPOST引数、Header、etc...)
- レスポンス(WEB用のHTMLの描画、リダイレクト、etc...)
- セッション
つまり、コントローラは「このシステムがWEB用のシステムである」という事実に立脚している。
疎結合について
システムには変更がつきものだ。だからなるべく変更しやすさを残しておく設計が望ましい。例えば
- 今までPC用のViewしか無かったが、これからはケータイ用のViewも必要になる。
- これまで人が画面側で入力していた値があったが、これからはその取得がセッションからも行われるようになる。
などなど、他にも色々可能性がある。
そういった時に「システムの重要な処理」と「そうでもない処理」が分かれていることは重要な要素だ。「ここを触ってもシステムが根底から壊れることはない」という部分なら思い切った変更もできる。
そして、モデルで行われるロジックの実行はシステムの根底を形作る重要な部分だ。なるべく些細な変更の影響を受けないことが望ましい。
最もドラスティックな変更は「今まではWEBのシステムに乗っけていたけれど、これからはWEBではなくなります。」というような変更で、その場合はこれまで使っていたコントローラを全て捨てることになる。それでもモデルだけはそのまま再利用できるのが望ましい。
どうしたら良いのか
- モデルは「もしもこのシステムがWEBじゃなかったら」と考えた時でも変更が発生しない場所。
- コントローラは「WEBであるから必要な要素」が入っている。
と考えると解りやすい。そして「出来る限りモデルへ寄せる」。モデルはコントローラの処理に比べて再利用性が高くなる(HTTPや外部への依存性が低くなる傾向が強いから)ので、できるだけモデルへ寄せると将来の変更に対して柔軟なシステムになる。
ひと昔前だと
ここに「モデルのテストしやすさ」の話を絡めるのだが、最近はコントローラレベルのテストもかなりやりやすいと思うので、あえて話題にはしなかった。人によってはこの話のほうが響く場合もあるだろう。
おしまいに
脊髄反射で書いているのでなんか抜け漏れとか、心余り過ぎて言葉足らずとかあるかも知れないけど笑って許してちょーだい。