Blocアーキテクチャ-翻訳

3838 ワード

原文bloc-architecture
Blocアーキテクチャ
Blocを使用すると、アプリケーションを3つの階層に分けることができます.
  • Dataデータ層
  • Data Providerデータプロバイダ
  • Repositoryデータウェアハウス
  • Business Logicビジネスロジック層
  • Presentation表現層
  • 感じはMVC?DataはModelに対応する.Business Logic対応Controller;PresentationはViewに対応する.
    最下層(ユーザーインタフェースから最も遠い)から、その働き方を上に説明します.
    データ層(Data Layer)
    データ・レイヤは、1つ以上のデータ・ソースからデータの取得/操作を担当します.
    データ・レイヤは、次の2つのセクションに分けられます.
  • 倉庫(Repository)
  • データプロバイダ(Data Provider)
  • データ・レイヤは、アプリケーションの最下位レベルであり、データベース、ネットワーク・リクエスト、その他の非同期データ・ソースとインタラクティブです.
    データプロバイダ(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)Layerblocレイヤは、新しい状態(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に依存してその状態変化に反応することができる.次の例では、MyBlocOtherBlocに依存し、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
        }
    }