メインコンテンツまでスキップ
バージョン: 1.0.0

Entity ・ Value Object ・ DTO

Entity

  • 複数のValue Objectで構成
  • 複数のValue Objectに関する簡単なロジックを定義
    • 50行以上の場合は、Domain Serviceとして外だししてよい

Value Object

  • Stringやint等のprimitive型を使用せず、独自に定義したクラス型
    • バリデーション定義
    • 自身のValue Objectのみに関係するロジック
      • 他のValue Objectを含む配列のValue Object等は例外
        • RotationMembersは、RotationMemberを含む配列のValue Objectのため、RotationMemberに関係するロジックも定義してOK

DTO

  • Stringやint等のprimitive型で構成
  • Method等のロジックは持たず、値のみ保持
注意

EntityはInfrastructureやPresentationで利用しないべきです
理由としては、独自の技術などの利益となるロジックがEntityに定義されているため、それがUIで利用されることは、誰でも知ることができビジネスロジックの流出となるからです
DTOにロジックの結果だけを含めてUIに渡すことが大切です

備考

本アプリにはBackendが存在しなくFrontendにビジネスロジックを記載しているため、実際はビジネスロジックが流出していることになります...

Extention Type と Freezed の使い分け

機能Extention TypeFreezed
実装方法単一フィールドをラップ任意個数フィールドの新クラス生成
値比較Stringやint等のみListやMapも比較可能
JSONシリアライズ手動実装自動生成
不変オブジェクト化Stringやint等のみListやMapも不変
パフォーマンス
用途どちらを使用すべきか理由
EntityFreezed複数のValue Objectで構成されるため
Value Object
(Stringやint)
Extention Type単一値で不変のため
Value Object
(ListやMap)
Freezed単一値だが不変でないため
DTOFreezed複数のprimitive型で構成されるため

Mapper (Entity と DTO の変換処理)

現在は、以下のようにViewModelやDTOのみで簡潔していますが、EntityとDTOの変換を担当するMapperクラスを定義したいところです

  • ViewModelとRepository2層での処理 (以下はViewModelでの例)
    • DTOからEntityへの変換
      • EntityでValue ObjectをもとにEntityを作成するFactory Methodを定義
      • DTOにtoEntity Methodを定義
        • primitive型をValue Objectに変換
        • Factory Methodを呼び出して変換
      • toEntityをViewModelで呼び出す
    • EntityからDTOへの変換
      • DTOに表示用のフィールドを定義
      • EntityまたはValue Objectで表示用(primitive型)に変換するMethodを定義
      • ViewModelでEntityやValue ObjectのMethodを実行し、primitive型を取得してDTOに格納