簡単なタスク管理アプリケーションを想定して、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
コメント