DIとはなにか?
- Dependency Injection の略(依存性の注入)
- プログラミングのデザインパターンの一つ
DIが嬉しいこと
猿でも分かる! Dependency Injection: 依存性の注入 - Qiita で紹介されていた例がわかりやすかったです。
要点を摘むと以下の通り。
- 作った車の動作テストをしたい。
- いろんなテストをしたいので、無限に動くエンジンや摩耗しないタイヤなど商品には使わないけどテスト用に変更したい
- ただ現状は、車のパーツはすべて溶接されてしまっているのでそんな柔軟なことはできない
この時にDIの考え方を入れると「車のパーツを取り外しできるようにして、必要な時に必要なパーツをくっつけられるようにしよう」ということにります。
これをソフトウェアにも当てはめて考えてみましょう。
実際に使ってみる
普通の場合
Car構造体を宣言する際にSuzukiとShellを埋め込んでいるため、あとからWheelやGasを変更するのが難しくなります。(というより実質無理)こうなるとパーツを取り替えてCar構造体の動きを変えたいなあという時に困ります。
DIの場合
一方でこちらの場合はCarDI構造体は車が持つべきcarInterfaceのみが定義されています。そのためCarDIはcarInterfaceを満たす構造体であればなんでも入れることができます。
では、いろんなパーツの組み合わせの車をつくってみたいのでCarTest1~3までを用意してみます。
type CarTest1 struct { Honda Panasonic } type CarTest2 struct { Suzuki Panasonic } type CarTest3 struct { Suzuki Shell }
CarDIを作成する時にどの構造体を突っ込むのか? によって出力を以下のように変えることができていますね!
❯ go run di.go -------DIしてみる------- --Honda / Panasonic-- Wheel : Honda Gas : Panasonic --Suzuki / Panasonic-- Wheel : Suzuki Gas : Panasonic --Suzuki / Shell-- Wheel : Suzuki Gas : Shell
このようにDIの考え方を使うと対象のクラスや構造体を依存関係が少なく管理することができるようになるわけです。