web-dev-qa-db-ja.com

クリーンアーキテクチャ:バックグラウンドサービスに大きく依存するアプリ

クリーンアーキテクチャを実装しようとしています( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html )on Android=アプリ。例として、アプリのすべての機能がユーザーのCPU温度を監視し、1時間ごとの1日の平均を表示することであるとします。データはデバイスに保存され、ダウンサンプリングされたデータは、バックエンドにアップロードされます。

私が見たすべてのクリーンなアーキテクチャの例は、同じタイプのアプリ用です-例えば。 UIからCRUDデータまでのアプリ(通常は次の行):UIがプレゼンターにクリックイベントを送信し、プレゼンターがユースケースインタラクターを実行し、インタラクターがリポジトリーからデータを取得し、プレゼンターがデータをUIに送信します。

私のアプリのユーザーインタラクションは実質的にゼロです。

  • バックグラウンドサービスはCPUの温度を測定し、それを
    データベース。
  • 別のバックグラウンドプロセスがデータをダウンサンプリングし、データベースに書き込みます。
  • さらに別のバックグラウンドプロセスは、ダウンサンプリングされたデータをバックエンドと同期します
  • バックグラウンドサービスは、ジョブスケジューラによって一定の間隔で実行するようにスケジュールされています
  • ユーザーに表示されるのは、現在のCPU、平均、そしておそらく同期が正常に完了したという通知だけです。

クリーンなアーキテクチャの観点からこれをどのように構成しますか?すなわち:

  • 私のユースケースは何ですか?
  • サービスはビューと同じレイヤーにありますか?
  • プレゼンターは必要ですか? (おそらく、サービスからのステータス通知を表示するために、他の理由がわかりませんか?)
  • 高解像度データと低解像度データに別々のリポジトリが必要ですか?

これは多くの質問だと思いますが、正しい方向への入力やポインタはありがたいです。

2
HPage

Clean Architecture(CA)の重要な部分は、プレゼンターやコントローラーではありません。 CAの重要な点は、ビジネスケースを表すアプリケーションの「コア」があることです。また、UI、インフラストラクチャ、サービス、またはデータベースのすべてがこのコアに依存し、その逆は依存しません。ワタリ ボブおじさんの話 より明確な画像を得るためにお勧めします。

私があなたのコードを見るとき、あなたの「コア」ユースケースはパイプラインです。このパイプラインは複数の部分で構成され、それぞれがデータベースを間に置いて個別に実行されます。しかし一緒に、彼らはいくつかの処理を行います。私が見たいのは、パイプライン全体を単一のユニットとしてテストする自動テストです。データベースとスケジューラーはモックアウトされ、パイプラインはそれが本番環境で実行されているのか、それがインメモリーデータベースでテストされており、スケジューラーを介さずに直接実行されているのかを知りません。

2
Euphoric

MVCパラダイムは、適切で簡単に解釈できる方法でプログラムを構造化するためのガイドラインです。ご存知のように、ユーザーとのやり取りや表示はほとんどないので、最終的に些細な目的を実行するクラスとレイヤーを作成する必要がありますか?もちろん可能ですが、もはや適切ではなく、簡単に解釈できます。プロジェクトを読んでいるプログラマーは、平均を取得し、小数点以下2桁に四捨五入して画面に表示するだけのビュークラスの存在に戸惑います。 isはガイドラインにすぎず、コーディングのルールブックではないことを覚えておくと役立ちます。

特定の質問に答えるには:

私のユースケースは何ですか?

どうぞ:

ユーザーが平均CPU使用率を知りたい。ユーザーはプログラムに入り、明確にラベル付けされた割合を書き留めます。ユーザーがプログラムを閉じます。

ユーザーがプログラムが最後に同期された時間を知りたい。ユーザーはプログラムに入り、明確にラベル付けされた日付を書き留めます。ユーザーがプログラムを閉じます。

それはおそらくあなたがすでに推測したのと同じくらい簡単です。過度に分析しないでください。

サービスはビューと同じレイヤーにありますか?

正直なところ、バックグラウンドタスクはユーザーUIで分離しますが、これは主に、実行されるタスクが明らかに異なるためです。いいえ。

プレゼンターは必要ですか? (おそらく、サービスからのステータス通知を表示するために、他の理由がわかりませんか?)

たぶん、ユーザーが見ることができるデータにデータを注ぎ込むことにのみ焦点を当てた1つのクラスの必要性を見ることができます。プレゼンターと呼んでも、少し役割が美化されていると思います。

高解像度データと低解像度データに別々のリポジトリが必要ですか?

私はしません。どちらかと言えば、2つ目のテーブルを用意することを検討してください。

0
Neil