2

VIPER Architectural パターンのコンテキストで、この質問に対する答えを探しています-

web apiaと a の両方と通信するアプリケーションがある場合、 1 つ、2 つ、または 3 つ持つ必要がありますdatabasedataManagers?

場合

a) dataManager

b) APIDataManagerおよびLocalDataManager

c) dataManagerAPIDataManagerおよびLocalDataManager

どこで

a)あなたが持っている可能性のあるサービス(リモートまたはローカル)と話すinteractorシングルと話します。dataManager

b)はと情報のinteractor違いを認識し、と のいずれかを呼び出します。これらは、それぞれリモート サービスとローカル サービスと通信します。localremoteAPIDataManagerLocalDataManager

c)interactorは将軍にのみ話しかけ、次にdataManager将軍dataManagerは に話しかけAPIDataManagerLocalDataManager

編集

決定的な解決策はないかもしれません。しかし、どんな意見でも大歓迎です。

4

2 に答える 2

5

VIPER も The Clean Architecture も、すべてのインタラクターに対して 1 つのデータ マネージャーのみが必要であると規定していません。参照されている VIPER の記事では、特定のストレージの実装が抽象化されている例として、1 つのマネージャーのみを使用しています。

インタラクター オブジェクトは、アプリケーション固有のビジネス ルールを実装します。アプリがサーバーと通信し、次に向きを変えてローカル ディスク ストアと通信する場合、インタラクターがこれを認識するのはまったく正常です。さらに、一部のインタラクターはこれを正確に管理する必要があります。

通常のオブジェクト構成規則がインタラクターにも適用されることを忘れないでください。たとえば、サーバーからデータを取得してローカル ストアに保存する 1 つのインタラクターから始めます。大きくなりすぎた場合は、2 つの新しいインタラクターを作成できます。1 つはフェッチを行い、もう 1 つはローカル ストアに保存します。次に、元のインタラクターはこれらの新しいものを含み、すべての作業をそれらに委任します。境界を定義するための規則に従えば、抽出クラスのリファクタリングを行うときに、新しい複合インタラクターで動作するオブジェクトを変更する必要はありません。

また、一般に、オブジェクトの役割が明確でなくなるため、マネージャーまたはコントローラーで終わる名前をオブジェクトに付けないことをお勧めします。サーバーと対話するインターフェイスには のような名前を付けることができAPIClient、ローカル ストレージを抽象化するインターフェイスにはEntityGatewayやのような名前を付けることができますEntityRepository

于 2015-12-11T13:22:44.770 に答える
4

それは、抽象化がアプリ内のどこにあるかによって異なります。つまり、何をどのように行うかが区別されます。2 つの異なるデータ ストアがあると定義しているのは誰ですか?

ローカル データ ストアとリモート データ ストアが問題領域自体の一部である場合 (たとえば、問題によってリモート データのフェッチが必要な場合もあれば、ローカル データのフェッチが必要な場合もあります)、インタラクターが 2 つの異なるデータ ストアについて認識していることが賢明です。

Interactor が要求されたデータのみを考慮し、データの取得方法は考慮しない場合、単一のデータ マネージャーが使用するデータ ソースを決定することは理にかなっています。

ここでは、ビジネス デザイナーとデータ デザイナーという 2 つの異なる役割が行われています。インタラクターは、ビジネス デザイナーのニーズ (ビジネス ロジック、問題領域など) を満たす責任があります。データ層は、データ デザイナー (サーバー チーム、IT チーム、データベース チームなど) のニーズを満たす責任があります。

データを取得する場所を変更する可能性が高いのは、ビジネス デザイナーですか、それともデータ デザイナーですか? その質問に対する答えは、どのクラスがその責任を所有しているかを示します。

于 2015-12-12T18:35:55.353 に答える