【概念理解】プレゼンターとは何か?
クリーンアーキテクチャを学ぶ際に、最初に戸惑う概念の一つが「プレゼンター(Presenter)」である。
この記事では、プレゼンターの役割や必要性について、常体でわかりやすく説明する。
🔷 プレゼンターとは何者か?
プレゼンターとは、ユースケース(UseCase)の実行結果をユーザーや外部向けに整形して渡す責任を持つ層である。
つまり、ビジネスロジックの結果を「見せる形」に変換する担当だ。
🎯 プレゼンターがいない場合
ユースケースが domain.Node
のような構造体をそのまま返してしまうと、次のような問題が発生する:
- ドメインロジックと表示形式が密結合になる
- 複数の出力形式(HTML / JSON / CLIなど)に対応しづらくなる
- 出力形式が変わるたびにユースケース側の修正が必要になる
✅ プレゼンターの利点
プレゼンターを導入することで、以下のような利点が得られる:
項目 | 内容 |
---|---|
分離 | ロジックと表示の責務を明確に分けられる |
柔軟性 | 出力形式(JSON、HTMLなど)を柔軟に変更できる |
テスト性 | 出力部分だけに注目したテストが可能になる |
再利用性 | 同じユースケースを、複数の出力方法で再利用できる |
🧱 実装イメージ
プレゼンターのインターフェース(usecase 層)
type CreateNodePresenter interface {
Output(domain.Node) CreateNodeOutput
}
プレゼンターの実装(adapter 層など)
type jsonCreateNodePresenter struct{}
func (p jsonCreateNodePresenter) Output(n domain.Node) CreateNodeOutput {
return CreateNodeOutput{
ID: string(n.ID()),
Question: n.Question(),
Answer: n.Answer(),
URLs: n.URLs(),
Next: toStringList(n.Next()),
}
}
ユースケースでの利用
createdNode, err := repo.Create(ctx, node)
return presenter.Output(createdNode), nil
🌐 アーキテクチャ内での立ち位置
[Controller] → [UseCase] → [Presenter] → [View or API]
↑
ドメインモデル
- UseCase:ビジネスロジックを実行する層
- Presenter:結果を整えて外部に渡す層
- View / API:ユーザーが見る最終出力
🧭 まとめ
項目 | 内容 |
---|---|
プレゼンターの役割 | ユースケースの出力を「見せる形式」に整える |
メリット | 表示の柔軟性、責務の分離、テスト性の向上など |
実装のポイント | ユースケースの出力をラップするだけの軽い責務に留める |
💬 補足
「ユースケースは“何をしたか”を返す。プレゼンターは“どう見せるか”を考える」
この考え方を頭に入れておくと、責務の切り分けがうまくいく。