FlutterのproviderパターンにてCleanArchitectureを学ぶ
3630 ワード
- こちらのチュートリアルの学習と解説をします。
- 厳密にCleanArchitectureの図を再現しているわけではありません。
チュートリアルの流れ
設計手法
- ビジネスロジックをUI, DB, network, 3rdパーティーpackageから分離する
- 理由: コアのビジネスロジックは変化しにくいから
- UIはWebAPIに直接アクセスしてはいけない
- 至るところからDBを呼ぶ状態にしてはいけない
- 方法: プラグイン的な設計にする
- モバイルUIをデスクトップUIに入れ替えられる
- DBを入れ替えられる
- local storageを入れ替えられる
State Management と Provider
- このチュートリアルで扱うアプリケーションはこのような構成になる
- Local Storage
- web API
- UI
- ビジネスロジックがState managementをする
- providerはそのState managementのhelperとなる
- ChangeNotifierProvider
によりUIビジネスロジックを挿入する
ビジネスロジックによる連携
- MVVM
- Data層がModelとなる(赤)
- ビジネスロジックがViewModelとなる(紫)
- UIがViewとなる(緑)
- UIはViewModelの変更の通知を受ける
- UIはViewModelにイベントを送る
- ViewModelはUIがどういうものかに関知しない
- ビジネスロジックはサービスのインターフェイスに対する処理をする
- ローカルストレージかWebかについてビジネスロジックは関知しない
- この形式はRepository Patternとも呼ばれる
Service Locator
-
get_it
packageを用いる - 制御の反転、依存性の逆転を目的とする
- ビジネスロジックから実装する際、未実装のServiceはFakeを作成する
- 実装後に簡単に入れ替えられる
// 開発開始時にはFakeを用いる
// serviceLocator.registerLazySingleton<CurrencyService>(() => CurrencyServiceFake());
// Serviceが実装できたら入れ替える
serviceLocator.registerLazySingleton<CurrencyService>(() => CurrencyServiceImpl());
学んだこと
- CleanArchitectureの観点でMVVMを実装すると、ModelとViewがそれぞれViewModelに依存する
- ViewModelがビジネスロジックとなる
-
ViewModelがData層(Model)を扱う場合、そのインターフェイスにのみ依存する
- 理由: ビジネスロジックであるViewModelは変化しにくいものであるから、Model等の他のオブジェクトに依存させたくないため
- つまり、制御の反転を行うためにインターフェイスに依存する
- 実装はService Locatorを用いて注入する
-
開発時は未実装のService(Data層)のFakeを作成する
- WebAPIから取得するModelのFakeとしては、ダミーのListを返すものやダミーのJSONを読み込むものを作成する
- 実装が終わればFakeと置き換える
- VMがMのインターフェイスにのみ依存しているので置き換えが容易となる
- TDDではTestにてmockを作るが、このmockと同じ役割となる
- ViewModelがビジネスロジックとなる
- 理由: ビジネスロジックであるViewModelは変化しにくいものであるから、Model等の他のオブジェクトに依存させたくないため
- つまり、制御の反転を行うためにインターフェイスに依存する
- 実装はService Locatorを用いて注入する
- WebAPIから取得するModelのFakeとしては、ダミーのListを返すものやダミーのJSONを読み込むものを作成する
- 実装が終わればFakeと置き換える
- VMがMのインターフェイスにのみ依存しているので置き換えが容易となる
- TDDではTestにてmockを作るが、このmockと同じ役割となる
Author And Source
この問題について(FlutterのproviderパターンにてCleanArchitectureを学ぶ), 我々は、より多くの情報をここで見つけました https://qiita.com/maria_mari/items/39222665f8eee89e0a1f著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .