59
35

More than 1 year has passed since last update.

クリーンアーキテクチャの Presenter が分かりにくいのは MVC 2 じゃないから

Last updated at Posted at 2019-09-16

クリーンアーキテクチャの謎

クリーンアーキテクチャには、具体的なクラス構成例を示す以下の図があります。

cleanarchitecture.jpeg

この図の中で、Presenter と Output Boundary (Presenter のインターフェース) だけ具体実装をイメージするのが非常に難しいと思います。

実践クリーンアーキテクチャ」というブログ記事では、Presenter について

これに敢えて触れなかった理由は MVC フレームワークとの相性が悪いからです。

と書かいた上で、MVC フレームワークとの共存方法に触れられています。

このように MVC フレームワークにおいて Presenter・Output Boundary の扱いが難しい理由を説明します。

結論

Web の MVC フレームワークで上図の通り実装できないのは、Web の MVC フレームワークが MVC 2 に基づいているのに対し、クリーンアーキテクチャの図は旧来の MVC (以後 MVC 1) に基づいているから。

Web フレームワークの場合は例えば以下のようになる。

presenter.png

そもそも MVC は 2 種類ある

MVC という言葉をちゃんと調べると、最初は非常に混乱します。

例えば Wikipedia の Model View Controller の頁には以下の図と説明が書いてあります。

200px-MVC-Process.svg.png
データの変更をビューに通知するのもモデルの責任である(モデルの変更を通知するのにObserver パターンが用いられることもある)

しかし、Web 開発で馴染みのある MVC では、Model の変更を View に通知するような処理はありません。

実は、Wikipedia で書かれているような MVC は旧来の GUI 用の MVC 1 であり、Web フレームワークで使われるのは Web 用の MVC 2 なのです。

MVC 1 では、Model から View に変更を通知します。Web で実現しようとすると WebSocket などを使うことになります。
MVC 2 では、Controller が Model の変更を View に反映します。Web の MVC フレームワークにおいて、Controller の最後で View にフォワードするあれです。

MVC 1 と MVC 2 についての詳細な説明は以下の記事を参照ください。

クリーンアーキテクチャのクラス図は MVC 1

クリーンアーキテクチャのクラス構成例の図をもう一度見てみると ...

cleanarchitecture.jpeg

Controller から Presenter や View に依存の線が引かれていません。
これは、この図が MVC 2 ではなく MVC 1 に基づいていることを意味します。

MVC 1 を使うのであれば上図のような構成を実現可能であり、その際にアプリケーション層がプレゼンテーション層に依存しないよう、Output Boundary というインターフェースで DIP を適用することになるのです。

Web の MVC とクリーンアーキテクチャの落としどころ

一方、Web フレームワークなどの MVC 2 を使う場合、Controller は Output Data を受け取り、それを View Model に変換して View に渡すような流れになります。
その際、Output Data を View Model に変換する役割を Presenter に担わせることが考えられます。
これらをまとめると下図のようになります。

presenter.png

Presenter のインターフェースであった Output Boundary は DIP が不要になったため削除しています。

参考

59
35
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
35