💊

おい!なんでその処理をコントローラに書いているんだい?

2021/10/11に公開

ある日のパイセン、「データ操作の処理は、コントローラに書かないでくれよ!」

なんだって?
そしたらいったい、どこに書けというんだい?

モデル?
リポジトリ?

もっと言えばなぜ、コントローラに書いたらいけないんだい?

ファットコントローラを避けるため?
責務を分散させるため?
わからないことだらけじゃないか!

そんなふうに思っているそこのキミ。

今日はボクがとっておきのモノを紹介しよう!

ボクはこれを知って世界が変わったんだ

今まで何となくやる気がでなかったり
身体が重かったりする実装が
これを使うことですごくスッキリしてね!

なんていうか、幸福感に包まれるんだ。
生きるのが楽しくなるよ。

1度知るともうこれを知らなかった頃の実装には戻れないね。

本当にとっておきなんだ。
いいかい、ママには内緒だよ?

少し知るだけで幸せが訪れる、それがドメイン駆動開発さ

ああ、たまたまだったんだよ。

RepositryServiceという言葉は知っているし、
なんとなく役割もわかる。
なんなら使ったこともある。

そんなボクがこの本を手にとったのはね。
ドメイン駆動開発設計入門

半分くらいまでこの本を読んだボクは、
慣れ親しんだMVCフレームワークの見え方が劇的に変わったんだ!

ただ今日触れるのは、ドメイン駆動開発そのものではなく
ドメイン駆動開発の考え方を反映したとき
どんな処理をどこに書くかということだ

ドメイン駆動開発(DDD)について気になる人は
ぜひ学んでボクに教えてくれ!

Modelには、そのモデルの持つふるまいを書く

DDDにおいてのモデルとは何か、みたいな話は置いておこう。
ボクはそれを語れるほど精通しちゃいないからね!
(おっと、ちゃんとあっちの精通はしているぞ!)

例えばブログがあったとしよう。

ブログには記事、つまりArticleのようなモデルが存在するはずだろう?

Articleには、タイトルと、内容があるだろう
タイトルにいたっては、文字数制限があるかもしれないな

Articleモデル
タイトルが必ず存在する
タイトルは30文字以内である
内容が必ず存在する

これが、Articleモデルの持つふるまいだ
逆に、こういうふるまいがなければArticleじゃない!

ブログの記事に、ビールの在庫なんて項目は登録できないだろう?
登録できたらきっとそれは
ボクの家の冷蔵庫のモデルだな!

Serviceには、モデルのユースケースを書く

Articleには、作成や編集、削除といったユースケースがあるはずだ

Serviceにはそんなモデルのユースケースを書いていく

Articleサービス
記事を作成できる
記事を確認できる
記事を編集できる
記事を削除できる

ここで余談だが、DDDには
ドメインサービスとアプリケーションサービスがある
その違いは、ここで話すことではないから、ぜひ調べてみてくれ!

Repositoryには、モデルのデータの永続化・再構築を書く

ModelServiceをつくったところで
ブログはまだ、まったく使い物にはならないな!

なにせ、データの永続化(保存)・再構築(復元)ができないんだから!

今のブログはまるで、
料理のできないレストラン、ビールの飲めない人生みたいだ!

データの永続化や再構築をするときは、そのモデルのふるまいを
いれてあげないとな!

Articleリポジトリ
記事を保存できる
Articleモデル・ふるまい
記事を復元できる
記事を削除できる

そして、データの永続化・再構築ができるようになったら、
Serviceに使えるだろう!

Articleサービス
記事を作成できる
Articleリポジトリ・保存できる
記事を確認できる
Articleリポジトリ・復元できる
記事を編集できる
Articleリポジトリ・保存できる
記事を削除できる
Articleリポジトリ・削除できる

また余談になってしまうが、
ハンバーガーの間のポテトやコークだと思って楽しんでくれ!

本来なら
RepositoryにはInterfaceをつくったほうがいい
それは、依存関係逆転の原則があるからだ

残念ながら、依存関係逆転の原則や
interfaceとは何か、はここで話すことではないんだ
ハンバーガー屋でも、小麦粉そのものは売ってないんでね!

Controllerはどこへいった?

ねえママ!
Controllerをどこにやったんだい?

ちゃんとここに置いておいたのに!

そう思ったかい?

モデルのふるまいをModel
ユースケースをService
データの永続化・再構築をRepository
書くようにしたことで

Controllerには、ほとんど書くことがなくなってしまった!

しかし、それでいいんだ
Controllerはフロントと、これらのロジックとのデータの橋渡しをするだけでいい!

こう考えると、太る理由がわからないだろう?

え?ゴシップ好きのトニーがなんで太ってるかって?
彼はハンバーガーの食べすぎさ!

ドメイン駆動開発、少量でもこの高揚感!

ここまで読んでくれたキミ、ありがとう!

ボクはドメイン駆動開発の、ほんの少ししか齧っていないけれど
少量でもとてつもない高揚感に包まれているよ!

最初はあまりにもブッ飛ぶもんだから
人目につきやすいところ使うときは気をつけてくれよな!

Follow ME !!!
I'm sure to follow you back!
twitter: @marty_ojiya

Discussion