1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【sbt】サブプロジェクトによる依存関係の強制を有効活用しよう!

1
Last updated at Posted at 2019-09-08

問題

中・大規模なアプリケーションでクラスの集合レベルでアクセス方向を強制したい(MVC, MVVM, MVPやDDDのレイヤー化アーキテクチャ, cleanアーキテクチャ)が privateprotected などのアクセス修飾子ではアーキテクチャの原則が解りづらい。
また解りづらいことによりチームメンバーがアクセス修飾子を間違えたりつけ忘れることがある。

回答

sbtのマルチプロジェクト機能を使いましょう1

sbt Reference Manual — マルチプロジェクト・ビルド

マルチプロジェクト機能によりソースコードをサブプロジェクトごとに分割してサブプロジェクト間で依存関係を宣言することにより、クラスの依存関係を一方向へ限定できます。
また、修飾子ではなくソースコードの配置場所レベルで依存関係が強制されるため、他のメンバーや新規メンバーが修飾子を間違えたり依存関係の原則を破ってしまうような恐れもありません。

このテクニックは各レイヤー間の依存関係を強制したいDDDやclean architectureで特に有効活用されます2

例: Spring Bootアプリケーションをmavenのmulti moduleで構成する - Qiita

蛇足

Scalaではアクセス修飾子でアクセスを許可するパッケージを指定できます。またそのパッケージは自身を含むものでなくてはいけません(=つまり祖先パッケージのどれかである必要がある)。
一方サブプロジェクトを使用すると、パッケージと関係なくアクセス方向(= 依存関係)を制御できます。
つまり、これらの依存関係の制御は相補的です。サブプロジェクトで大枠を定めてアクセス修飾子で細かい調整を行うと僕は最初誤解していたのですが、サブプロジェクトとアクセス修飾子にはそれぞれできることが違います。
うまく使えば非常に便利ですが、一方で過剰にややこしくもなりやすいため注意して使いましょう。

  1. mavenではmoduleに当たる、らしいです

  2. このような強い強制力を持つ仕組みを用いなければ、理解の深くないメンバーが容易にレイヤー間のアクセス方向の原則を破ってしまうためです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?