オニオンアーキテクチャの基本とFlutterでの適用例を初心者向けに解説
生徒
「Flutterでアプリ開発をしてるんですけど、コードが複雑になってきました。何か良い設計方法ってありますか?」
先生
「それなら、オニオンアーキテクチャを学んでみるのがおすすめです。Flutterでも活用できるアーキテクチャですよ。」
生徒
「オニオンアーキテクチャって、名前は聞いたことあるけど、どういう仕組みなんですか?」
先生
「それでは、Flutterアプリでのオニオンアーキテクチャの基本から実際の適用例まで、順番に解説していきましょう!」
1. オニオンアーキテクチャとは?設計の基本概念を学ぼう
オニオンアーキテクチャ(Onion Architecture)とは、ソフトウェア設計において依存関係の方向を明確にし、ビジネスロジックを中心に据えるアーキテクチャスタイルです。
名前の通り、玉ねぎのように中心から層が広がる構造をしており、内側の層が外側の層に依存されるという特徴があります。
特にFlutterアプリ開発では、状態管理やロジックの分離が課題になることが多く、オニオンアーキテクチャを導入することで、コードの保守性やテスト性が飛躍的に向上します。
2. オニオンアーキテクチャの基本構造(4層モデル)
Flutterにおけるオニオンアーキテクチャは、以下の4層で構成されるのが一般的です。
- Domain層:エンティティやビジネスルール(最も内側)
- Application層:ユースケースなどのアプリケーションロジック
- Infrastructure層:APIやDBとの接続処理
- Presentation層:FlutterのUIや状態管理(最も外側)
この構造にすることで、UIの変更がアプリケーションの本質的なロジックに影響を与えない設計が可能になります。
3. Flutterプロジェクトでのディレクトリ構成の例
Flutterでオニオンアーキテクチャを実践する際には、まずはディレクトリを明確に分けることが大切です。以下のような構成が参考になります。
lib/domain/:エンティティやリポジトリのインターフェースlib/application/:ユースケースの処理lib/infrastructure/:APIの実装や外部サービスとの連携lib/presentation/:画面ウィジェットやProviderなど
このように構成することで、ファイルが論理的に整理され、可読性が高くなります。
Flutterを「実務レベル」で使えるようになりたい人や、 iPhone / Android両対応アプリ開発の流れをまとめて学びたい人には、 定番の実践書がこちらです。
Flutter実践開発をAmazonで見る※ Amazon広告リンク
4. Flutterでのユースケース実装例(Application層)
以下は、ユーザー情報を取得するユースケースの例です。
import '../domain/user.dart';
import '../domain/user_repository.dart';
class GetUserUseCase {
final UserRepository repository;
GetUserUseCase(this.repository);
Future<User> execute() async {
return await repository.fetchUser();
}
}
GetUserUseCaseは、ビジネスロジックとしてユーザー情報を取得する役割を担い、リポジトリに依存します。
5. FlutterのUI(Presentation層)での呼び出し方
Presentation層では、上記のユースケースを呼び出して状態管理と連携します。
import 'package:flutter/material.dart';
class UserPage extends StatelessWidget {
final GetUserUseCase getUserUseCase;
const UserPage({required this.getUserUseCase});
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: getUserUseCase.execute(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasData) {
final user = snapshot.data!;
return Text('ようこそ、${user.name}さん');
} else {
return Text('エラーが発生しました');
}
},
);
}
}
このように、UIはユースケースに依存し、ユースケースはドメインに依存するという構造になります。
6. オニオンアーキテクチャ導入によるFlutterの開発メリット
- テストしやすい:各層が独立しているため、ユニットテストが容易
- 保守性が高い:責任が明確になり、コードの見通しが良くなる
- 拡張しやすい:UIを変えてもビジネスロジックはそのまま使える
- 再利用可能:ロジックやユースケースを他のプロジェクトにも転用可能
7. オニオンアーキテクチャをFlutterに適用する際の注意点
ただし、オニオンアーキテクチャを導入するとファイル数が増えるため、次のような工夫が必要です。
- 小規模なプロジェクトでは層を簡略化する
- 命名規則やディレクトリ構成を統一する
- 層ごとに責任を明確にする
まずは小さなプロジェクトから試して、徐々にスケールさせていくのがおすすめです。