クリーンアーキテクチャ-ユースケースクラスが多すぎる


14

私はクリーンアーキテクチャに入り、AndroidレベルをMVCからMVPに上げ、Dagger 2でのDI、RxJava 2での反応性、そしてもちろんJava 8を紹介します。

MVPクリーンなアーキテクチャが存在し、エンティティ間の層(データストア内)とプレゼンターそれらにアクセスする必要があります。このレイヤーが「ユースケース」です。使用例は、理想的には1つのエンティティに1つの操作を実装するインターフェースです。

また、Clear Architectureは「悲鳴を上げている」ことも知っています。そのプロジェクトの意味では、クラスの数が多いため、非常に読みやすくなっています。

今、私のプロジェクトでは、6つの異なるエンティティのようなものがあり、もちろん、各エンティティリポジトリにはそれらにアクセスするための少なくとも4つのメソッド(通常はget、add、delete、update)があります。つまり、6 * 4 = 24です。

Clean Architectureのこれまでに理解できたとしたら、24のUseCaseがあります。

MVCの6つのコントローラーと比較するとこれは多くのクラスです。

本当に24のユースケースを作らなければならないのですか?

私はすでにそれを成功裏に使っている誰かによる説明を本当に感謝します。

ありがとう、ジャック


1
これらのユースケースを詳細に説明するページへのリンクを、サンプルコードとともに投稿できますか?
Robert Harvey、

私はたくさんググってきましたが、主に:このアプリのサンプルと関連記事:github.com/jshvarts/OfflineSampleApp ; この記事:proandroiddev.com/… ; proandroiddev.com/… ; このトーク:youtube.com/watch?v=TvsOsgd0 -- c&feature=youtu.be ; そして、あまりにもこの記事:adityaladwa.wordpress.com/2016/10/25/...
ジャッキーDegl'Innocenti

1
あなたが引用したサンプルのアプリや記事はどれもClean Architectureとは関係がないようです。ただし、リアクティブプログラミング
Robert Harvey、

サンプルアプリはきっとClean Architectureパラダイムで作られています。他の記事は主に.. @RobertHarveyに何を見たいですか?
Jackie Degl'Innocenti

以下の私の答えを読んで返信してください。
Robert Harvey

回答:


22

本当に24のユースケースを作らなければならないのですか?

あなたが書くすべてがCRUDである場合のみ。

以下の図を参照してください。

ここに画像の説明を入力してください

あなたの主張は、6つの異なるエンティティーと、各エンティティーに対して4つのメソッド(作成、読み取り、更新、削除)があるということです。しかし、それはダイアグラムの中央にある黄色の円(エンティティレイヤー)にのみ当てはまります。EnsitiesレイヤーへのCRUD呼び出しを通過するだけの24のメソッドをユースケースレイヤーに作成しても意味がありません。

ユースケースは「顧客レコードの追加」ではありません。ユースケースは、「顧客へのアイテムの販売」(顧客、製品、および在庫エンティティが含まれます)または「請求書の印刷」(同じエンティティが含まれ、請求書ヘッダーおよび請求書ラインアイテムに加えて)に沿ったものです。 )。

ユースケースを作成するときはCRUDメソッドはなく、ビジネストランザクションについて考える必要があります。

さらに読む
集約-単一のユニットとして扱うことができるドメインオブジェクトのクラスター


2
パターン、プラクティス、アーキテクチャについて考えるのに時間がかかりすぎて、基本的なソフトウェア設計について考える時間が足りない。私の回答で述べたように、必要なのはビジネス慣行を具体化する方法だけです。
Robert Harvey

1
アーキテクチャの選択の問題ではありません。私の個人的な意見:裸のCRUDオペレーションは、エンティティレイヤーと直接対話する必要があります。もちろん、これはおそらくClean Architectureに違反しています。
Robert Harvey

1
あなたはちょっと要点を逃しています。アーキテクチャは、コードを編成するための手段にすぎません。アーキテクチャと格闘するのはなく、コード記述することで問題を解決します。
Robert Harvey、

1
こんにちは、ロバート、私がコードを書かないと仮定するのはそれほどいいことではありません。私の答えのトピックはアーキテクチャに関するものであり、SOに関するものではありません。心から私はあなたの最後のコメントが本当に誤解を招き、耳が聞こえないことを見つけます。問題は、コードを書くのではなく、Clean Arch。のUseCaseについてです。あなたが何かを伝えようとしているなら、私はあなたのコメントのポイントを逃しているので、よりよく説明してください。私見では、ソフトウェアの開発中にアーキテクチャの考慮を回避することは不可能です。少なくとも、優れた開発者はコードの束を書くだけではありません。さらに、コメントで本当に具体的な質問をしましたが、答えてもらえますか?ありがとう
Jackie Degl'Innocenti

2
あなたが提起した問題の解決策(アプリを最初にオフラインにする)は、Clean Architectureとはあまり関係がありません。Clean Architecture図では、その問題の解決策は見つかりません。
Robert Harvey、

2

すべてのCRUD-Operationが1つのUseCaseで翻訳されるのであれば、あなたは正しいです。ただし、UseCaseは複数のCRUD操作で構成される場合もあります。

UseCaseは、異なるデータソースから情報を収集し、データシンクへの通信を準備する独立したモデルです。複数のCRUD操作が含まれる可能性があります。

そのため、顧客の請求書を作成し、顧客もシステム内に存在しないため顧客自体も作成するUseCaseを考えてみてください。1つのトランザクションで少なくとも2つのCreate-Operationが発生するUseCaseが1つあります。


では、多くのエンティティーを持つCRUDの例にはどのパターンをお勧めしますか?
Jackie Degl'Innocenti

これについての私の個人的な見解は、SRP(単一責任の原則)に違反しない限り、多くのクラスを持つことに問題はありません。しかし、私はほとんどの場合、ユースケース「エンティティの作成」、「エンティティの更新」、「エンティティの削除」、および「エンティティの更新」を単純な「タイプXのエンティティの管理」に再定義します。多くの場合、1つのエンティティを管理するための単一のUIを提供します。しかし、それこそがUseCaseが定義すべきことです。ビジネスにとって有益な作業負荷を処理する方法。
oopexpert 2017

わかりましたので、単一のフローが複数の責任を処理することなく、同じUseCaseでより多くの異なるメソッド(およびフロー)を単に「集約」するように見えるため、さまざまな異なる操作を管理するユースケースがあっても、SRPに違反しているようには見えません。 ..しかし、このようにして、UseCaseの代わりにコントローラーを作成するだけではありませんか?..アイデア..たぶんユースケースは単にレイヤーと見なされるべきであり、そのレイヤーはSRPを尊重しなければならないだけでなく、多くのメソッドを実装することもできます。これに関する情報源または記事が欲しいのですが
Jackie Degl'Innocenti 2017

1
ユースケースはコントローラーです。唯一の違いは、ユースケースはビジネスの観点から来ており、コントローラーはそれに対する技術的なビューであるということです。ユースケースの焦点は、ビジネス価値を生み出しているものです。したがって、ユースケースはビジネス価値主導のコントローラー実装です。
oopexpert 2017

1
同意します。HTTPコントローラはI / Oを管理する方法の1つであり、コンソールコマンド、イベント応答なども存在します。これらすべてのI / Oチャネルは同じユースケースを呼び出します。ユースケースはビジネスロジックのコントローラーであり、呼び出し元のI / Oチャネルについては認識していませんが、ドメインエンティティを調整してジョブを実行する方法を認識しています。
Dmitriy Lezhnev

1

ユースケースの定義が間違っています。ユースケースはビジネスルールを実装するクラスです。CRUD操作である必要はありません。複雑なマルチステップ操作にすることができます


あなたの文は、実際に広範囲のCrudのような操作を実装する必要がある場合の解決策を意味するものではありません。考慮事項でさえ、ユースケースが複雑な操作にアクセスできるパターンを観察する必要があるという事実と何らかの関係を見つけるかもしれませんが、多段階でも。
Jackie Degl'Innocenti
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.