Delphiとか依存性注入とか
これはDelphi Advent Calendar 2012参加記事です。
他の言語でDIコンテナ(依存性注入の方)を使用していて、ふと気づいたDI(依存性逆転の方)ついて、つらつらと。
普段会社では、いまだにDelphi 7をWindows7のXP Mode上で使ってる身です(主に保守ですが)。なのでDelphi 7 の話です(以降のバージョンは未経験)。
何も考えず、フォームやコンポーネントをプロジェクトに加えていくと、プロジェクトファイルである.dpr
にてインスタンス化されます。
Form1やDataModule2はそれぞれのソースファイルで宣言されたグローバル変数で、コンポーネントのインスタンスが初期化されてます。
よく言われる一般論として、
- スコープを小さくするかが重要
- -> グローバル変数もってのほか
- ムダなオブジェクトは作らない
- -> 起動時にインスタンス化とか頭沸いてる
そのため私はよくこれらのグローバル変数の宣言を削除し、使う直前でインスタンス化するように変更したりしてます。 ところで、このグローバル変数に起動時に突っ込む挙動、見方を変えると面白い側面が見えてきます。
実際に使用する時点で、確実に初期化が完了しており、インスタンスが決定されている。 別の言い方で、依存が解決されているともいえる。
オブジェクトを生成する場合、1クラスだけで終わることは稀で、たいていは複数クラスが絡み合う。 それらはコンストラクタやメソッドの引数、プロパティでセットされるでしょう。 クラス継承が絡むと、組み合わせはさらに増大。
使う側(フォーム等)で
- 自身でインスタンス化する場合
- 具体的なクラス構成をすべて理解しておく必要あり
- でないとインスタンスを作れないから
- 初期化済み
- 内側の具体的な内容が隠される(ように見える)
その結果、フォームやコンポーネント
- 独立性が高まる(ように見える)
- より再利用可能になる(ように見える)
使う人が、使う時点でなく他に任せて、依存を解決。 目を細めてみれば、依存が逆転しているように捉えている気がする今日この頃。