Blocアーキテクチャ-翻訳
3838 ワード
原文bloc-architecture
Blocアーキテクチャ
Blocを使用すると、アプリケーションを3つの階層に分けることができます.Dataデータ層 Data Providerデータプロバイダ Repositoryデータウェアハウス Business Logicビジネスロジック層 Presentation表現層 感じは
最下層(ユーザーインタフェースから最も遠い)から、その働き方を上に説明します.
データ層(Data Layer)
データ・レイヤは、1つ以上のデータ・ソースからデータの取得/操作を担当します.
データ・レイヤは、次の2つのセクションに分けられます.倉庫(Repository) データプロバイダ(Data Provider) データ・レイヤは、アプリケーションの最下位レベルであり、データベース、ネットワーク・リクエスト、その他の非同期データ・ソースとインタラクティブです.
データプロバイダ(Data Provider)
DataProviderはメタデータの提供を担当します.DataProviderは万能で通用するはずです.
倉庫(Repository)
ご覧のように、repositoryレイヤは、複数の
ビジネスロジック層Bloc(Business Logic)Layer
個人的には、入力
BlocとBloc通信(Bloc-to-Bloc Communication)
各blocにはステータスフローがあり、他のblocはこのステータスフローを購読してbloc内の変化に反応させることができる.
Blocは他のBlocに依存してその状態変化に反応することができる.次の例では、
表現層Presentation Layer
presentationの役割は、1つ以上のbloc状態に基づいて自分をレンダリングする方法を明らかにすることです.また、ユーザー入力およびアプリケーションライフサイクルイベントも処理する必要があります.
ほとんどのアプリケーション・フローは、アプリケーションがユーザに提示するためにいくつかのデータを取得することをトリガする
この場合、presentationレイヤは、
また、presentationレイヤは、blocレイヤの状態に基づいて画面に表示される内容を決定しなければならない.
Blocアーキテクチャ
Blocを使用すると、アプリケーションを3つの階層に分けることができます.
MVC
?DataはModelに対応する.Business Logic対応Controller;PresentationはViewに対応する.最下層(ユーザーインタフェースから最も遠い)から、その働き方を上に説明します.
データ層(Data Layer)
データ・レイヤは、1つ以上のデータ・ソースからデータの取得/操作を担当します.
データ・レイヤは、次の2つのセクションに分けられます.
データプロバイダ(Data Provider)
DataProviderはメタデータの提供を担当します.DataProviderは万能で通用するはずです.
DataProvider
通常、CRUD動作を実行するための簡単なAPIが開示される.例えば、データ層の一部として、いくつかのcreateData
,readData
,updateData
,およびdeleteData
方法が提供される.class DataProvider {
Future readData() async {
// ...
}
}
倉庫(Repository)
repository
は、data provider
と通信するために、1つまたは複数のBloc
を一緒にパッケージする責任を負う.class Repository {
final DataProviderA dataProviderA;
final DataProviderB dataProviderB;
Future getAllDataThatMeetsRequirements() async {
final RawDataA dataSetA = await dataProviderA.readData();
final RawDataB dataSetB = await dataProviderB.readData();
final Data filteredData = _filterData(dataSetA, dataSetB);
return filteredData;
}
}
ご覧のように、repositoryレイヤは、複数の
data provider
とインタラクティブになり、結果をビジネスロジックレイヤに渡す前にデータを変換できます.ビジネスロジック層Bloc(Business Logic)Layer
bloc
レイヤは、新しい状態(state
)を使用して、表現レイヤ内のイベントに応答する責任を負う.blocレイヤは、1つまたは複数のrepositiry
に依存して、アプリケーション状態の構築に必要なデータを取得することができる.bloc
レイヤは、ユーザインタフェース(prsentation layer
)とデータレイヤ(data layer
)を接続する橋渡しと見なされる.bloc
レイヤは、ユーザ入力によって生成されたイベント(event
)を受信し、repository
と通信して、レイヤを表す新しい状態(state
)を構築して使用する.個人的には、入力
event
=>>出力state
class BusinessLogicComponent extends Bloc {
final Repository repository;
Stream mapEventToState(event) async * {
if(event is AppStarted) {
yield await repository.getAllDataThatMeetsRequirements();
}
}
}
BlocとBloc通信(Bloc-to-Bloc Communication)
各blocにはステータスフローがあり、他のblocはこのステータスフローを購読してbloc内の変化に反応させることができる.
Blocは他のBlocに依存してその状態変化に反応することができる.次の例では、
MyBloc
はOtherBloc
に依存し、OtherBloc
の応答状態が変化したイベントに対してdispatch
を行う.メモリ漏洩を回避するには、MyBloc
メソッドをdispose
に書き換え、StreamSubscription
を閉じる必要があります.class MyBloc extends Bloc {
final OtherBloc otherBloc;
StreamSubscription otherBlocSubscription;
MyBloc(this.otherBloc) {
otherBlocSubscription = otherBloc.state.listen((state) {
// React to state changes here.
// Dispatch events here to trigger changes in MyBloc. MyBloc
});
}
@override
void dispose() {
otherBlocSubscription.cancel();
super.dispose();
}
}
表現層Presentation Layer
presentationの役割は、1つ以上のbloc状態に基づいて自分をレンダリングする方法を明らかにすることです.また、ユーザー入力およびアプリケーションライフサイクルイベントも処理する必要があります.
ほとんどのアプリケーション・フローは、アプリケーションがユーザに提示するためにいくつかのデータを取得することをトリガする
AppStart
イベントから開始します.この場合、presentationレイヤは、
AppStart
イベントを配信する.また、presentationレイヤは、blocレイヤの状態に基づいて画面に表示される内容を決定しなければならない.
class PresentationComponent {
final Bloc bloc;
PresentationComponent() {
bloc.dispatch(AppStarted());
}
build() {
// render UI based on bloc state
}
}