はじめに
- CyberAgentのインターンで触れたアーキテクチャである、Flux, Clean Architectureについての個人的な見解を述べるだけです
 - 「アーキテクチャはこうあるべき」みたいな原理主義的な話はしません
 
この記事で書くこと
- Fluxの特徴
 - Clean Architectureの特徴
 - MVVM × Clean Architecture
 
Fluxの特徴
FluxはFacebook社が作成したアーキテクチャパターンで、もともとはJSで使われていたものです。
各要素の役割として以下の通りです。
- 
Dispatcher: 発火されたActionをStoreに通知するもの - 
Action: Viewなどから発火されたEventをDispatcherに通知するもの - 
Store: Dispatcher経由できたActionに応じて、データを管理するもの - 
View: StoreのデータをUIに反映させるもの、ユーザー操作に応じてActionを発火するもの 
メリット
- データの流れが単一方向であること
 - DispatcherやActionがシングルトンで表される
 
デメリット
- 規模が大きくなると、Actionが肥大化する
 - Recycler Viewなど動的にリストビューを作成する処理をActionに書かなければならないため、関心の分離を満たせない場合がある?
 - ビジネスロジックのみを完全に分離できない
- KMM(Kotlin Multiplatform Mobile)等への対応が難しい
 - CyberAgentでもKMMへの対応
 
 
MVCとの違い
よく比較されるアーキテクチャとして、MVC(Model View Controller)があります。Model, View, Controllerの役割としては以下の通りです。
- 
Model: システムの中でビジネスロジックを担当する - 
View: データ表示や入出力の処理をする - 
Controller: ユーザーの入力に基づき、ModelとViewを制御する 
しかし、MVCには規模が大きくなるにつれ、ViewとModelの依存関係が複雑になる問題点があります。例えば、A画面ですでに生成されたModelを参照しながら、A画面内でもう一度同じModelを参照したい場合もあるかもしれません。そういった場合の依存関係は複雑になります。規模が大きくなればなるほど、この問題は顕著になります。
以下の画像がわかりやすかったので参考までに載せておきます。
Clean Architectureの特徴
Clean Architectureはレイヤードアーキテクチャ(責務のまとまりをレイヤーとし、それらを組み合わせて構成されるアーキテクチャ)の一つです。以下の画像で表されることが多いです。
ですが、この図は個人的にとてもわかりづらいのでAndroidアプリを作成する際によく採用される、MVVM×Clean Architectureの図を作ってみました。このアーキテクチャはClean ArchitectureにMVVM(特にViewModel)を組み込んだアーキテクチャです。
各レイヤーの役割としては以下の通りです。
- 
プレゼンテーションレイヤー: UIなどユーザーにどう見せたいか制御する責務を持ちます(上の図ではUIレイヤーとしています) - 
アプリケーションレイヤー: ドメインレイヤーの抽象化された振る舞いを具象化し、アプリケーションで使用しやすい形に変換する責務を持ちます。 - 
ドメインレイヤー: データレイヤーで取得したデータをドメインに変換する責務を持ちます - 
データレイヤー: 上位のレイヤーで使用するデータやライブラリを扱う責務を持ちます 
メリット
- 機能改善がしやすくなる
- 関心の分離の原則により、関心事がしっかりと分かれているので機能改善・追加がしやすい
 
 - テストがやりやすくなる
- はじめにEntitiesだけをテスト→UseCaseだけをテスト→Presentation層のテストみたいな感じに、テストを細かい粒度で行えるようになる
 
 
デメリット
- 実装コストが高い
- 書くコード量はMVCの1.5倍くらい?
 - →早く実装しなければならないチーム・プロジェクトには向かないかも?
 
 
まとめ
CyberAgentのインターンで触れたFlux、Clean Architectureについてまとめてみました。
今回自分なりに言語化してまとめてみたことで、それぞれのアーキテクチャへの理解が深まった気がします。また、それぞれ特徴があり「こっちの方が絶対に良い」のようなことはないということを感じました。
今後もこのような記事を投稿し、多くのアーキテクチャに関して比較・検証をしていきたいと思います 💪


