Help us understand the problem. What is going on with this article?

初学者がDDD(ドメイン駆動設計)勉強中に気になっていること

はじめに

初投稿です。
次のプロジェクトで「DDD(ドメイン駆動設計,Domain-driven design)でやっていこう!!」となり、現在勉強中の初学者です。
DDD勉強中に気になっている箇所を自分用に整理しようと考え投稿しました。謎が解け次第更新予定です!!
※あわよくば、DDD有識者に意見や回答を頂けると大変ありがたいです、何卒宜しくおねがいしますm(_ _)m

値オブジェクト

自分の理解

値【名前(string)や誕生日(datetime)...】に専用クラスを割り振る事で、意味や処理を持たせる。※可読性の向上
また、値を不変とすることで(更新は再代入)、知らないうちに値が変わるというのを防げるらしい。
※知らないうちに値が変わる経験をした事がないので、メリットが良く分からない......
 あと、再代入なら問題無いというのも良く分かっていないので調べる...

気になっている箇所

サンプルソースを例に気になっている箇所を記載(Qiita上で書いて、試してないので動かないかも)

  • 1. 下記①と比較して、インスタンス生成回数が単純に倍以上になっていく気がするがそういうものなのか?
    (インスタンス生成は重い処理だと思っていたので、気にしてるが気にしなくてもいいのかも?)
  • 2. 下記②にて、getFullNameは、2重で呼ぶのが正しいのか?
  • 3. 下記②にて、getFullNameの改修がある場合、修正が楽になってるのか...?
  • 4. 下記②にて、setFullNameが必要な場合はどうすればいいのか?
  • 5. 記述量が単純に増える気がするがなにか対策(ツールの自動生成など)はあるのか?
①値オブジェクト使わないケース
class User{
  String firstName;
  String lastName;
  public User(String f, String l){
    setFullName(f,l);
  }
  public String getFullName(){
    return LastName + " "+ FirstName;    
  }

  public void setFullName(String f, String l){
    if(無効文字チェック(f,l)) // 何かしらの例外処理
    firstName = f;
    lastName = l;
  }
}
②値オブジェクトのケース
Class User{
  FullName name;
  public User(String f, String l){
    setFullName(f,l);
  }

  public String getFullName() {
     // 2.本当にこの書き方であってるのだろうか?
     return name.getFullName();
  }

  public void setFullName(String f, String l) {
    // 4. この書き方だと使わないケースと全く変わらないので、多分間違ってる...
    // 1. インスタンス生成処理は重くないのだろうか?
    name = new FullName(f,l);  
  }
}

class FullName {
  private String firstName;
  private String lastName;

  public FullName(String f,String l){
    if(無効文字チェック(f,l)) // 何かしらの例外処理
    firstName = f;
    lastName = l;
  }

  public String getFullName(){
    // 3. 仮にMiddleNameが増えた場合はここだけ修正すばいいことになる!!
    // →使わないケースでも同じような...?
    return lastName + " "+ firstName;
  }
}

  • 6. どの粒度で作成するべきなのか?
    例えば、Userテーブル「ID,FIRST_NAME,LAST_NAME,BIRTHDAY,DESCRIPTION」があるとして
③Userテーブル
class User{
UserId id; // 特にルールがなくてもやるべき?
FullName name; // FirstNameとLastNameのORマッパーが少し面倒だがそれでもやる価値があるのか?
BirthDay birthDay; // getAge(),getDay()的なのを内包するべきなのか?
Description description; // 文字数制限がある場合は作る?
                         // ない場合はStringでOKなのか?
                         // →後から設定されることを事前に考慮して値Objetにするべきなのか?
}
  • 7. jsonパースが変わるがどうしよう?
①のケース
{
  "User":{
    "firstName":"hoge", 
    "lastName":"fuga"
  }
}
②のケース
{
  "User":{
    "FullName":{
      "firstName":"hoge", 
      "lastName":"fuga"
    }
  }
}

サービス

まとめ中...

集約

まとめ中...

ディレクトリ構成

まとめ中...

アーキテクチャ

まとめ中...

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away