Ruby on Railsでドメイン駆動設計(DDD)を実装するサンプルコード

Ruby

簡単なタスク管理アプリケーションを想定して、Ruby on Railsでドメイン駆動設計(DDD)を実装するサンプルコードを紹介します。

ディレクトリ構造

app/
  domain/
    entities/
      task.rb
    value_objects/
      task_status.rb
    repositories/
      task_repository.rb
  application/
    tasks/
      create_task_service.rb
  infrastructure/
    active_record_repositories/
      active_record_task_repository.rb

エンティティ

class Task
  attr_reader :id, :title, :status

  def initialize(id:, title:, status:)
    @id = id
    @title = title
    @status = status
  end

  def change_status(new_status)
    @status = new_status
  end
end

値オブジェクト

class TaskStatus
  OPEN = "open"
  COMPLETED = "completed"

  def self.valid?(status)
    [OPEN, COMPLETED].include?(status)
  end
end

リポジトリインターフェイス

module TaskRepository
  def find(id)
    raise NotImplementedError
  end

  def save(task)
    raise NotImplementedError
  end
end

アプリケーション層

サービス

class CreateTaskService
  def initialize(task_repository)
    @task_repository = task_repository
  end

  def create_task(title, status)
    task = Task.new(id: nil, title: title, status: status)
    @task_repository.save(task)
  end
end

インフラストラクチャ層

ActiveRecordリポジトリ

class ActiveRecordTaskRepository
  include TaskRepository

  def find(id)
    task_record = TaskRecord.find(id)
    Task.new(id: task_record.id, title: task_record.title, status: task_record.status)
  end

  def save(task)
    task_record = TaskRecord.new(id: task.id, title: task.title, status: task.status)
    task_record.save
  end
end

コメント

タイトルとURLをコピーしました