golang-ddd-architecture について
Go サービスをドメイン駆動設計で構成するワークフロー型スキルです。業務ロジックの増加に応じて、レイヤー、依存方向、モデル境界、配線、テストを整理できます。
主な機能
- 01エントリーポイントとユースケースの整理
- 02ports、app、domain、adapters の分割
- 03内向きの依存ルールの設定
- 04利用側に置く小さなインターフェース
- 05境界ごとのモデル分離
- 06テスト可能な配線とリファクタリング計画
活用シーン
- 01業務ロジックが増えたハンドラーの再構成
- 02循環インポートや複雑な依存の解消
- 03API、DB、ドメインモデルの分離
- 04ドメイン、アプリ、アダプターのテスト計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ joeyave/ golang-ddd-skills --skill golang-ddd-architectureインストール後、Claude Code で/golang-ddd-architectureを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/architecture-rules.mdnaming-and-models.md詳細
Go の DDD アーキテクチャ
このスキルを使って Go サービスを設計し、ビジネスロジックの拡大に伴っても変更、テスト、理解がしやすい状態を保ちます。
まず確認すること
- このパターンを採用するだけの複雑さがサービスにあるか確認します。
- 単純な CRUD や認証のフローで、読み取りと書き込みのデータ形状がほぼ同じであり、ビジネスルールも少ない場合は、設計を小さく保ちます。
- ハンドラーの
if文が増え続けている、モデルが複数の境界で再利用されている、依存関係のモック作成や整理が難しい場合は、ワークフロー全体を適用します。
ワークフロー
- エントリーポイントとユースケースを洗い出します。
- HTTP ハンドラー、gRPC サービス、CLI コマンド、メッセージコンシューマー、スケジュール済みジョブから始めます。
- コードを移動する前に、サポートする操作をビジネス上の表現に書き換えます。
- 境界マップを作成します。
portsはインバウンドのトランスポートとシリアライズのみを担当します。appはユースケースをオーケストレーションします。domainはビジネスルールと不変条件を管理します。adaptersはデータベース、キュー、外部 API、ファイル、その他のインフラストラクチャとやり取りします。
- 依存関係の方向を徹底します。
domainは自身の外部に依存しません。appはdomainをインポートできますが、具体的なトランスポートやアダプターのパッケージはインポートしません。portsとadaptersは内側のレイヤーをインポートできます。- インポート循環は、すべてを単一のパッケージに平坦化するのではなく、インターフェースを内側に移動するか、責任を分割して解消します。
- インターフェースを利用側の近くに配置します。
- 振る舞いを必要とするパッケージ内にインターフェースを定義します。
- インターフェースは小さく、ユースケース指向に保ちます。
- コンポジションルートから実装を注入します。
- 変更理由が異なるモデルは分離します。
- 変更頻度が本当に同じでない限り、DB の行、API レスポンス、Pub/Sub のペイロード、ドメインの状態に同じ構造体を再利用しません。
- 結合を取り除けるなら、データの重複を許容します。DRY は通常、データより振る舞いに対して価値があります。
mainはシンプルに保ちます。
mainをコンポジションルートとして使います。- リポジトリ、クライアント、ハンドラー、設定をそこで組み立てます。
- ビジネスロジック、バリデーション、ワークフローの分岐をそこに隠しません。
- コードベースを、着手前よりテストしやすい状態にします。
- ドメインルールはモックなしで単体テストできるようにします。
- アプリケーションのオーケストレーションは、小さな手書きのモックでテストできるようにします。
- アダプターの振る舞いはインテグレーションテストでカバーします。
これらのリファレンスを参照する
- レイヤーのルール、パッケージ構成、アンチパターンについては、references/architecture-rules.md を読みます。
- 命名、モデルの境界、共有構造体のトレードオフが課題となる場合は、references/naming-and-models.md を読みます。
成果物
- 明確なレイヤーマップまたはパッケージ計画
- インポート循環を回避するためのハックなしにコンパイルできる依存関係の方向
- コンポジションルートでのコンストラクターまたは組み立てポイント
- 明示的なモデル境界
- 一度の作業でシステムの絡まりを解消できない場合の、後続リファクタリングの短いバックログ
コメント
Markdown 対応