Skip to content

ドメインをパッケージにするといいかも

Goのパッケージ名は簡潔で明瞭な名前が好まれる。

ドメイン駆動設計やクリーンアーキテクチャの文脈では

  • domain
  • model
  • usecase
  • repository

のように分類ごとにパッケージが切られてしまう傾向があるけれど、上記のブログ記事によれば

全APIを単一パッケージにしない 多くの善意なプログラマは、コードベースの中でエントリーポイントを見つけやすいように 公開するすべてのインターフェースを apitypesinterfaces といった名前の単一のパッケージに まとめています。これは間違いです。そのようなパッケージは utilcommon というパッケージ名で 起きた問題と同じ問題に悩むことになります。つまり境界がどんどん大きくなり、ユーザにわかりにくく、 依存が強くなり、他のインポートしたパッケージと名前がぶつかるといった問題です。

とあって、これに当てはまっていると思う。

Goと設計とDDDにもあるが、レイヤー(層)が存在するのは分かるし概念としては必要だけど、それがそのままパッケージとして表出するとかえって面倒になる。具体的にはGoではパッケージ単位でカプセル化を行うが、レイヤー単位でパッケージを切ると全て同じパッケージに入ってしまうので、関係のない領域のプライベートな型や関数が見えてしまう。

それよりは、レイヤーはディレクトリとして存在するが、ドメインは個別のパッケージに分割する方が自然なのではないか。

  • internal/domain/billing (請求)
  • internal/domain/invoice (領収書)