2024年04月17日

質問者さん

リポジトリの戻り値と詰め替えについて教えて下さい アプリケーション層とプレゼンテーション層のやり取りにおける値の変換はアプリケーション層の責務であるとの記述がありました。 インフラ層(リポジトリ)とアプリケーション層のやり取りの際にはどこで変換を行うべきでしょうか。 なお、値の変換処理はアプリケーション層にサービスとして書いています。 ①アプリケーション層で行う場合 単純な読み取り処理の場合はインフラ層の戻り値→ドメインオブジェクト→プレゼン層用の形式、と即座に二回変換することになり違和感があります。 ②インフラ層で行う場合 アプリケーション層のサービスをインフラ層が直接呼び出していいものでしょうか。

2024年04月25日

松岡@ログラス/DDD,アジャイル

松岡@ログラス/DDD,アジャイルさん

レイヤー同士の依存関係は、オニオンアーキテクチャがよく整理できるかつシンプルなのでおすすめです。 オニオンアーキテクチャの解説はこちらご覧ください。このレイヤーの前提で話をします。 https://little-hands.hatenablog.com/entry/2018/12/10/ddd-architecture リポジトリは、インターフェイスをドメイン層において、実装クラスをインフラ層に置きます。 リポジトリに入出力するオブジェクトの的周りのことを集約と呼ぶので、リポジトリのメソッドの引数や戻り値は集約のオブジェクトです。 ドメイン層にはインターフェイスしか定義されていませんから、DBの値を取得して集約のインスタンスに詰め替えるのはインフラ層の仕事です。 集約のオブジェクトからユースケース層、プレゼンテーション層の戻り値に変換するのはそれぞれの層の責務です。ユースケースの戻り値をXxxDtoとするなら、そこに詰め替えるのはユースケース層の仕事です。 集約オブジェクトが1つならユースケースから直接返すこともあるかもしれません。 プレゼンテーション層の戻り値のオブジェクトがあるなら、そこに値を詰め替えるのはプレゼンテーション層の責務です。 一方、ユースケース層とプレゼンテーション層でそれぞれ戻り値のオブジェクトがあった場合、集約のオブジェクトから2回も詰め替えないといけないのでしょうか。これは層の責務としてはyesですが、ボイラープレート感ga 若干ありますね。その場合は手を抜くとユースケース層のオブジェクトをプレゼンテーション層でそのまま返してしまうと言う手はあります。一方、これはユースケース層の戻り値がAPIの仕様に影響すると言うことになるので、そこに直接的に影響させたくない場合は急がば回れでユースケース層とプレゼンテーション層に定義すると依存が切れます。

松岡@ログラス/DDD,アジャイルさんに 質問してみましょう!

松岡@ログラス/DDD,アジャイル

松岡@ログラス/DDD,アジャイル

DDDや設計にお困りの方はDMにてご相談ください。講義、モブモデリングやコーディングなどご要望に合わせた進め方でサポートします(オンライン)。 YouTube: https://www.youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw

松岡@ログラス/DDD,アジャイルさんが

最近答えた質問

12月21日

データ量がかなり膨大、かつ正規化され過ぎているため、様々なテーブルとJOINし、様々なwhere句を使っているリポジトリのメソッドがあります。 このリポジトリのメソッドは以下の課題を持っています。 1.集約に関係しないリポジトリからもインターフェイスを介さず、直接呼ばれている 2.クエリが複雑過ぎて保守出来ない(改修した時の影響が見切れない) 性能要件に抵触したため、リファクタリングすることになりました。 まずは単体テストを書いて、想定できるケースは網羅しました。 この後どのようにリファクタリングを進めるべきでしょうか? また、どの程度までリファクタリングするのがコスパが良いでしょうか?

12月21日

書籍でモデリングのオススメとしてユースケース図とドメインモデル図を用いてモデリングする手法を紹介していますが、現在の松岡さんの所属組織や支援組織でもユースケース図とドメインモデル図が基本なのでしょうか?他の手法を選んでいる場合はどういった利点があり別手法を選定しているのか聞いてみたいです。よろしくお願いします。

12月21日

いつもお世話になっております。 生成AIを利用したアプリケーションでプロンプトの扱いに関して質問させてください。 特定フォーマットのデータセットを用意し、セットのプロンプトを生成AIのAPIに渡してサマリーやレポーティングをするようなサービスがあります。 この時に、アプリケーションに組み込むため構造化レスポンスを必ず使うのですが、それに合わせた出力をさせるプロンプト設計を行います。 こういったアプリケーションでプロンプトが1種類しかないためソースコード中にハードコートしようとしているのですが、これの置き場に関していくつか考え方があるように思いまあるように思います。 1. プロンプトはそのままドメイン知識でありビジネス要件とセットの手順書だから、自然言語で書かれたドメインサービスとして扱うべきでは? 2. プロンプトも構造化レスポンスのスキーマもプリミティブ値の延長なのだから、 ValueObjectとして管理してしまってもいいのでは? 3. 特定のユースケースでしか使わないプロンプトなのだからアプリケーションサービスの中に隠蔽してしまってもいいのでは? 4. 生成AIという外部の領域に依存するものだからインフラ層側に書いて、特定の知識のレスポンスを返してくる外部サービスのように見せてしまうのは? といったように幾つも思いつきます。 単純に文章量が多いため、読みやすさの観点でも切り分けて管理したいのですが、どのように考えるのが良いでしょうか? ご意見いただけますと幸いです。