9

クリーン アーキテクチャの使用に問題があります。Fernando Cejas のブログ投稿 http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/を読んだ方へ、私の質問はそれに基づいており、彼のコードです。

彼のサンプル プロジェクトには、ユーザーごとに 1 つのドメイン オブジェクトしかありません。そして、POJO を使えばすべてが明確になります。私が問題を抱えているのは、ユーザーが本を持っているとしましょう。一対多の関係。これをクリーン アーキテクチャでどのように処理しますか?

彼と同じように、私はいくつかのレイヤーを持っているので、ドメイン オブジェクトごとに 3 つのクラス (User、UserModel、UserEntity) と、ドメイン オブジェクトごとに 1 つのリポジトリ (UserDataRepository) があります。新しい例には、Book、BookModel、BookEntity、および BookDataRepository も含まれます。

また、CRUD のバリエーションを持つユース ケース クラスもあります。

私にとっての問題は、UI/Presenter レベルにあります。プログラムのこの時点で、UserModel オブジェクトと BookModel のリストがあります。userModel.getBooks() がありません。私は userModel.save() を持っていません (これは本の変更もすべて保存します)。

問題を強調するために、この類推を実際のユース ケースにさらに近づけるために、本のすべてのページのリストも用意しました。:) したがって、ユーザーを保存するときは、書籍、および変更された可能性のあるすべての書籍のすべてのページを保存したいと考えています。

これについてどうすればいいですか?

ボーナスの 2 番目の質問: 私の現実の問題では、基本クラスから派生したクラスがあります。上記の類推を使用すると、LeftPage と RightPage は PageBase から派生します。Book にはリストがあります。ただし、LeftPage と RightPage の両方には、別々のリポジトリ、別々のユース ケースなどがあります (しかし、これは機能しません) リストを保存するにはどうすればよいですか?? 別のユースケース SavePages を作成する必要がありますか?

if (pages.elementAt(i) instanceof LeftPage) { SaveLeftPage saveLeft = new..... } else { SaveRightPage saveRight = new..... }

私が見たすべてのドキュメントで、モデルはユースケースを知らないため、ポリモーフィズムを使用できるとは思いません。

お時間をいただきありがとうございます:)

-マイク

4

1 に答える 1

2

それがUncle Bob's Clean Architectureです。Fernando Cejas は Android で簡単な例を作成しましたが、元の概念を読む必要があります。

あなたの問題について、実際にあなたのユースケースは何ですか? ブックとページでユーザーを保存しますか? ユースケースの要件であれば、これを行うことができます。エンティティ User は Books のコレクションを持つことができ、各 Book は Pages のコレクションを持つことができ、 UserRepository はそれぞれを独自のテーブルに解決できる必要があります (または、リポジトリを独自のリポジトリに注入できますが、この場合はすべてを保存またはロールバックできます)

ユーザー参照だけでブックを保存できますか? 本の所有者を識別するプロパティを用意するか、本だけの UseCase に引数で渡します。

      public class SaveBookCase extends UseCase
      {
          public SaveBookCase(IBookRepository repository, Book book, int userId) 
          {
          /// 
          }

          //or

          public SaveBookCase(IBookRepository repository, SaveBookRequest request)
          {
          /// SaveBookRequest is a class that has the book and the user id
          }
      }

2 つ目のおまけの質問については、PageBase のリストしかない場合は、それをユースケースの SavePages に渡す必要があります。これにより、各アイテムが正しいリポジトリに解決されます (この場合、2 つのリポジトリが挿入されます)。

ただし、あなたの例では、左か右かを識別するフィールドを持つ同じデータベース エンティティにすることができ、このシナリオでは 1 つのリポジトリのみを使用します。

于 2015-08-25T17:53:21.763 に答える