私はClean ArchitectureとVIPERで遊んでいます。クリーンアーキテクチャ:サーバ上のインタラクタロジック
昨日、友人はInteractor
ロジックをサーバーに配置し、生データを送信してInteractor
で処理するのではなく、処理したデータをiOSクライアントに同期させるのはどうかと尋ねました。これは、自由にロジックを変更でき、複数のクライアント(たとえば、iOSやAndroidなど)で複製するコードが少なくて済むなど、多くのメリットがあります。
例として、 Profile
と、Post
のリスト。各投稿には画像とプロフィールIDがあります。
そして、すべての投稿の画像を含むテーブルビューを表示する画面を希望し、ユーザーが投稿をタップすると、それぞれのプロフィールが別の画面に表示されるとします。プロフィールでは、そのプロフィールによって投稿された名前とすべての画像が表示されます。
私たちは、クライアント上でロジックを残す場合は、我々はこのようなデータを同期することだろう。
{
profiles: [
{
id: "...",
name: "..."
},
...
],
posts: [
{
profileID: "...",
imageURL: "..."
}
]
}
その後、我々はただ、すべての記事のためにデータを返すShowPostsInteractor
とShowProfileInteractor
を持っているだろう、その第二の代替を同期、その場合には、サーバー上でこのロジックを残すことである
{
name: "...",
imageURLs: ["...", ...]
}
:それは次のようにビューにいくつかのデータを返す、そのプロファイルからわずか投稿をつかむためにポストのデータをフィルタリングしますデータは:
{
profiles: [
{
id: "...",
name: "...",
imageURLs: ["...", ...]
},
...
],
posts: [
{
profileID: "...",
imageURL: "..."
}
]
}
(profiles
でimageURLs
の追加に注意してください)
そして、それはビューにあるとして、それはもう投稿をフィルタリングする必要がないので、ShowProfileInteractor
だけ(これはだった、プロファイルデータを渡しますサーバーによって行われます)。
確かに、2番目の方法では一部のデータが複製されますが、それは単なる文字列なので、これはあまり関係ありません。
私は最初のアプローチがより頻繁に行われるのを見ました。だから私の質問は、なぜ私は2番目のアプローチ(サーバー上でできるだけ多くのロジックを残して)とクライアントからすべてのインタラクタを削除して、コントローラに直接アクセスするようにします?
私は与えた2番目の例を実装しますか?また、モバイル用のクリーンアーキテクチャについては、VIPER(https://www.objc.io/issues/13-architecture/viper/) –
を参照してください。そうすれば、サーバーを別のデータストアとして扱っているようです。それは一種の意味があります。私はまだ100%がクリーンアーキテクチャがモバイルに適していると確信していません。 VIPERに記述されているように、同じインタラクタをiOSアプリケーションやコンソールアプリケーションで使用することはできますが、UIを別のものに置き換えることとまったく同じではありません。一般的に言えば、WebアプリケーションのIMOよりもモバイルでのアーキテクチャ上の決定を遅らせることができます。 – guillaume31
あなたの質問に関しては、特にモバイルプラットフォームの追加を計画している場合は、「はい」と言います。インタラクターを複数のクライアント言語で記述することで、メンテナンス性が低下します。しかし、サーバ対クライアントでどれくらいの処理をしたいのかは、この方程式の重要な部分です。 VIPERがインタラクターをサーバー側に動かすのに役立つかどうかはわかりません。 – guillaume31