Delphiとか依存性注入とか

これはDelphi Advent Calendar 2012参加記事です。

他の言語でDIコンテナ(依存性注入の方)を使用していて、ふと気づいたDI(依存性逆転の方)ついて、つらつらと。


普段会社では、いまだにDelphi 7をWindows7のXP Mode上で使ってる身です(主に保守ですが)。なのでDelphi 7 の話です(以降のバージョンは未経験)。

何も考えず、フォームやコンポーネントをプロジェクトに加えていくと、プロジェクトファイルである.dprにてインスタンス化されます。

Form1やDataModule2はそれぞれのソースファイルで宣言されたグローバル変数で、コンポーネントのインスタンスが初期化されてます。

よく言われる一般論として、

  • スコープを小さくするかが重要
    • -> グローバル変数もってのほか
  • ムダなオブジェクトは作らない
    • -> 起動時にインスタンス化とか頭沸いてる

そのため私はよくこれらのグローバル変数の宣言を削除し、使う直前でインスタンス化するように変更したりしてます。 ところで、このグローバル変数に起動時に突っ込む挙動、見方を変えると面白い側面が見えてきます。

実際に使用する時点で、確実に初期化が完了しており、インスタンスが決定されている。 別の言い方で、依存が解決されているともいえる。

オブジェクトを生成する場合、1クラスだけで終わることは稀で、たいていは複数クラスが絡み合う。 それらはコンストラクタやメソッドの引数、プロパティでセットされるでしょう。 クラス継承が絡むと、組み合わせはさらに増大。

使う側(フォーム等)で

  • 自身でインスタンス化する場合
    • 具体的なクラス構成をすべて理解しておく必要あり
    • でないとインスタンスを作れないから
  • 初期化済み
    • 内側の具体的な内容が隠される(ように見える)

その結果、フォームやコンポーネント

  • 独立性が高まる(ように見える)
  • より再利用可能になる(ように見える)

使う人が、使う時点でなく他に任せて、依存を解決。 目を細めてみれば、依存が逆転しているように捉えている気がする今日この頃。