質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

Q&A

0回答

679閲覧

ドメイン駆動設計の値オブジェクトのバリデーションはどこで処理すべきかで悩んでます。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

0グッド

2クリップ

投稿2022/11/01 18:48

編集2022/11/01 22:50

ドメイン駆動設計の値オブジェクトの作成時のバリデーションを
AppConfig.jsonから読み込んだ値を使用して評価処理を行う
仕様クラスを作成して実現しようと考えているのですが
その評価処理はどこで行うべきかで悩んでます。

具体的には下記のように名前属性のみ持つ値オブジェクトがあり、

c#

1public Class Person 2{ 3 public string Name { get; } 4 5 public Person(string name) 6 { 7 Name = name; 8 } 9}

その名前属性の最大文字数をAppConfig.json内から取得するためのクラスのインターフェースがあり、

c#

1public interface IAppConfigJsonReader 2{ 3 int PersonMaxNameLength { get; } 4}

上記のインターフェースを使用して下記のような名前の文字数の仕様クラスを作成しました。

c#

1public class PersonNameLengthSpecification 2{ 3 private IAppConfigJsonReader _configReader; 4 5 public PersonNameLengthSpecification(IAppConfigJsonReader configReader) 6 { 7 _configReader = configReader; 8 } 9 10 public bool IsSatisfiedBy(Person person) 11 { 12 var name = person.Name; 13 var length = name.Length; 14 var maxLength = _configReader.PersonMaxNameLength; 15 return length <= maxLength; 16 } 17}

しかしこの仕様クラスを使って実際にIsSatisfiedByメソッドで
バリデーションを行う場所はどこがよいのでしょうか?

候補としては3つありますがそれぞれデメリットがあります。

  1. アプリケーションサービスのユースケース内でファクトリーかnew演算子を用いてPersonを生成した直後に判定
  2. ファクトリー内で判定処理を組みアプリケーションサービスのユースケース内でそのファクトリを使用してPersonを生成
  3. 値オブジェクトのコンストラクタ内で判定

候補1では判定の判定処理の漏れが発生しそうな気がします。
候補2ではコンストラクタインジェクションが複雑化してしまいます。
候補3ではコンストラクタの引数にIAppConfigJsonReaderを含める必要ができてしまいます。

ほかにももっと良い方法があるのなら教えていただきたいです。

どうかよろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/11/02 00:23

> 候補2ではコンストラクタインジェクションが複雑化してしまいます。 そうですか? どのみちそのコードがどこかに入るなら複雑度は変わらないのでは? 私なら Person 専用のバリデータを作るのではなく、バリデートすべき仕様を ValidationAttribute から派生した属性として Person もしくはそのプロパティに与え、汎用バリデータを使用します。 例えば次のようなものです。 https://learn.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.stringlengthattribute?view=net-6.0
退会済みユーザー

退会済みユーザー

2022/11/02 02:32 編集

「ドメイン駆動設計の値オブジェクト」とかは全く知らないのでハズレかもしれませんが・・・ どういうアプリで、何を、どういうタイミングで検証して、その結果で何がしたいのかによって「その評価処理はどこで行うべきか」は変わってくる、すなわち適材適所的なやり方があると思いますけど。 例えば(あくまで例えばですが)、Web アプリでユーザー入力の検証を行う場合、クライアント側で JavaScript による検証と、サーバー側での検証の両方を実装するのが普通ですが、「候補としては3つあります」の 3 つはどれも、特にクライアント側でのユーザー入力の検証には、不適切です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問