DIの書き方を迷い中

| Comments

僕の会社ではjavaで大規模プロジェクトを開発しているため、DIはよく語られる技術です。

しかし、コードを書いていて無駄にややこしくなっている気がしています。

コードを読んでいて、どこに飛ぶかわかりにくい

Controllerから順番に処理を見ていっても、Interfaceのところまでしか見れずに、EclipceなどでジャンプしてもInterfaceを見に行ってしまう。

それがDIされてる実装クラスがどこにあるかを見ようと思ったら、DI部分のコードを読むか、○○Implなどでgrepかけるカンジになってしまう。

不必要そうなコードが並んでる。

これに関してはDIというよりウチの記述の話なのですが。

例えば、あとでDIしようと思っての設計だと思うんですが、Controllerからサービスを呼びたいときに、

1
2
HogeService service = new HogeService(new DaoImple(new HogeDaoImpl));
Moke moke = service.findById(mokeId);

みたいなことをウチのプロジェクトではしているんですが、まぁわかりにくい。。。

これなら、コンストラクタの引数にnewで打ち込むのではなくて、各コンストラクタで

1
2
3
public HogeService{
	this.dao = new DaoImpl();
}

とかってしておいて、

1
2
HogeService service = new HogeService();
Moke moke = service.findById(mokeId);

の方が見やすいし依存関係も見やすくと思うんですけどどうなんでしょうか?

(というか、さっさとDI部分を作るなり、どうせDIしないなら全てStatelessにしてしまえばいいのでは?と思ってるんですが。)

ライブラリなどの挙動が、実行時でないとわからない。

例えば今はplayでGuiceを使ってるんですが、なぜか2.0と3.0が混在していました。 (これはただの、先人の負の遺産です)

で、play-moduleで対応しているのが2.0なので、全部2.0に統一してしまおうと思っているのですが、なんか実行時エラーが出ます。

仕方ないのでデバッガで見ていくと、どうやら3.0から2.0に直したコードの一部で、DIがされていなかったようです。

(原因はおおよそ見当はついていますが、詳細は後日書きます。)

DIに関しては、普通はxmlやアノテーションで書かれるため、コンパイル時に怪しいかどうかの判断ができません。 実行して初めて「クラスが見つからない」「型が合わない」などの問題が出てきます (しかもログを読んでも、一見関係ないところがバグってるように見えたりして、原因がわかりにくかったりする。)

Comments