なにげなDIの効用

現在の仕事だが最も時間を割いているのは去年から書いてきたスマクラ用フレームワーク用のクラスを全てDIコンテナを使うことをベースに書換る作業だ。結構大がかりになっている。
DI(Dependency Injection)コンテナを使うメリットは散々いろいろな所で既出なので今さら書かないが一般的に書かれている以外にもいろいろと面白い効果がある。
例えばJavaでもC#でも良いが少し前のクラスの実装コードには以下のようなイディオムがたくさん見られていたはずだ。

public class SingletonClass {
    private static SingletonClass instance = new SingletonClass();
    public static SingletonClass GetInstance() {
        return instance;
    }
    private SingletonClass() {
    }
    〜
}

静的なinstanceフィールドを何時インスタンス化するかはクラスの目的や構造で変わるがこれは一見してSingleton(一枚札)パターンを実装する時の典型的なイディオムだ。
Singletonの一番大きな目的はあるオブジェクトのインスタンスの数を厳密に管理すること(その名前からして大抵は一つ)だがDIコンテナがベースの世界ではオブジェクトのインスタンスの数を管理することの一部はDIコンテナがやってくれる。例えばSesar2であればコンポーネントインスタンスの生成数をdiconにより制御出来、"singleton"(只一つ)や"prototype"(毎回生成)のようにプログラムの外から制御が可能である。
このようにDIコンテナは登録されるコンポーネント(オブジェクト)のインスタンス数を管理することができるのでSingletonパターンのイディオムは不要になる。実際今まで書いていたクラスにはかなりの数のSingletonパターンのイディオムが埋めこまれているのだがDIコンテナベースで作るのを前提にしてから必要の無いケースは全て削除してしまった。これだけでもクラス構造は凄くすっきりする。