クリーンアーキテクチャというものを考えてみる。
シンプルなWebアプリケーションを考えると、View(表示)とModel(表示する情報)はまず必要になる。
ブログで考えるとModel(表示する情報)は記事のタイトルや本文、ユーザー名に公開日など。
ブログには記事の更新や新規作成などの機能も必要になる。
では実装をどこに書くかということなんだけど、普通に考えればViewには書かない。
当然Modelの方に新規作成(Create)や更新(Update)、削除(Delete)などのメソッドを追加すると思う。
View自身にModel(表示する情報)を操作するロジックを書くとゴチャゴチャしそうなのは初心者でもなんとなくわかると思う。
表示する情報を持っているのはModelなんだからそっちにロジックを書いた方がいい。
ユーザーが記事を更新して保存ボタンを押す。このイベントをトリガーに更新(Update) の処理が行いModel(表示する情報)を変更する。
そして変更されたModelをViewに反映するという流れになる。
モダンなJavaScriptフレームワーク(React, Angular, Vue)には双方向バインディング(MVVMパターン)の仕組みがあるのでViewとModelの同期を意識する必要はない。
このままだと書いた記事はアプリを閉じたら消えてしまう。ファイルやデータベースに保存する必要がある。
ではこれをどこに書くか?当然ViewではなくModelに書くことになる。
単純に考えるとファイルやデータベースに読み書きするメソッドを追加して、それを更新や削除のときに呼び出せばいい。
でもこれだとModelがちょっとゴチャゴチャしてきた気がする。
Modelは表示する情報を扱うところ。ファイルに書き込んだり、データベースとの橋渡しは専門性が違う。別の人にやってもらった方がいい。
なのでファイルを扱うクラスとデータベースとの橋渡しをするクラスを別に作って、それをModelが扱うように変更する。
こうすればModelはどこにデータがあるかを気にする必要はなくなる。ファイルやデータベースの担当者に「このデータを取ってきて」、「これを保存しておいて」とお願いするだけで済む。
この辺はクラスの継承や委譲の話になる。
ここまでを一旦まとめるとViewとModelがあって、さらにModelは表示する情報とファイルやデータベースを担当するクラスを持っている。
ここからクリーンアーキテクチャの話。
Viewは単純に一番外側のFrameworks & Drivers。
記事のタイトルや本文、ユーザー名に公開日などは一番内側のEnterprise Business Rules。
ファイルやデータベースを担当するクラスはInterface Adapters。
ModelはApplication Business Rulesでいいと思う。
一番大きな違いはPresenterがないこと。Presenterは表示するためのデータ加工が主な役割になる。
今回のように扱う情報が単純な場合はあまりPresenterの必要性を感じない。
例えば日本語を英語に翻訳して表示するといったような仕組みを作る場合はPresenterで実装した方がスマートになるだろう。
クリーンアーキテクチャについて考えてみたけど、小さな単純なシステムに全てを適用すると冗長になりそうだ。
大切なのは誰がどこで何をするべきかということを常に考えながら開発することかな。
そして開発の規模に合ったアーキテクチャを採用することが重要だと思う。
基本的に必要なものはそれが必要になったときに考えればいい。シンプルであるに越したことはないと思う。
<参考サイト>
実装クリーンアーキテクチャ【Qiita】
鵜呑みにしないで! —— 書籍『クリーンアーキテクチャ』所感【Kabuku Developers Blog】
クリーンアーキテクチャ(The Clean Architecture翻訳)【blog.tai2.net】
継承と委譲の使い分けと、インターフェースの重要性について【ikenox.info】