Skip to content

discussion: Application層のInput DTOにおけるプリミティブ型 vs ドメイン型 #89

@KinjiKawaguchi

Description

@KinjiKawaguchi

背景

PR #87 (StudentId実装) にて、RegisterMemberInput.studentIdstring のままにするか StudentId 型にするかの議論が発生。

現在のコードベースでは、ユースケースのInputはプリミティブ型を受け取り、ユースケース内でドメイン型に変換している:

// 現状: RegisterMemberInput
studentId: string;
department: string;
email: string;

// ユースケース内で変換
StudentId.fromString(input.studentId)
Department.fromString(input.department)
new UniversityEmail(input.email)

論点

RegisterMemberInput 等のInput DTOは何層に属するか?

  • CQRSのCommand(境界のDTO) として見るなら、プリミティブ型が妥当

    • Commandはシリアライズ可能であるべき
    • 外部からの意図を表現するデータ構造
    • プリミティブ→ドメイン型の変換はCommand Handler内で行う
  • Application層の内部契約 として見るなら、ドメイン型も選択肢に入る

    • Application層はドメインの語彙で会話する
    • プリミティブ→ドメイン型の変換はInterface/Adapter層の責務
    • 型安全性が高まる

このプロジェクト固有の文脈

  • @shizuoka-its/core はnpmパッケージとして公開されている
  • Executableは余暇のTSコードから直接呼ぶインターフェースを想定
  • 現状、明示的なInterface/Adapter層は存在しない(ユースケースが公開APIを兼ねている)

決定すべきこと

  1. Input DTOの層的な位置づけ(境界DTO vs Application層内部契約)
  2. 上記を踏まえた型の方針(プリミティブ vs ドメイン型)
  3. 方針変更する場合、全Input DTOに一貫して適用する

参考

  • Eric Evans: Application ServiceはDTOとドメインオブジェクトの変換を担う
  • Vaughn Vernon (IDDD): Commandはシンプルなデータコンテナ
  • Robert C. Martin (Clean Architecture): 境界を越えるデータはシンプルなデータ構造であるべき
  • Vladimir Khorikov: Commandにはプリミティブのみ、変換はHandler内で

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions