ちょっと前にiOS allstars2に参加して知ったClean Architecture(クリーンアーキテクチャ)が、最初はなるほどすげえなーと思っていたものの、ちょっと改めて調べてたら少し迷子になったので自分のために色々整理してみる。
そもそもクリーンアーキテクチャの前に
クリーンアーキテクチャのことを書いているエントリーを見るとよくMVC, MVVMなどのアーキテクチャとの比較があるが、一緒に丸が4層になった絵が出てくる。(本家はこちらですが、日本語訳をされた方のエントリもある。)
自分はいきなりこの絵をみても何のことやらだった。が、この絵はオニオンアーキテクチャ、ヘキサゴナルアーキテクチャを知ると理解できた。
ヘキサゴナルアーキテクチャ (Hexagonal Architecture)
ヘキサゴナルアーキテクチャは、伝統的なMVC, MVVMなどのレイヤード(階層)アーキテクチャからの転換を試みたものだと理解している。
伝統的なレイヤードアーキテクチャの説明でよくある「左のUIから右のData Storeに(あるいは上から下に)情報が流れていく」ような考え方ではなく、システムを「内側(application)と外側(infrastructure)」に区切り、UIも外側、DBも外側、サーバへの通信も外側と見なし、外→内→外と流れて行くのだ!という考え。
基本的にこの外→内→外を理解できるとあとは楽。
オニオンアーキテクチャ (Onion Architecture)
で、このヘキサゴナルアーキテクチャの思想を踏まえつつ、より実用的に内外の階層の分離を試みたのがオニオンアーキテクチャになる。
ヘキサゴナルアーキテクチャでapplicationとなっていた部分を、Applications Service, Domain Service, Domain Modelに分解している。ただ、それらの3つが何を担当するのかはあまり明確ではない。(少なくともブログでは)
クリーンアーキテクチャ (Clean Architecture)
おそらくオニオンアーキテクチャと目的はほぼほぼ一緒だが、各コンポーネントの役割、DTOやデータベースのレコードデータをどこまで跨いで使うべきかなどがより明確に提案されている。なので実装する際にはオニオンアーキテクチャよりもクリーンアーキテクチャの情報をベースにしたほうが良いだろう。
具体的な実装例やMVCなどとの比較はすでに良いエントリがあるので割愛。参考にあるqiitaのエントリを参照。
まだ理解不足なところ
1) クリーンアーキテクチャの絵の右下にあるフロー図の理解。
Input port/Output portはヘキサゴナルアーキテクチャの影響を受けている部分と思われるが、この図には一方通行の矢印しかない。ということは、例えば、「UI→Use case→外部サーバ通信」という処理を行う場合、 サーバの応答 を処理する際にも「サーバレスポンス→Use case→UI」という流れで右下のフローに従え、と言っているのではないか?その場合のクラス構成って?まぁ、サンプル作ったらスッキリしそうだけど時間が足りないのでもう少し先になりそう。
(追記: こちらの別エントリで考えを整理しました。)
2) DDD
Use Caseをどういった範囲で区切るべきか、Entityにメソッドを持たせるかただのValue Objectにするべきかは設計者に委ねられている。なので途中まで読んで積ん読になっているエヴァンスのDDD本を読まないといけない。そうしないと森で迷子になってしまう。
3) アプリケーション全体での関心事
もともとはiOSのイベントで知ったこともあるのでスマホアプリベースで考えてしまうが、スマホアプリの場合、wifi切れるとか、バックグラウンドに行ったとか、アプリケーション全体での関心事がいくつか存在すると思っている。その場合の対応の仕方をどこかで整理しておきたい。 おそらく外→内→外の部分は変わらず、内→外の箇所でどうやって「全体への周知」を行うか。ま、単純なcallbackではないような気はしている。
考えを整理したら単純な外→内→外で大丈夫そうだった。
(追記: こちらの別エントリ#3で考えを整理しました。)
参考
クリーンアーキテクチャ
https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
http://blog.tai2.net/the_clean_architecture.html
http://dev.classmethod.jp/smartphone/iphone/event-report-ios-all-stars-2/
http://qiita.com/kondei/items/41c28674c1bfd4156186
オニオンアーキテクチャ
http://jeffreypalermo.com/blog/the-onion-architecture-part-1/
https://www.infoq.com/jp/news/2014/11/ddd-onion-architecture
ヘキサゴナルアーキテクチャ
http://blog.tai2.net/hexagonal_architexture.html