質問: これが絶対に正解!というものはないかもしれませんが、一般的に良いとされる設計がどのようなものか、知りたい次第でございます。煩雑で申し訳ございませんが、よろしくお願いいたします。
回答: とりあえず↓サイトを参考にどうぞ インフラストラクチャの永続レイヤーの設計 DBエンティティ作成クラス/ストレージエンティティ作成クラスの戻り値のエンティティがどういうものを想定しているのかわからないのですが、 以下は作成クラスの処理内容がJSONからDTOへのマッピング、という前提で話をしてます > > API実行、DBエンティティ生成、ストレージエンティティ生成の呼び出し元はどこが良いのでしょう?(呼び出しは依存させた方がよいのか、させない方がよいのか、実行順序が重要な場合は依存させた方が良い・・・?) > > > まず処理の目的はなんなのか分析してみたらどうでしょうか 例えばユーザー(コントローラーを呼び出す側)のやりたいことが、データを取得して後に利用するため保持しておきたいだけならば “API”を用いて取得することや、DBへの登録/ストレージへのバックアップという(どこにどうやって保存するなどの)詳細は関心事ではない というような分析です このような分析なら、データ取得処理の抽象化/永続化処理の抽象化をしてあげるとよいでしょう C#の場合、インターフェースを使うことになるでしょう 例えば、データの永続化処理は別namespaceに分けて、それにはインターフェースを通してアクセスする形式にするなどです テストのモックも作りやすくなりそうですね > > エンティティ生成と登録処理は、同じクラスがよいのでしょうか?(凝集性的には同じクラスが良いと思いますが、単一責任原則的には別の方が良いのかなと。また、エンティティ作成処理は20~30行の処理なので、行数的にも分けた方が良いのかなと) > > > 一般に、単一責任原則を満たすと凝縮度は高くなると言えますから、ちょっと混乱している印象を受けました 以下、単一責任原則の参考にどうぞ 単一責任原則的には、エンティティ登録処理を呼び出す側が単一であれば一クラスにまとめてよいと思います つまり、取得されるJSONの形式が一部異なることがあるとか、JSON以外の形式のデータを取得する場合があるとかで、登録処理にくっついた生成処理の中に分岐を作るような可能性がなければありです ただ、僕個人としてはたぶんマッピング専用クラスを作っちゃいますね データの登録と、JSONからDTOへの変換、を密に結合する必要は大抵の場合ないと思います マッピングクラスは特別な事情がなければstaticなものにします できれば自動生成する仕組みを用意してあげるとよいでしょう > > 各エンティティクラスのinデータはJSONデータがよいのでしょうか?(同じようなJSONデータの取り出し処理をするのは嫌だなぁという感覚です) > > > 括弧内の意味がちょっとよくわからなかったのですが、各エンティティクラスとは、登録するクラスのことですか? その場合、↑で何度か述べていますが、その登録クラスのInputになるデータの形式が将来的にJSON以外もありえるか検討しましょう 僕個人としては、JSONよりもDTOの方が取り回しが良いかと思います また、単体テストの難易度がどうなるか、という観点で考えてみるとよいでしょう 例えば、ローカル環境で実際にテーブルアクセスして登録できたか確かめるテストを作成するとき、InputとしてJSONを作成するのは簡単ですか?また、変更があった時、テストのメンテはしやすいでしょうか? > > リストを保持すべきクラスはどこでしょうか?(コントローラか、エンティティ作成クラスか、Insertクラスか) > > > コネクション/トランザクションの管理をどう行っているのか不明なのであまりはっきりとしたことは言えませんが、 ループでリストを作って、そのリストを別のループで回してInsertするよりは、一つのループ内で済ませてしまうほうが良いかと思います フレームワークの制約などでそのようにできない場合は、 エンティティ作成クラスは単純なMapperであった方がいいと思うので、コントローラか各Insertクラスに持たせてしまうとよいでしょうね コントローラに持たせる場合、普通のローカル変数で、データ取得処理で取得したものをMapperで変換しながらどんどん追加していき、最後にInsertクラスで処理する感じになりますかね あるいは、各InsertクラスにQueueの性質を持たせることも考えられます 単一のDTOを引数にとるputメソッド的なものを持たせて、Insertクラス内のプロパティにどんどん追加していき、最後にInsertメソッドを実行するようなイメージです アーキテクチャ設計(MVCやクリーンアーキテクチャなど)がどうなっているかでもまた変わってきますが、とりあえず以上です