MVCモデルを用いて開発をしている際、「薄いコントローラ」や「分厚いコントローラ」という言葉をよく聞くかと思います。
薄いコントローラとはなんでしょうか?分厚いとどうなるのでしょうか?
コントローラの整理をキッチンの棚の整理に例えて説明していきます。
コントローラってどうやって書いたらいいんだっけ?
Railsの生みの親であるDHHは下記のように言っています。
コントローラが元々持っているRESTアクションやデフォルトの5つの機能にはないメソッドを付け加えたいと思ったら、いつだって新しいコントローラを作る。それだけでいいのです。
5つの機能って何?という方は、ぜひ調べてみてくださいね。
7つのアクションと言われていることの方が多いかもしれません。
7つのアクションを用いたコントローラの作成方法について少しだけ解説すると、、、
ある機能を実現すると言う役割を持ったコントローラの中に、必要に応じてindex, new, create, edit, show, updateという7つのアクションを最大一つまで配置します。
7並べと似ているかもしれません。
同じスートごとに1〜Kまでのカードを並べるのが7並べです。
ハートの列にスペードのカードを並べることはできません。
コントローラも同様で、メンバー管理機能を持つコントローラにメール受信一覧機能を持たせたアクションを含めることはできません。
(できないというより、責務が異なるのでその機能は持たせるべきではない。)
これならコントローラ内のアクションは最大7つまでとなり、いわゆる分厚いコントローラができることはないように感じます。
しかし、そう上手くはいきません。
システムが大きくなればなるほど色々な機能を追加したくなり、それに応じてコントローラに追加したいアクションも増えていくのです。
コントローラが分厚くなっていく原因
例えば、 InboxController があって、メールの受信ボックス内にあるものを全部表示する index があるとします。もしかすると、別のアクションも入れるかもしれません。例えば、「未送信メールとかも見られた方がいいな。未送信もindexに表示させるか何かしよう」と思うかもしれませんね。そうしたら pendings というアクションを追加します。
このように、7つのアクションに該当しないアクションを追加してしまいたくなる時があります。
(上記の例で言うとpendingsアクション)
しかし、そこでアクションを追加するのではなく、PendingsControllerを追加すればいいのです。
PendingsController内にpendingsアクションを追加すれば、InboxControllerを太らせることなく未送信メール一覧機能の実装ができます。
実はこの現象は身近な場所でも起きています。
整理されないと肥大化するのはコントローラだけじゃない
あなたは友人のキッチンで料理を振る舞うことになりました。
友人宅にある材料がわからなかったので、一旦食材の確認をすることになりました。
カレーを作ろうかななどと考えながらキッチンの棚を開けてみると、、、
そこには整理されておらず、どこに何があるのかわからないギチギチの棚が存在していました。
一応ざっくりと食べ物とそれ以外で分かれているようです。
友人曰く、「食べ物だけ分けておけば大丈夫っしょ」とのことです。
そんなわけありません。
調味料や保存食品たちに埋もれた野菜が腐っていく様が目に浮かびます。
こんな無秩序な棚だとどんどん汚れていってしまうことが容易に想像できますよね?
このような現象は割れ窓理論と呼ばれ、ひとつの無秩序を放置すると全体が無秩序になっていってしまうのです。
たった一つのpendingsアクションを許容してしまうと、そこからどんどんとアクションが増えて大きなコントローラになってしまうかもしれません。
「割れ窓理論」とは、アメリカの犯罪学者ジョージ・ケリング博士により提唱されたもので、1枚の割れた窓ガラスを放置すると、割られる窓ガラスが増え、その建物全体が荒廃し、いずれ街全体が荒れてしまうという理論です。
散らかったコントローラを整理しよう
先程登場した無秩序な棚を整理してみました。
食べ物は「保存食系」「調味料」「野菜」「お菓子」に分け、その他は「調理器具」「お皿」「カトラリー」に分けました。
このように目的ごとに分類して収納することで、料理や盛り付けをするときに最短時間でものを探して手に取ることができます。
また、調理を開始する前に調味料棚を確認することで、足りない調味料がある場合はそのことにすぐに気付くことができます。
コントローラも目的ごとに細かく分類することで、より使いやすくなります。
どのコントローラがどの責務を担っているのかが明確になり、コントローラに手を加えて分厚くしてしまう事故を減らせます。
また、自分が作ったコントローラを他の誰かが保守を行う時にも、キッチンと同様に整理されていた方が作業時間を短縮することができます。
まとめ
分厚いコントローラとは、本来は負うべきでない責務を負ってアクションの数が増えすぎてしまったコントローラのこと。
整理されていない他人のキッチンで料理をするような大変さが、分厚いコントローラの保守を行う際に生じてしまう。
何でもかんでも詰め込んでしまうと良くないのは、キッチンの棚もコントローラも一緒だと言うことですね。