DI コンテナの起動が遅いなら、起動が速いのを作ればいいじゃない

自分で書いたコメントなんだけど、今見るといいこと書いてあるように思うので、エントリにしてみる。3行でまとめると:

  • Spring の起動が遅いことと、DI コンテナの起動が遅い/速いというのは、別の話。
  • DI コンテナの起動が遅いなら、起動の速い DI コンテナを作ればいいだけであり、あれだけ推していたものを起動の遅さを理由に使わないのはおかしい。
  • DI の有用性は、App Engine に関係しない。App Engine で必要ないなら一般のアプリでも必要ないはず (でもそうじゃないよね)。

> DIを使うとspin-upが遅くなってしまうから使わない方が良いみたいです。Springとかはそれでかなり苦労してるらしいです。

うーん、どうでしょう?
「Spring の起動が遅い」ことと「DI コンテナの起動が遅い」ことは別の話ですよね?spin up time が問題なら起動の速い DI コンテナを作ればいいのであって、DI コンテナを捨てるのは間違った選択じゃないでしょうか。従来の DI コンテナが起動時にすべてのクラスをロードするようなアーキテクチャだから起動が遅いのだと推測しますが、だったらロードを遅延させるような DI コンテナを作ればいいだけの話です (ひがさんの実力なら難しいことでもないでしょう)。
少なくともあれだけ「DI はスバラシイ」と主張していた陣営が、こんなことを理由にあっさりと DI コンテナを捨てるというのは、なんというか不自然さを感じます。

> おそらくひがさんは、DIを使うメリットがなくて、それよりもデメリットの方が大きくなる(spin upの時間はとても大切)から「複雑になるだけ」という言い回しになったんじゃないかーと思います。

DI コンテナ導入の具体的なデメリットが spin up time のことしか言及されてないのですが、仮にデメリットがその点だとしても、それを「複雑になる」という表現はしないと思います。だから spin up time の問題とは別に、DI コンテナの導入が「複雑」だと表現したのだと思います。

> 実際使ってみるとappengine上でDIが必要になったケースは(自分で使ってる限りでは)ないですね。

なぜ App Engine だと DI コンテナを必要としないのか、その理由はぜひ知りたいですね。ひがさんが述べているように、テストのしやすさとトランザクションまわりが他の手段で代替できるからというのが理由なら、別に App Engine に限った話じゃないと思います。

まつもとさんも「DI コンテナは必要ない」と主張しているんですけど、それは Ruby のような動的な言語に限定した話であって、Java のような融通の利かない言語では DI なり AOP なりで柔軟性を持たせる必要があると思います。App Engine に関係なく。

2010-04-20 - kなんとかの日記

#しかしそこまでして Java にこだわるかね。spin up time でさんざん苦労するなら、Python 覚えた方がはやくね?