Clean Architecture (軽め)
こんにちは。PHR事業開発部の橋本です。
今回は、個人向けサービス「NOBORI」のスマホアプリの開発において採用している「Clean Architecture (軽め)」について、ご紹介します。
Flutterを利用したスマホアプリ開発において、Clean Architectureというフレームワークを採用しています。ただ、全ての概念をきれいに適用という訳ではなくPJの特性に合わせて少し独自の方法で実施しているため(軽め)と表現しました。Clean Architecture自体の理念・詳細な解説については、こちらなど良質な紹介記事が多数ありますので、簡単な紹介にとどめ、主に我々のPJでの利用方法をご紹介します。
Clean Architectureとは?
有名なのがこの図。
発端となったのは下記Blogです。
Rovert C. Martin が提唱した設計思想で、DBやフレークワークからの独立性を確保するためのアーキテクチャです。
Clean Architectureのメリット
Clean Architectureのデメリット
弊社アプリでの採用ルール
CleanArchitectureを厳格に実現しようとすると、大量のコード量、ファイルとなり、管理しづらさがあります。そのため、だいぶ崩した形で採用しています。スマホアプリでメインとなるUI周り(Presentation層)の開発において、少しでも楽になれればという工夫になります。
社内で定義している全体概要図は下記のとおり。
擬似CleanArchitecture + StateNotifierProviderとしています。
UI <=> Controller + State=> Domain => Data
Presentation
スマホアプリの大部分を占めるレイヤーです。
画面単位 (Screen) で Controller + Stateを持つこととする。
画面側はController経由でStateを管理する。
Controllerは状態(State)を保持し、Domain層からのデータ取得や更新を行う
Stateが更新されることで、画面への状態変更通知が行われる。
Domain
Domainは状態を持たないUseCaseを利用する。Model を用いて、Presentation層とのやりとり。Entityを用いて、Data層とのやり取りを行う。レイヤー間の受け渡しを行う。
UseCaseは基本的にはレイヤー間における入出力の仲介を行う。
共通的なロジック定義としてLogicを利用可能。
レイヤー間の変換ルールをまとめたものとして、TransLatorを利用可能とする。
Data
アプリケーション外のデータ(API送受信、ローカルファイル、DBなど)とのやりとりを行う。
取得したデータをEntityとして、UseCaseに変換する。
UseCaseのMock化
スマホアプリのメイン作業であるPresentation層の開発・確認のため、UseCase層をMock化(管理DI)することで、お手軽にユニットテストできるよう工夫しております。まさにレイヤー分けていることの恩恵。
最後に
だいぶ簡略化した説明で不足している箇所も多々あるかと思いますが。。。
気になった方、ご質問あればなんでも答えます。
またの機会でFlutterに特化したところの説明も、もう少ししていきたいです。
NOBORIではアプリエンジニアを含め技術職を募集しています。
興味のある方は、是非お気軽にメール頂ければと思います!
メール:phr-bdd@nobori.ltd