放課後プログラミング

調べたことや考えたことなどを忘れないために書きます。

パッケージ構成の考え方

この記事を読みました。
http://edmundkirwan.com/general/radial2.html

いわく

The more dependencies that can potentially form between packages, the greater the tendency that those dependencies will actually form, solidifying your package structure into a rigid creaking nightmare with ripple-effects up the wazoo.

意訳:クラス間の依存しうるパターンが増えれば増えるほど、実際にそれらはより依存する形で使われることになり、各パッケージの再利用性は落ちる。

「じゃあどうすればいいか?」が以降の文章で語られているが、簡単に言ってしまえばパッケージへのアクセスを制限すればよいとのこと。

実現方法は?

それを実現する一つの形は、完全修飾名の親に当たるパッケージにしか依存されないように制限すること。つまりcom.example.hogeパッケージに依存してよいのはcomパッケージとcom.exampleパッケージのみ。com.example.hogeパッケージはcom.example.piyoパッケージに依存されて(して)はいけない。

ではcom.example.hogeパッケージのクラスがcom.example.piyoパッケージのクラスに依存されるような設計になってしまった場合はどうすればよいか。
このようなときは、com.exampleパッケージでhogepiyoのクラスを用いた部分のロジックを実装すれば解決する。

デメリット?

記事では言及されていないけれど、たとえばそのプロダクトで扱われる例外をenumで定義していた時に、上記に習う場合はそれを上位パッケージ内でまとめて書くのではなく、それぞれの例外が発生するパッケージ内で定義していくことになる。このような設計にするとプロダクトの見通しを悪くしそうに思えなくもない。
また、javaには同じパッケージとその上位パッケージにのみアクセス権限を与える修飾子はないので、コード上でこれらの制限を表現することができない。そのためコードレビューで「このクラスはこの場所からは使わないで下さい」といちいち指摘しなくてはいけないことになる。