未熟学生エンジニアのブログ

TetsuFeの個人開発ブログ

TetsuFeはテツエフイー と読みます。FlutterやWeb周り全般、チーム開発について語るブログ

Clean Architecture・DDDをもとにしたFlutterアプリのモジュール分割&命名法

DDDの戦術的設計とは、DDD(ドメイン駆動設計)という設計手法における具体的な実装の方法論を指します。

これは、レイヤー分けの方法論で、例えば以下のようになります。

  • アプリケーション固有のロジック: XXX、XXXService
  • 永続化(DBなど)に関するコード: Repository
  • アプリケーション固有のロジックを組み立てる役目: ApplicationService、UseCase
  • UI

(アプリケーション固有のロジックに関しては、Entity、ValueObjectというパターンを使うことでXXXクラスを作るという形になります)

これらは、アプリケーション全体の構成を把握するために便利でもあります。この記事では、上記をさらに拡張して、以下のようにしてみます。タイトルは「Flutterアプリの」としましたが、Flutterアプリ以外でも同じようなものかと思います。

  • ドメイン(ある分野特有の)ロジック: XXX、XXXService
  • webAPIとの通信を行う: Api、ApiClient、DAO(Data Access Object)
  • UIとUseCaseへの橋渡し役: Controller、Notifier、BLoC
  • 永続化(DBなど)に関するコード: Repository
  • ドメインロジックを組み合わせて一連の流れを作る役目: ApplicationService、UseCase
  • UI: View、Widget、Page、Dialogなど
  • DI: Provider

これに似たクリーンアーキテクチャでも、以下のような図が出てきます。

f:id:swiftfe:20200922043516j:plain
クリーンアーキテクチャ

さて、一般的な言葉だけでは分かりづらいと思いますので、実際の例を示します。Flutterの人ならよく見たことのあるCartアプリを例にします。以下のような設定です。

  • ドメインロジック: Item、Cart、CartService
  • 複数のクラスを組み合わせたロジック: Facade
  • webAPIとの通信を行う: ItemAPI、CartAPIClient
  • UIとUseCaseへの橋渡し役: CartController、CartNotifier、CartBLoC
  • 永続化(DBなど)に関するコード: CartRepository、ItemRepository
  • ドメインロジックを組み合わせて一連の流れを作る役目: CartApplicationService、ItemUseCase
  • UI: CartView、CartPage、AddToCartDialog
  • DI: CartProvider

NotifierやProviderという言葉は、Flutter開発者ならよく目にしますよね。

これを図にすると、以下のようになります。

f:id:swiftfe:20200923171352p:plain

この時点で、これらを組み合わせてアプリを作っていくことが、なんとなくイメージできるのではないでしょうか?この記事の読者の皆様のモジュール分割、命名の際の参考になれば嬉しいです。

次回「実装編」に続くかもしれません。